starcheese/spaceship.gd

61 lines
1.8 KiB
GDScript

extends CharacterBody2D
@export var acceleration: float = 400.0
@export var max_speed: float = 1500.0
@export var rotation_speed: float = 3.0
@export var friction: float = 0.99
@onready var laser := $mining_beam_turret/mining_beam
var weapons_system: WeaponsSystem
var event_bus: EventBus
func _ready():
weapons_system = get_node("/root/Main/WeaponsSystem")
event_bus = get_node("/root/Main/MainEventBus")
event_bus.subscribe_to(get_node("/root/Main/InputEventScope"), "KeyboardInputEvent", Callable(self, "handle_keyboard_input"))
func get_spaceship_orientation_vector() -> Vector2:
return -global_transform.y
func handle_movement(delta: float) -> void:
var thrust = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
thrust = Vector2(1, 0).rotated(rotation) * acceleration * delta
velocity += thrust
if Input.is_action_pressed("ui_down"):
thrust = Vector2(-1, 0).rotated(rotation) * acceleration * delta
velocity += thrust
if Input.is_action_pressed("ui_left"):
rotation -= rotation_speed * delta
if Input.is_action_pressed("ui_right"):
rotation += rotation_speed * delta
velocity = velocity.clamp(Vector2(-max_speed, -max_speed), Vector2(max_speed, max_speed))
velocity *= friction
var collision = move_and_collide(velocity * delta)
if collision:
print("Collided with: ", collision.get_collider().name)
var collision_normal = collision.get_normal()
velocity = velocity.slide(collision_normal)
func _unhandled_input(event: InputEvent) -> void:
if not event.is_action("fire_weapon"):
return
laser.is_casting = event.is_action_pressed("fire_weapon")
func handle_keyboard_input(event: KeyboardInputEvent):
if event.action == "ui_fire":
if event.pressed:
weapons_system.fire_all()
else:
weapons_system.cease_fire_all()
func _process(delta: float) -> void:
handle_movement(delta)