module AMazeIng class Player attr_accessor :cell_index_x, :cell_index_y, :target_x, :target_y, :is_moving, :path, :x, :y def initialize(cell_index_x, cell_index_y, color) @color = color @cell_index_x = cell_index_x @cell_index_y = cell_index_y @is_moving = false @path = nil set_target @x = @target_x @y = @target_y end def set_target @target_x = (@cell_index_x * $cell_size) + $cell_size/2 - $player_size/2 @target_y = (@cell_index_y * $cell_size) + $cell_size/2 - $player_size/2 end def check_for_path(ignored_path) path = nil $cells[@cell_index_x + @cell_index_y * $cols].walls.each_with_index do |wall, i| if !wall and i != ignored_path if path == nil path = i else path = nil break end end end return path end def set_status(path) @path = path if @path == 0 @cell_index_y -= 1 elsif @path == 1 @cell_index_x += 1 elsif @path == 2 @cell_index_y += 1 else @cell_index_x -= 1 end set_target end def move if @is_moving if @x == @target_x && @y == @target_y # check for available path, # and ignore the the opposite directions of the LAST path # cuz you don't wanna go back where you just left @path = check_for_path(@path == 0 ? 2: @path == 1 ? 3: @path == 2 ? 0: 1) if @path != nil # set new player's cell index depend on "current @path" set_status(@path) set_target else # no "available" path found, player stop moving @is_moving = false end else # target's position is different than curent position, # move to the target if @x < @target_x @x += $speed_per_tick elsif @x > @target_x @x -= $speed_per_tick end if @y < @target_y @y += $speed_per_tick elsif @y > @target_y @y -= $speed_per_tick end end end end def draw draw_quad @x, @y, @color, @x + $player_size, @y, @color, @x + $player_size, @y + $player_size, @color, @x, @y + $player_size, @color end end end