SNKRX/engine/game/gameobject.lua

79 lines
2.7 KiB
Lua

-- The base GameObject class.
-- The general way of creating an object that implements these functions goes like this:
--[[
MyGameObject = Object:extend()
MyGameObject:implement(GameObject)
function MyGameObject:init(args)
self:init_game_object(args)
end
function MyGameObject:update(dt)
self:update_game_object(dt)
end
]]--
-- This simply implements the GameObject class as a mixin into your own class, giving it the functions defined in this file as well as the attributes set from init_game_object.
-- In general you'd create your own game object like this, for instance:
-- group = Group()
-- MyGameObject{group = group, x = 100, y = 100, v = 100, r = math.pi/4}
-- And then this object would be automatically updated and drawn by the group.
-- Alternatively you could add the object to the group manually:
-- my_object = MyGameObject{x = 100, y = 100, v = 100, r = math.pi/4}
-- group:add(my_object)
-- One of the nice patterns I've found was a passing arguments as a key + value table.
-- So in the case above, the object would automatically have its .x, .y and .v attributes set to 100 and its .r attribute set to math.pi/4.
GameObject = Object:extend()
function GameObject:init_game_object(args)
for k, v in pairs(args or {}) do self[k] = v end
if self.group then self.group:add(self) end
self.x, self.y = self.x or 0, self.y or 0
self.r = self.r or 0
self.sx, self.sy = self.sx or 1, self.sy or 1
self.id = self.id or random:uid()
self.t = Trigger()
self.springs = Springs()
self.flashes = Flashes()
self.hfx = HitFX(self)
self.spring = Spring(1)
return self
end
function GameObject:update_game_object(dt)
self.t:update(dt)
self.springs:update(dt)
self.flashes:update(dt)
self.hfx:update(dt)
self.spring:update(dt)
if self.body then self:update_physics(dt) end
if self.shape then
if self.shape.vertices and self.body then
self.shape.vertices = {self.body:getWorldPoints(self.fixture:getShape():getPoints())}
self.shape:get_centroid()
end
if self.body then
self.shape:move_to(self:get_position())
end
if self.interact_with_mouse then
local colliding_with_mouse = self.shape:is_colliding_with_point(self.group:get_mouse_position())
if colliding_with_mouse and not self.colliding_with_mouse then
self.colliding_with_mouse = true
if self.on_mouse_enter then self:on_mouse_enter() end
elseif not colliding_with_mouse and self.colliding_with_mouse then
self.colliding_with_mouse = false
if self.on_mouse_exit then self:on_mouse_exit() end
end
if self.colliding_with_mouse then
if self.on_mouse_stay then self:on_mouse_stay() end
end
end
end
end
function GameObject:draw_game_object()
if self.body then self:draw_physics() end
end