diff --git a/autoloads/globals.gd b/autoloads/globals.gd index 753dc6c..7589c69 100644 --- a/autoloads/globals.gd +++ b/autoloads/globals.gd @@ -22,8 +22,8 @@ enum ControlMode { enum ControllerCommand { NONE, - PULL_UP, - PUSH_DOWN, + PITCH_UP, + PITCH_DOWN, YAW_LEFT, YAW_RIGHT, ROLL_LEFT, diff --git a/project.godot b/project.godot index 6173d45..08660fd 100644 --- a/project.godot +++ b/project.godot @@ -31,13 +31,13 @@ window/size/window_height_override=720 [input] -pull_up={ +pitch_up={ "deadzone": 0.2, "events": [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":83,"key_label":0,"unicode":115,"location":0,"echo":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":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } -push_down={ +pitch_down={ "deadzone": 0.2, "events": [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":87,"key_label":0,"unicode":119,"location":0,"echo":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":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) @@ -46,13 +46,13 @@ push_down={ yaw_left={ "deadzone": 0.2, "events": [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":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":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":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } yaw_right={ "deadzone": 0.2, "events": [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":101,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":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":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } roll_left={ diff --git a/scenes/jet.gd b/scenes/jet.gd index 51a620d..eedca95 100644 --- a/scenes/jet.gd +++ b/scenes/jet.gd @@ -11,6 +11,8 @@ class_name Jet extends CharacterBody3D @onready var controller: JetController = $controller var control_frame: BaseJet = null +var target: Jet = null +var targeted_by: Jet = null func _ready() -> void: diff --git a/scenes/jet.tscn b/scenes/jet.tscn index 851ba0c..eb172e3 100644 --- a/scenes/jet.tscn +++ b/scenes/jet.tscn @@ -17,4 +17,9 @@ far = 10000.0 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.17266846, -0.17565918, -1.5986328) shape = SubResource("BoxShape3D_31fu5") +[node name="target_ray" type="RayCast3D" parent="."] +collision_mask = 8 +collide_with_areas = true +debug_shape_custom_color = Color(0.76862746, 0, 0, 1) + [node name="controller" parent="." instance=ExtResource("2_t5v3o")] diff --git a/scripts/controllers/cpu_system/cpu_controller.gd b/scripts/controllers/cpu_system/cpu_controller.gd index f7b5fed..c173edc 100644 --- a/scripts/controllers/cpu_system/cpu_controller.gd +++ b/scripts/controllers/cpu_system/cpu_controller.gd @@ -8,7 +8,7 @@ func _process(_delta: float) -> void: if Globals.ControlMode.PLAYER_MODE == jet.controller.control_mode: continue - process_jet_plan(jet.controller.cpu) + process_jet_plan(jet) func _controller_message(event: BaseEvent) -> void: if event is InitSpawnsLoadedEvent: @@ -22,7 +22,71 @@ func handle_init_spawns_loaded_event() -> void: create_jet_plan(jet) func create_jet_plan(jet: Jet) -> void: - print(jet) + assign_jet_target(jet) -func process_jet_plan(jet: CPU) -> void: - jet.yaw_left() +func assign_jet_target(jet: Jet) -> void: + for _jet: Jet in jets_collection.get_children(): + if _jet.faction == jet.faction: continue + if _jet.targeted_by: continue + + _jet.targeted_by = jet + jet.target = _jet + + break + +func process_jet_plan(jet: Jet) -> void: + if not is_instance_valid(jet.target): return + + var direction: Vector3 = ( + jet.target.global_position - jet.global_position + ).normalized() + + var target_basis = Basis.looking_at(direction, Vector3.UP) + var target_rotation = target_basis.get_euler() + var current_rotation = jet.global_rotation + + var yaw_error = wrapf( + target_rotation.y - current_rotation.y, + -PI, + PI + ) + + var pitch_error = wrapf( + target_rotation.x - current_rotation.x, + -PI, + PI + ) + + var deadzone = deg_to_rad(2.0) + + if yaw_error > deadzone: + jet.controller.cpu.yaw_right() + elif yaw_error < -deadzone: + jet.controller.cpu.yaw_left() + else: + jet.controller.cpu.no_action() + + if pitch_error > deadzone: + jet.controller.cpu.pitch_down() + elif pitch_error < -deadzone: + jet.controller.cpu.pitch_up() + + + + + +#func process_jet_plan(jet: Jet) -> void: + #var direction = (jet.target.global_position - jet.global_position).normalized() + #var target_basis = jet.looking_at(direction, Vector3.UP) + #var target_rotation = target_basis.get_euler() + + + #var direction = jet.target.global_position - jet.global_position + #var desired_rotation = jet.look_rotation(direction) + + #var rotation_error = desired_rotation - jet.rotation + + #jet.pitch_input = calculate_pitch(rotation_error) + #jet.yaw_input = calculate_yaw(rotation_error) + #jet.roll_input = calculate_roll(rotation_error) + #jet.throttle = calculate_throttle(distance) diff --git a/scripts/jet_controls/cpu.gd b/scripts/jet_controls/cpu.gd index 7dfe054..b754083 100644 --- a/scripts/jet_controls/cpu.gd +++ b/scripts/jet_controls/cpu.gd @@ -15,11 +15,11 @@ func unhandled_input(_event: InputEvent) -> Globals.ControllerCommand: return command -func pull_up() -> void: - command = Globals.ControllerCommand.PULL_UP +func pitch_up() -> void: + command = Globals.ControllerCommand.PITCH_UP -func push_down() -> void: - command = Globals.ControllerCommand.PUSH_DOWN +func pitch_down() -> void: + command = Globals.ControllerCommand.PITCH_DOWN func yaw_left() -> void: command = Globals.ControllerCommand.YAW_LEFT diff --git a/scripts/jet_controls/player.gd b/scripts/jet_controls/player.gd index ba45231..af0e06b 100644 --- a/scripts/jet_controls/player.gd +++ b/scripts/jet_controls/player.gd @@ -2,10 +2,10 @@ class_name Player extends Node func process(_delta: float) -> Globals.ControllerCommand: - if Input.is_action_pressed("pull_up"): - return Globals.ControllerCommand.PULL_UP - if Input.is_action_pressed("push_down"): - return Globals.ControllerCommand.PUSH_DOWN + if Input.is_action_pressed("pitch_up"): + return Globals.ControllerCommand.PITCH_UP + if Input.is_action_pressed("pitch_down"): + return Globals.ControllerCommand.PITCH_DOWN if Input.is_action_pressed("yaw_left"): return Globals.ControllerCommand.YAW_LEFT if Input.is_action_pressed("yaw_right"): diff --git a/scripts/jet_variants/base_jet.gd b/scripts/jet_variants/base_jet.gd index 0a453ce..68fb157 100644 --- a/scripts/jet_variants/base_jet.gd +++ b/scripts/jet_variants/base_jet.gd @@ -21,10 +21,10 @@ func do_action( var change_rate: float = deg_to_rad(1) * delta match action: - Globals.ControllerCommand.PULL_UP: - pull_up(change_rate, jet) - Globals.ControllerCommand.PUSH_DOWN: - push_down(change_rate, jet) + Globals.ControllerCommand.PITCH_UP: + pitch_up(change_rate, jet) + Globals.ControllerCommand.PITCH_DOWN: + pitch_down(change_rate, jet) Globals.ControllerCommand.YAW_LEFT: yaw_left(change_rate, jet) Globals.ControllerCommand.YAW_RIGHT: @@ -40,10 +40,10 @@ func do_action( _: pass -func pull_up(change_rate: float, jet: Jet) -> void: +func pitch_up(change_rate: float, jet: Jet) -> void: jet.rotate_object_local(Vector3.RIGHT, change_rate * MIN_SPEED) -func push_down(change_rate: float, jet: Jet) -> void: +func pitch_down(change_rate: float, jet: Jet) -> void: jet.rotate_object_local(Vector3.LEFT, change_rate * MIN_SPEED) func yaw_left(change_rate: float, jet: Jet) -> void: