-- Chuchu by Makaron -- The main game screen of Chuchu Boipus = require('deps.boipushy') Physics = require('deps.physics') -- my own libs crates = require('crate') GRAVITY = 512 PLAN_SIZE = { marginX = 120, marginY = 120, w = 512, h = 512 } local player = { maxSpeed = { x = 100, y = 100 } } local magnet = { w = 50, h = 50, collider = nil, side = 'LEFT' } 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') 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') magnet.collider = world:addRectangle(x + 50, y + 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') input:bind(love.keyboard.getKeyFromScancode('lshift'), 'detach') crates:init(world, magnet) crates:spawn(x + 120, y + 400) crates:spawn(x + 150, y + 400) return setmetatable(obj, { __index = Chu }) end function Chu:update(dt) world:update(dt) crates:update(dt) -- 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 mirrorCollider(crates.attached[key].collider, magnet.side) end mirrorCollider(magnet.collider, magnet.side) if magnet.side == 'LEFT' then magnet.side = 'RIGHT' else magnet.side = 'LEFT' end]]-- 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('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 magnet.collider: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.cloudsmirror, self.x, self.y) 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) end end return Chu