mirror of
https://github.com/cyberarm/i-mic-rts.git
synced 2025-12-15 15:52:34 +00:00
Crude path following implemented
This commit is contained in:
@@ -25,6 +25,7 @@ class IMICRTS
|
|||||||
@position = position
|
@position = position
|
||||||
@angle = angle
|
@angle = angle
|
||||||
@director = director
|
@director = director
|
||||||
|
@speed = 0.5
|
||||||
|
|
||||||
@radius = 32 / 2
|
@radius = 32 / 2
|
||||||
@target = nil
|
@target = nil
|
||||||
@@ -41,6 +42,8 @@ class IMICRTS
|
|||||||
|
|
||||||
@goal_color = Gosu::Color.argb(175, 25, 200, 25)
|
@goal_color = Gosu::Color.argb(175, 25, 200, 25)
|
||||||
@target_color = Gosu::Color.argb(175, 200, 25, 25)
|
@target_color = Gosu::Color.argb(175, 200, 25, 25)
|
||||||
|
|
||||||
|
@orders = []
|
||||||
end
|
end
|
||||||
|
|
||||||
def serialize
|
def serialize
|
||||||
@@ -96,6 +99,7 @@ class IMICRTS
|
|||||||
rotate_towards(@target) if @target && @movement
|
rotate_towards(@target) if @target && @movement
|
||||||
|
|
||||||
if @movement
|
if @movement
|
||||||
|
follow_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -107,6 +111,13 @@ class IMICRTS
|
|||||||
@on_tick = block
|
@on_tick = block
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def follow_path
|
||||||
|
if @pathfinder && node = @pathfinder.path_current_node
|
||||||
|
@pathfinder.path_next_node if @pathfinder.at_current_path_node?(@position)
|
||||||
|
@position -= (@position.xy - node.tile.position.xy).normalized * @speed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def selected_draw
|
def selected_draw
|
||||||
draw_radius
|
draw_radius
|
||||||
draw_gizmos
|
draw_gizmos
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
class IMICRTS
|
class IMICRTS
|
||||||
class Map
|
class Map
|
||||||
attr_reader :tile_size, :tiles, :ores
|
attr_reader :tile_size, :tiles, :ores, :width, :height
|
||||||
def initialize(map_file:)
|
def initialize(map_file:)
|
||||||
@tiled_map = TiledMap.new(map_file)
|
@tiled_map = TiledMap.new(map_file)
|
||||||
|
|
||||||
|
|||||||
@@ -39,23 +39,25 @@ class IMICRTS
|
|||||||
@created_nodes = 0
|
@created_nodes = 0
|
||||||
@nodes = []
|
@nodes = []
|
||||||
@path = []
|
@path = []
|
||||||
@tiles = @map.tiles.values.map { |columns| columns.values }.flatten.select { |tile| tile }
|
@tiles = @map.tiles
|
||||||
|
|
||||||
@visited = Hash.new do |hash, value|
|
@visited = Hash.new do |hash, value|
|
||||||
hash[value] = Hash.new {|h, v| h[v] = false}
|
hash[value] = Hash.new {|h, v| h[v] = false}
|
||||||
end
|
end
|
||||||
|
|
||||||
@depth = 0
|
@depth = 0
|
||||||
@max_depth = @tiles.size
|
@max_depth = @map.width * @map.height
|
||||||
@seeking = true
|
@seeking = true
|
||||||
|
|
||||||
position = entity.position.clone
|
@position = entity.position.clone
|
||||||
position.x, position.y = position.x.floor, position.y.floor
|
@position.x, @position.y = @position.x.floor, @position.y.floor
|
||||||
position /= @map.tile_size
|
@position /= @map.tile_size
|
||||||
|
|
||||||
@current_node = create_node(position.x, position.y, nil)
|
@path_current_node = 0
|
||||||
|
|
||||||
|
@current_node = create_node(@position.x, @position.y, nil, 0)
|
||||||
unless @current_node
|
unless @current_node
|
||||||
puts "Failed to find path!" if Setting.enabled?(:debug_mode)
|
puts "Unable to find path as position is not a traversable tile for :#{@entity.name}!" if Setting.enabled?(:debug_mode)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -68,6 +70,22 @@ class IMICRTS
|
|||||||
self.class.cache_path(self) if @path.size > 0 && true#Setting.enabled?(:debug_cache_paths)
|
self.class.cache_path(self) if @path.size > 0 && true#Setting.enabled?(:debug_cache_paths)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def path_current_node
|
||||||
|
@path[@path_current_node]
|
||||||
|
end
|
||||||
|
|
||||||
|
def path_next_node
|
||||||
|
@path_current_node += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def at_current_path_node?(position)
|
||||||
|
if node = path_current_node
|
||||||
|
position.distance(node.tile.position) < @map.tile_size / 2
|
||||||
|
else
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Checks if Map still has all of paths required tiles
|
# Checks if Map still has all of paths required tiles
|
||||||
def valid?
|
def valid?
|
||||||
valid = true
|
valid = true
|
||||||
@@ -86,8 +104,8 @@ class IMICRTS
|
|||||||
seek
|
seek
|
||||||
end
|
end
|
||||||
|
|
||||||
if @depth >= @max_depth
|
if @depth >= @max_depth || (@path.size == 0 && @depth < 0)
|
||||||
puts "Failed to find path from: #{@source.x}:#{@source.y} (#{@map.grid.dig(@source.x,@source.y).element.class}) to: #{@goal.position.x}:#{@goal.position.y} (#{@goal.element.class}) [#{@depth}/#{@max_depth} depth]" if Setting.enabled?(:debug_mode)
|
puts "Failed to find path from: #{@position.x}:#{@position.y} to: #{@goal.x}:#{@goal.y} [#{@depth}/#{@max_depth} depth]" if Setting.enabled?(:debug_mode)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -96,7 +114,7 @@ class IMICRTS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def seek
|
def seek
|
||||||
unless @current_node && @map.tiles.dig(@goal.x, @goal.y)
|
unless @current_node && @tiles.dig(@goal.x, @goal.y)
|
||||||
@seeking = false
|
@seeking = false
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -161,7 +179,7 @@ class IMICRTS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_node(x, y, parent, cost = 1.0)
|
def create_node(x, y, parent, cost = 1.0)
|
||||||
return unless tile = @map.tiles.dig(x, y)
|
return unless tile = @tiles.dig(x, y)
|
||||||
return unless tile.type == @travels_along
|
return unless tile.type == @travels_along
|
||||||
return if tile.entity
|
return if tile.entity
|
||||||
return if @visited.dig(x, y)
|
return if @visited.dig(x, y)
|
||||||
@@ -200,27 +218,27 @@ class IMICRTS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def node_above?(node = @current_node)
|
def node_above?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y - 1)
|
node && @tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y - 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def node_below?(node = @current_node)
|
def node_below?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y + 1)
|
node && @tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y + 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def node_above_left?(node = @current_node)
|
def node_above_left?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y - 1)
|
node && @tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y - 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def node_above_right?(node = @current_node)
|
def node_above_right?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y - 1)
|
node && @tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y - 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def node_below_left?(node = @current_node)
|
def node_below_left?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y + 1)
|
node && @tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y + 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def node_below_right?(node = @current_node)
|
def node_below_right?(node = @current_node)
|
||||||
node && @map.tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y + 1)
|
node && @tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y + 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user