mirror of
https://github.com/cyberarm/i-mic-rts.git
synced 2025-12-13 06:52:33 +00:00
43 lines
1.3 KiB
Ruby
43 lines
1.3 KiB
Ruby
class IMICRTS
|
|
class Movement < Component
|
|
attr_accessor :pathfinder
|
|
|
|
def update
|
|
if @parent.movement == :ground
|
|
if pathfinder && pathfinder.path_current_node
|
|
rotate_towards(pathfinder.path_current_node.tile.position + @parent.director.map.tile_size / 2)
|
|
end
|
|
|
|
follow_path
|
|
else
|
|
return unless @parent.target
|
|
|
|
rotate_towards(@parent.target)
|
|
@parent.position -= (@parent.position.xy - @parent.target.xy).normalized * @parent.speed
|
|
end
|
|
end
|
|
|
|
def rotate_towards(vector)
|
|
angle = Gosu.angle(@parent.position.x, @parent.position.y, vector.x, vector.y)
|
|
a = (360.0 + (angle - @parent.angle)) % 360.0
|
|
|
|
# FIXME: Fails if vector is directly behind entity
|
|
if a.round == 180
|
|
@parent.angle = (angle + 180.0) % 360.0
|
|
elsif a < 180
|
|
@parent.angle -= 1.0
|
|
else
|
|
@parent.angle += 1.0
|
|
end
|
|
|
|
@parent.angle %= 360.0
|
|
end
|
|
|
|
def follow_path
|
|
if @pathfinder && node = @pathfinder.path_current_node
|
|
@pathfinder.path_next_node if @pathfinder.at_current_path_node?(@parent)
|
|
@parent.position -= (@parent.position.xy - (node.tile.position + @parent.director.map.tile_size / 2).xy).normalized * @parent.speed
|
|
end
|
|
end
|
|
end
|
|
end |