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