101 lines
2.7 KiB
Lua
101 lines
2.7 KiB
Lua
-- 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
|
|
})
|