-- Chuchu by Makaron Boipus = require('deps.boipushy') Physics = require('deps.physics') assets = require('deps.cargo').init('data') -- my own libs crates = require('crate') local CONST_GRAVITY = 512 local CONST_SIDES = { LEFT = { 10, 10, 200, 10, 200, 500, 10, 500 }, RIGHT = { 310, 10, 502, 10, 502, 502, 310, 502 }, WIDTH = 190 } local player = { maxSpeed = { x = 100, y = 100 } } local magnet = { w = 50, h = 50, collider = nil, side = 'LEFT' } local side = { left = nil, right = nil } local velocity = {0, 0} local current = { } local tempAttached = nil function love.load() love.window.setMode(512, 512) world = Physics(0, 0) world:addClass('Player') world:addClass('Side') world:addClass('Crate') side.left = world:addChain(true, CONST_SIDES.LEFT):setClass('Side') side.right = world:addChain(true, CONST_SIDES.RIGHT):setClass('Side') magnet.collider = world:addRectangle(50, 50, magnet.w, magnet.h):setClass('Player') magnet.collider:setRestitution(0) 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') crates:init(world, magnet) crates:spawn(120, 400) crates:spawn(150, 400) -- Gamepad --[[input:bind('dpup', 'moveUp') input:bind('dpleft', 'moveLeft') input:bind('dpright', 'moveRight') input:bind('dpdown', 'moveDown')]]-- end function love.update(dt) world:update(dt) crates:update(dt) --[[ if input:down('moveUp') then magnet.collider:applyLinearImpulse(0, -player.maxSpeed.y) end if input:down('moveLeft') then magnet.collider:applyLinearImpulse(-player.maxSpeed.x, 0) end if input:down('moveRight') then magnet.collider:applyLinearImpulse(player.maxSpeed.x, 0) end if input:down('moveDown') then magnet.collider:applyLinearImpulse(0, player.maxSpeed.y) end ]]-- -- this is temp, ofc, it's ugly af if input:pressed('switch') then velocity = {0, 0} -- first, let's take care of the attached crates for key in pairs(crates:getAttached()) do current.x, current.y = crates.attached[key].collider:getPosition() if magnet.side == 'LEFT' then current.x = current.x - CONST_SIDES.LEFT[1] -- then, we need to mirror it onto the other side current.x = CONST_SIDES.RIGHT[1] + CONST_SIDES.WIDTH - current.x else current.x = current.x - CONST_SIDES.RIGHT[1] current.x = CONST_SIDES.LEFT[1] + CONST_SIDES.WIDTH - current.x end crates.attached[key].collider:setPosition(current.x, current.y) end current.x, current.y = magnet.collider:getPosition() -- i want a relative x position, for easier use, so first -- let's substract the x position depending on the side if magnet.side == 'LEFT' then current.x = current.x - CONST_SIDES.LEFT[1] -- then, we need to mirror it onto the other side current.x = CONST_SIDES.RIGHT[1] + CONST_SIDES.WIDTH - current.x magnet.side = 'RIGHT' else current.x = current.x - CONST_SIDES.RIGHT[1] current.x = CONST_SIDES.LEFT[1] + CONST_SIDES.WIDTH - current.x magnet.side = 'LEFT' end magnet.collider:setPosition(current.x, current.y) else if input:down('moveUp') or input:down('moveLeft') or input:down('moveRight') or input:down('moveDown') then if input:down('moveUp') then velocity[2] = -player.maxSpeed.y elseif input:down('moveDown') then velocity[2] = player.maxSpeed.y else velocity[2] = 0 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 end magnet.collider:setLinearVelocity(velocity[1], velocity[2]) end function love.draw() --[[love.graphics.clear(255, 255, 255) love.graphics.setColor(0, 0, 0, 1) love.graphics.polygon('line', CONST_SIDES.LEFT) love.graphics.rectangle('line', magnet.x, magnet.y, 32, 32) ]]-- world:draw() current.x, current.y = magnet.collider:getPosition() love.graphics.print('Pos X: ' .. current.x .. ', Pos Y: ' .. current.y) -- love.graphics.print('Key code: ' .. key) --love.graphics.draw(assets.sprites.crane) end