79 lines
2.7 KiB
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
|