---@module 'obj/GameObject' ---@class GameObject:Object ---@field area Area ---@field x number ---@field y number ---@field opts table|nil ---@field super GameObject ---@field id string ---@field dead boolean ---@field timer Timer ---@field collider table|nil local GameObject = Object:extend() ---Instantiates game object function GameObject:new(area, x, y, opts) if opts then for k,v in pairs(opts) do self[k] = v end end self.area = area self.x = x self.y = y self.id = UUID() self.dead = false self.timer = Timer() self.collider = nil end ---Updates game object ---@param dt number function GameObject:update(dt) if self.timer then self.timer:update(dt) end end ---Draw game object function GameObject:draw() end ---Mark object for destruction ---@protected function GameObject:destroy() if self.timer then self.timer:clear() -- cancel all tweens/after/every self.timer = nil end if self.collider then self.area.world:remove(self.collider) self.collider = nil end self.dead = true end ---Returns whether object is marked for destruction ---@return boolean function GameObject:isDead() return self.dead == true end ---Kill object (meant to be overridden) ---**default behavior:** self:destroy() function GameObject:kill() self:destroy() end return GameObject