Game Development Reference
In-Depth Information
TankStuckState is nearly the same, but it keeps driving away from @stuck_at
point, which is set by TankMotionFSM upon transition to this state.
class TankMotionFSM
STATE_CHANGE_DELAY = 500
LOCATION_CHECK_DELAY = 5000
def initialize (object, vision, gun)
# ...
@stuck_state = TankStuckState . new(object, vision, gun)
@navigating_state = TankNavigatingState . new(object, vision)
set_state( @roaming_state )
end
# ...
def choose_state
unless @vision . can_go_forward?
unless @current_state == @stuck_state
set_state( @navigating_state )
end
end
# Keep unstucking itself for a while
change_delay = STATE_CHANGE_DELAY
if @current_state == @stuck_state
change_delay *= 5
end
now = Gosu . milliseconds
returnunless now - @last_state_change > change_delay
if @last_location_update . nil?
@last_location_update = now
@last_location = @object . location
end
if now - @last_location_update > LOCATION_CHECK_DELAY
puts "checkin location"
unless @last_location . nil? || @current_state . waiting?
if Utils . distance_between( * @last_location , * @object . location) <
20
set_state( @stuck_state )
@stuck_state . stuck_at = @object . location
return
end
end
@last_location_update = now
@last_location = @object . location
end
# ...
end
Search WWH ::




Custom Search