-- Chuchu by Makaron -- The main game screen of Chuchu Boipus = require('deps.boipushy') Physics = require('deps.physics') -- my own libs crates = require('crate') utils = require('utils') GRAVITY = 512 PLAN_SIZE = { marginX = 120, marginY = 120, w = 512, h = 512 } local player = { maxSpeed = { x = 100, y = 100 }, magSpeed = 2 } local movingStuff local movingStuffHeight local movingSutffWidth local magnet = { collider = nil, size = { width = nil, height = nil } } local stuffToMagnetJoint local joint = { min = 50, max = 250 } local velocity = {0, 0} local current = { } local Chu = {} function Chu.new(x, y, debug) obj = {} obj.x = x obj.y = y if debug == nil then debug = false end obj.debug = debug world = Physics(0, GRAVITY) world:addClass('Player') world:addClass('GamePlan') world:addClass('Crate') world:addClass('Pier') world:addClass('Crane') obj.gamePlan = world:addChain(true, { x - PLAN_SIZE.marginX, y - PLAN_SIZE.marginY, x + PLAN_SIZE.w + PLAN_SIZE.marginX, y - PLAN_SIZE.marginY, x + PLAN_SIZE.w + PLAN_SIZE.marginX, y + PLAN_SIZE.h + PLAN_SIZE.marginY, x - PLAN_SIZE.marginX, y + PLAN_SIZE.h + PLAN_SIZE.marginY }):setClass('GamePlan') local pierWidth, pierHeight = assets.sprites.level.pier:getWidth(), assets.sprites.level.pier:getHeight() obj.pier = utils.spawnStaticRectangleBySize(world, x - PLAN_SIZE.marginX, y + PLAN_SIZE.h - pierHeight, pierWidth + PLAN_SIZE.marginX, pierHeight) local craneWidth, craneHeight = assets.sprites.crane:getWidth(), assets.sprites.crane:getHeight() movingStuffWidth, movingStuffHeight = assets.sprites.movingstuff:getWidth(), assets.sprites.movingstuff:getHeight() obj.crane = { top = utils.spawnStaticRectangleBySize(world, x + 36, y + 80 + movingStuffHeight - 13, craneWidth, 6), left = utils.spawnStaticRectangleBySize(world, x + 36, y + 80 + movingStuffHeight - 12 + 6, 6, craneHeight - 32), right = utils.spawnStaticRectangleBySize(world, x + 30 + craneWidth, y + 80 + movingStuffHeight - 12 + 6, 6, craneHeight - 32), bottom = utils.spawnStaticRectangleBySize(world, x + 36, y + 74 + craneHeight, craneWidth, 6) } local center = utils.getCenterByXY(x + 36 + (craneWidth/2) - (movingStuffWidth/2), y + craneHeight + 80 - movingStuffHeight - 6, movingStuffWidth, movingStuffHeight) movingStuff = world:addRectangle(center.x, center.y, movingStuffWidth, movingStuffHeight):setClass('Player') magnet.size.width, magnet.size.height = assets.sprites.magnet:getWidth(), assets.sprites.magnet:getHeight() local centerMag = utils.getCenterByXY(x + 36 + (craneWidth/2) - (magnet.size.width/2), y + craneHeight + 80 + 50, magnet.size.width, magnet.size.height) magnet.collider = world:addRectangle(centerMag.x, centerMag.y, magnet.size.width, magnet.size.height):setClass('Player') --magnet.collider:setRestitution(0) stuffToMagnetJoint = world:addJoint('distance', movingStuff, magnet.collider, center.x, center.y, centerMag.x, centerMag.y) input = Boipus() -- Controls -- Keyboard and mouse input:bind(love.keyboard.getKeyFromScancode('w'), 'moveUp') input:bind(love.keyboard.getKeyFromScancode('a'), 'moveLeft') input:bind(love.keyboard.getKeyFromScancode('d'), 'moveRight') input:bind(love.keyboard.getKeyFromScancode('s'), 'moveDown') -- input:bind(love.keyboard.getKeyFromScancode('space'), 'switch') input:bind(love.keyboard.getKeyFromScancode('lshift'), 'detach') crates:init(world, magnet) crates:spawn(x + 120, y + 400, 'small') crates:spawn(x + 150, y + 400, 'medium') return setmetatable(obj, { __index = Chu }) end function Chu:update(dt) world:update(dt) crates:update(dt) if input:pressed('detach') then velocity = {0, 0} local attached = crates:getAttached() for key in pairs(attached) do crates:detach(key) end elseif input:down('moveUp') or input:down('moveDown') or input:down('moveLeft') or input:down('moveRight') then local length = stuffToMagnetJoint:getLength() if input:down('moveUp') then length = length - player.magSpeed if length < joint.min then length = joint.min end stuffToMagnetJoint:setLength(length) elseif input:down('moveDown') then length = length + player.magSpeed if length > joint.max then length = joint.max end stuffToMagnetJoint:setLength(length) end if input:down('moveLeft') then velocity[1] = -player.maxSpeed.x elseif input:down('moveRight') then velocity[1] = player.maxSpeed.x else velocity[1] = 0 end else velocity = {0, 0} end movingStuff:setLinearVelocity(velocity[1], velocity[2]) end function Chu:draw() love.graphics.setColor(255, 255, 255, 1) love.graphics.draw(assets.sprites.level.background, self.x, self.y) love.graphics.draw(assets.sprites.level.clouds, self.x, self.y + 32) love.graphics.draw(assets.sprites.level.clouds, self.x, self.y, 0, -1, 1, assets.sprites.level.clouds:getWidth()) love.graphics.draw(assets.sprites.cranevert, self.x + 60, self.y + PLAN_SIZE.h - 456) love.graphics.draw(assets.sprites.cranevert, self.x + PLAN_SIZE.w - 112, self.y + PLAN_SIZE.h - 456) local stuffPosX, stuffPosY = movingStuff:getPosition() local otherPosX, otherPosY = magnet.collider:getPosition() love.graphics.setColor(0, 0, 0, 1) love.graphics.line(stuffPosX, stuffPosY, otherPosX, otherPosY) love.graphics.setColor(255, 255, 255, 1) local stuffPos = utils.getXYByCenter(stuffPosX, stuffPosY, movingStuffWidth, movingStuffHeight) love.graphics.draw(assets.sprites.movingstuff, stuffPos.x, stuffPos.y) love.graphics.draw(assets.sprites.crane, self.x + 36, self.y + 80) love.graphics.draw(assets.sprites.wheel, stuffPos.x + 9, stuffPos.y + movingStuffHeight - 9) love.graphics.draw(assets.sprites.wheel, stuffPos.x + movingStuffWidth - 23, stuffPos.y + movingStuffHeight - 9) love.graphics.draw(assets.sprites.level.pier, self.x, self.y + PLAN_SIZE.h - 128) otherPosX, otherPosY = magnet.collider:getPosition() love.graphics.draw(assets.sprites.magnet, otherPosX, otherPosY, magnet.collider:getAngle(), 1, 1, magnet.size.width/2, magnet.size.height/2) crates:draw() world:draw() if self.debug then love.graphics.setColor(255, 0, 0, .5) love.graphics.rectangle('line', self.x, self.y, PLAN_SIZE.w, PLAN_SIZE.h) love.graphics.print(stuffToMagnetJoint:getLength(), 10, 10) end end return Chu