Arrow = Entity:New(x,y) function Arrow:New(x,y,rotation,speed) local o = Entity:New(x,y) arrow = arrow + 1 o.pos = {x = x, y = y} o.speed = speed or 0 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) table.insert(LoadedEntities,o) o.id = #LoadedEntities setmetatable(o, self) self.__index = self return o end function Arrow:HandleAnimation() self:Draw(self.body) end function Arrow:DoPhysics() if not self.stuck then -- horizontal collisions if not isThereAnyCollisionAt( self.pos.x + self.vel.x, self.pos.y ) then self.pos.x = self.pos.x + self.vel.x else while not isThereObjectAt( self.pos.x + math.sign(self.vel.x), self.pos.y, LoadedObjects.Collisions ) do self.pos.x = self.pos.x + math.sign(self.vel.x) end self.stuck = true end -- vertical collision if not isThereAnyCollisionAt( self.pos.x, self.pos.y + self.vel.y ) then self.pos.y = self.pos.y + self.vel.y else while not isThereObjectAt( self.pos.x, self.pos.y + math.sign(self.vel.y), LoadedObjects.Collisions ) do self.pos.y = self.pos.y + math.sign(self.vel.y) end self.stuck = true end -- stuck into collisions if self.stuck then --lets allow the arrow to tip a bit into the thing self.pos.x = self.pos.x + self.vel.x / 5 self.pos.y = self.pos.y + self.vel.y / 5 self.vel.x = 0 self.vel.y = 0 self.illuminated = false end end end