69 lines
1.2 KiB
Lua
69 lines
1.2 KiB
Lua
Arrow = {}
|
|
Arrow.type = "Arrow"
|
|
Arrow.supertype = Entity.type
|
|
Arrow.display = Animation:new(animation.kupo.arrow)
|
|
setmetatable(Arrow, Entity)
|
|
|
|
|
|
function Arrow:new(x,y,rotation,speed)
|
|
local o = Entity:new(x,y)
|
|
|
|
o.pos = {x = x, y = y}
|
|
o.speed = speed or 10
|
|
o.sprite_rotation = rotation or 0
|
|
o.vel = {
|
|
x = o.speed * math.cos(o.sprite_rotation),
|
|
y = o.speed * math.sin(o.sprite_rotation)
|
|
}
|
|
o.sprite_offset = {x = 13, y = 1}
|
|
o.stuck = false
|
|
o.illuminated = true
|
|
|
|
-- animations
|
|
o.body = Animation:new(animation.kupo.arrow)
|
|
|
|
o.box = {
|
|
from = {x = -0.5, y = -0.5}, --gameworld pixels
|
|
to = {x = 0.5, y = 0.5} -- gameworld pixels
|
|
}
|
|
|
|
o:id()
|
|
|
|
setmetatable(o, self)
|
|
self.__index = self
|
|
return o
|
|
end
|
|
|
|
function Arrow:drawBackground()
|
|
self:draw(self.body)
|
|
end
|
|
|
|
function Arrow:doPhysics()
|
|
-- horizontal collision
|
|
self:moveX(
|
|
self.vel.x,
|
|
function()
|
|
self.stuck = true
|
|
end
|
|
)
|
|
|
|
if not self.stuck then
|
|
-- vertical collision
|
|
self:moveY(
|
|
self.vel.y,
|
|
function()
|
|
self.stuck = true
|
|
end
|
|
)
|
|
end
|
|
|
|
if self.stuck then
|
|
self.pos.x = self.pos.x + self.vel.x * (2/3)
|
|
self.pos.y = self.pos.y + self.vel.y * (2/3)
|
|
self.vel.x = 0
|
|
self.vel.y = 0
|
|
end
|
|
|
|
self:adjustLight()
|
|
end
|