소스 검색

:gamepad: Add brake control for jeep

DricomDragon 1 년 전
부모
커밋
d9d07f94da

+ 8 - 0
godot/component/entity/vehicles/jeep/jeep.gd

@@ -2,6 +2,7 @@ class_name Jeep
 extends SeatedVehicle
 
 @export var max_engine_force: float = 500
+@export var max_brake_force: float = 50
 @export var max_steering: float = PI / 6.0 # degrees
 
 
@@ -24,5 +25,12 @@ func _on_main_action(pressed: bool) -> void:
 		set_engine_force(0.0)
 
 
+func _on_stop_action(pressed: bool) -> void:
+	if pressed:
+		set_brake(max_brake_force)
+	else:
+		set_brake(0.0)
+
+
 func _on_analog_action(side: int, value: float) -> void:
 	set_engine_force(side * value * max_engine_force)

+ 7 - 0
godot/component/entity/vehicles/seated_vehicle.gd

@@ -16,6 +16,7 @@ func _init() -> void:
 func drive_with(commander: LocalInput) -> void:
 	commander.dir_changed.connect(_on_dir_changed)
 	commander.main_action.connect(_on_main_action)
+	commander.stop_action.connect(_on_stop_action)
 	commander.analog_action.connect(_on_analog_action)
 	_current_commander = commander
 
@@ -23,6 +24,7 @@ func drive_with(commander: LocalInput) -> void:
 func get_out() -> void:
 	_current_commander.dir_changed.disconnect(_on_dir_changed)
 	_current_commander.main_action.disconnect(_on_main_action)
+	_current_commander.stop_action.disconnect(_on_stop_action)
 	_current_commander.analog_action.disconnect(_on_analog_action)
 	_current_commander = null
 
@@ -64,6 +66,11 @@ func _on_main_action(_pressed: bool) -> void:
 	pass
 
 
+## Need to be overridden to react to main action
+func _on_stop_action(_pressed: bool) -> void:
+	pass
+
+
 ## Need to be overridden to react to analog actions
 func _on_analog_action(_side: int, _value: float) -> void:
 	pass

+ 3 - 0
godot/flow/control/local_input/local_input.gd

@@ -5,6 +5,7 @@ extends Node
 
 signal dir_changed(new_dir: Vector2)
 signal main_action(pressed: bool)
+signal stop_action(pressed: bool)
 signal get_in_action(commander: LocalInput)
 signal analog_action(side: int, value: float)
 
@@ -12,6 +13,8 @@ signal analog_action(side: int, value: float)
 func _unhandled_input(event: InputEvent) -> void:
 	if event.is_action("main"):
 		main_action.emit(event.is_pressed())
+	if event.is_action("stop"):
+		stop_action.emit(event.is_pressed())
 	elif event.is_action_pressed("get_in"):
 		get_in_action.emit(self)
 	elif event.is_action("move_left") or event.is_action("move_right") or event.is_action("move_back") or event.is_action("move_forward"):

+ 1 - 1
godot/project.godot

@@ -64,7 +64,7 @@ main={
 , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
 ]
 }
-paint={
+stop={
 "deadzone": 0.5,
 "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(95, 20),"global_position":Vector2(99, 63),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
 , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":46,"echo":false,"script":null)