-- Chuchu by Makaron -- Crates are the main thing so here we go local Timer = require('deps.knife.timer') local utils = require('utils') ITERATIONS_RESOLVE = .01 TIME_TO_RELOAD = .4 local Crates = { world = nil, player = nil, list = { }, attached = { } } local Crate = { } local curContact = nil function Crate.new(world, x, y, size) local object = { } object.size = { w = 0, h = 0 } if size == 'small' then object.size.w, object.size.h = assets.sprites.crates.small:getWidth(), assets.sprites.crates.small:getHeight() object.img = assets.sprites.crates.small elseif size == 'medium' then object.size.w, object.size.h = assets.sprites.crates.medium:getWidth(), assets.sprites.crates.medium:getHeight() object.img = assets.sprites.crates.medium elseif size == 'large' then object.size.w, object.size.h = assets.sprites.crates.large:getWidth(), assets.sprites.crates.large:getHeight() object.img = assets.sprites.crates.large end local center = utils.getCenterByXY(x, y, object.size.w, object.size.h) object.collider = world:addRectangle(x, y, object.size.w, object.size.h) object.collider:setClass('Crate') object.attached = false object.contact = { } object.joint = nil object.collider:setPresolve(function (shape1, shape2, contact) if shape2:getClass() == 'Player' and object.attached == false then contact:setEnabled(false) object.contact.x, object.contact.y = contact:getPositions() object.attached = true Timer.after(ITERATIONS_RESOLVE, function () object.joint = Crates.world:addJoint('revolute', Crates.player.collider, object.collider, object.contact.x, object.contact.y, true) table.insert(Crates.attached, object) end) end end) return setmetatable(object, { __index = Crate }) end function Crates:init(world, player) self.world = world self.player = player end function Crates:spawn(x, y, size) table.insert(self.list, Crate.new(self.world, x, y, size)) end function Crates:update(dt) Timer.update(dt) end function Crates:draw() local pos = {x = 0, y = 0, r = 0} for key in pairs(self.list) do pos.x, pos.y = self.list[key].collider:getPosition() pos.r = self.list[key].collider:getAngle() love.graphics.draw(self.list[key].img, pos.x, pos.y, pos.r, 1, 1, self.list[key].size.w/2, self.list[key].size.h/2) end end function Crates:getAttached() return self.attached end function Crates:detach(key) self.attached[key].joint._joint:destroy() Timer.after(TIME_TO_RELOAD, function () self.attached[key].attached = false table.remove(self.attached, key) end) end return setmetatable(Crates, { __call = function(_, ...) return new(...) end })