Arrow = Entity:New(x,y) function Arrow:New(x,y,rotation,speed) local o = Entity:New(x,y) 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 setmetatable(o, self) self.__index = self table.insert(LoadedEntities,o) return o end function Arrow:Smart() end function Arrow:HandleAnimation() self:LoadAnimation(animation.kupo.arrow) end function Arrow:DoPhysics() -- 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 isThereCollisionAt(self.pos.x + math.sign(self.vel.x), self.pos.y) 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 isThereCollisionAt(self.pos.x, self.pos.y + math.sign(self.vel.y)) 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 end end