Compare commits

...

2 commits

Author SHA1 Message Date
b25f433914 add car timeout 2025-03-22 15:53:00 +01:00
23a2e784a9 fix car reset backwards steering 2025-03-22 15:13:02 +01:00
4 changed files with 65 additions and 15 deletions

View file

@ -238,5 +238,11 @@ bus = &"Crash"
stream = SubResource("AudioStreamRandomizer_evs7n")
bus = &"Crash"
[node name="NoInputTimer" type="Timer" parent="CharacterBody_Car"]
wait_time = 15.0
one_shot = true
autostart = true
[connection signal="timeout" from="CharacterBody_Car/resetTimer" to="CharacterBody_Car" method="_on_reset_timer_timeout"]
[connection signal="timeout" from="CharacterBody_Car/collisionEnableTimer" to="CharacterBody_Car" method="_on_collision_enable_timer_timeout"]
[connection signal="timeout" from="CharacterBody_Car/NoInputTimer" to="CharacterBody_Car" method="_on_no_input_timer_timeout"]

View file

@ -58,7 +58,7 @@ var steering_distance_close_fast=64
var resetcar_stoppedspeed = 50 #activate timer when below this speed
var resetcar_movingspeed=resetcar_stoppedspeed+10 #stop timer when above this speed
var resetcar_distance=128 #196 is roughly when car is in the middle of a two wide road
var resetcar_steerangle=120
var resetcar_steerangle=120.0/360.0*2*PI
# other car avoidance
var avoid_car_distance_far=100
@ -83,6 +83,7 @@ var autoreset=false
var autosteer_enabled=false
var no_input_timeout_flag=false
var burnout:float=0 #at 0 is off
@ -91,6 +92,7 @@ var burnout:float=0 #at 0 is off
@onready var reset_timer: Timer = $resetTimer
@onready var no_input_timer: Timer = $NoInputTimer
@onready var ray_cast_car: RayCast2D = $RayCast_Car #for tracking markers
@ -128,6 +130,7 @@ func _physics_process(delta: float) -> void:
$Burnout_Left.emitting=false
$Burnout_Right.emitting=false
update_timeout_visibility()
move_and_slide()
for i in get_slide_collision_count():
@ -153,6 +156,7 @@ func _physics_process(delta: float) -> void:
if velocity.length() < resetcar_stoppedspeed and autosteer_enabled: #moving slow, possibly crash?
if reset_timer.is_stopped():
reset_timer.start()
if velocity.length() > resetcar_movingspeed:
reset_timer.stop()
@ -168,6 +172,18 @@ func _physics_process(delta: float) -> void:
func _on_reset_timer_timeout() -> void:
autoreset=true
func update_timeout_visibility():
var no_input_timer_time_left=no_input_timer.time_left
if (no_input_timer.is_stopped()):
no_input_timer_time_left=no_input_timer.wait_time
if no_input_timeout_flag:
no_input_timer_time_left=0 #car already disappeared
var fadeout=1-constrain((3-no_input_timer_time_left)/3.0,0.0,1.0) #1= full visible, 0=timeouted
$sprite_body.modulate.a=fadeout
$sprite_features.modulate.a=fadeout
$sprite_steeringwheel.modulate.a=fadeout
func apply_friction():
if velocity.length() < STANDSTILLSPEED: #standstill
velocity=Vector2.ZERO
@ -228,12 +244,20 @@ func get_input(delta:float):
steer_direction=1
'''
steer_direction+=constrain(steer_direction_aim-steer_direction,max_steering_change*delta,-max_steering_change*delta)
applied_engine_power=0
var key_accelerator_pressed=Input.is_action_pressed(Gamestate.userinput_prefix+str(playerid))
#check Input Timeout
if key_accelerator_pressed:
no_input_timer.stop()
else:
if no_input_timer.is_stopped() and !no_input_timeout_flag: #reset timer
no_input_timer.start()
if key_accelerator_pressed:
if running:
#velocity = transform.x * 500
applied_engine_power=engine_power
@ -256,17 +280,16 @@ func get_input(delta:float):
if autoreset and running:
acceleration = transform.x * braking #drive backwards
if distance_min>=resetcar_distance: #nothing in front of car
steer_direction=resetcar_steerangle #keep steering so turn around if standing in the middle of a track
else:
steer_direction*=-1 #invert steering
steer_direction_aim=resetcar_steerangle #keep steering to turn around if standing in the middle of a track
#steer_direction=steer_direction_aim #steer without smoothing
else:
if steer_direction>1:
if steer_direction_aim<0.1:
resetcar_steerangle=max(-resetcar_steerangle,+resetcar_steerangle) #calculate steering direction for next autoreset
if steer_direction<1:
if steer_direction_aim>0.1:
resetcar_steerangle=min(-resetcar_steerangle,+resetcar_steerangle) #calculate steering direction for next autoreset
steer_direction+=constrain(steer_direction_aim-steer_direction,max_steering_change*delta,-max_steering_change*delta) #smooth steering. towards steer_direction_aim
$sprite_steeringwheel.rotation=steer_direction
func calculate_steering(delta:float):
@ -319,6 +342,7 @@ func check_markers():
running=false
finalTime=Gamestate.getTimeElapsed()
car_finished.emit(playerid,finalTime)
no_input_timer.stop() #avoid removing player after finished
elif rcc_collidername.begins_with("area_cp"):
var nextcp_i=getNextCPindex()
@ -348,3 +372,8 @@ func getNextCPindex():
func _on_collision_enable_timer_timeout() -> void:
collision_shape.disabled=false
func _on_no_input_timer_timeout() -> void:
no_input_timeout_flag=true
running=false

View file

@ -44,3 +44,6 @@ func getCharacterBody():
func hasFinished():
return cbcar.finalTime!=-1
func getNoInputTimeout():
return cbcar.no_input_timeout_flag

View file

@ -102,6 +102,7 @@ func _process(delta: float) -> void:
#if !countdown.is_stopped():
# countdown_label.text=str(round(countdown.time_left))
checkCarsTimeout(delta)
updateCameraMovement(delta)
#$hud/debuglabel.text=""+str(calculatedViewCarMargin)+" / "+str(viewCarMargin_zoomstart)+" zoomspeed="+str(mapped_zoomspeed)
@ -125,6 +126,15 @@ func _process(delta: float) -> void:
if !anyplayerkeypressed and timer_close.is_stopped():
timer_close.start() #start timer when no key is pressed
func checkCarsTimeout(delta: float):
# Remove cars from game if they are not participating
var cars=cars.get_children()
for c in cars: #check if any one car is still driving
if !c.hasFinished() and c.getNoInputTimeout():
print("Removing car")
c.queue_free()
if cars.size()<=0 and !game_ended: #no cars left
end_game()
func updateCameraMovement(delta: float):
@ -220,7 +230,8 @@ func _on_countdown_timeout() -> void:
func _on_car_finished(playerid,finalTime) -> void:
times_container.addFinishedPlayer(playerid,finalTime,Gamestate.getPlayers().size())
if times_container.getPlayersFinished() == Gamestate.getPlayers().size(): #all players have finish times
#if times_container.getPlayersFinished() == Gamestate.getPlayers().size(): #all players have finish times
if times_container.getPlayersFinished() == cars.get_children().size(): #all players still in game have finish times
finishGame()# Game finished
func _on_car_on_checkpoint(playerid,checkpointtimes,i) -> void:
@ -247,9 +258,7 @@ func _on_car_on_checkpoint(playerid,checkpointtimes,i) -> void:
func finishGame():
print("Game Finished")
running=false
game_ended=true
end_game()
#change rank for players
var players_ranked :Array = Gamestate.getPlayers().duplicate()
@ -283,10 +292,13 @@ func finishGame():
highscore_label.modulate=Color(200,0,0)
game_hud_animations.play("game_end")
timer_close.start()
#overlaycolor.visible=true
func end_game():
running=false
game_ended=true
game_hud_animations.play("game_end")
timer_close.start()
func custom_array_sort_player_finaltime(a, b):
#var cars=cars.get_children()