60 lines
2.7 KiB
GDScript
60 lines
2.7 KiB
GDScript
extends Node2D
|
|
|
|
class_name ShipEngine
|
|
|
|
@export var MaxSpeed : float = 200 #максимальная скорость без турбо режима
|
|
@export var MaxTurboSpeed : float = 300 #максимальная скорость в турбо режиме
|
|
@export var SpeedAcceleration : float = 50 #ускорение
|
|
@export var TurboFuelConsumption : float = 100 #потребление топлива в турбо режиме за секунду
|
|
@export var RotationSpeed : int = 90 #максимальная скорость поворота
|
|
|
|
@onready var Ship = get_parent()
|
|
|
|
var Speed = 0 #текущая скорость
|
|
var MinSpeed = MaxSpeed / -4 #минимальная скорость
|
|
var TurboEnabled = false
|
|
var AlternativeMovement = false
|
|
var DestinationAngle : float
|
|
var DestinationDifference : float
|
|
|
|
@onready var Hull = $"../Hull"
|
|
|
|
func _physics_process(delta):
|
|
|
|
|
|
if DestinationAngle - Ship.rotation_degrees == clamp(DestinationAngle - Ship.rotation_degrees, -180, 180):
|
|
DestinationDifference = DestinationAngle - Ship.rotation_degrees
|
|
else:
|
|
DestinationDifference = Ship.rotation_degrees - DestinationAngle
|
|
if DestinationDifference != clamp(DestinationDifference, -1, 1):
|
|
Ship.rotation_degrees += sign(DestinationDifference) * RotationSpeed * delta
|
|
else:
|
|
Ship.rotation_degrees = DestinationAngle
|
|
if !AlternativeMovement:
|
|
if Ship is MainShip: DestinationAngle = rad_to_deg(Ship.global_position.angle_to_point(get_global_mouse_position()))
|
|
else:
|
|
var RotationInput = Input.get_axis("rotateleft","rotateright")
|
|
DestinationAngle += RotationInput * RotationSpeed * delta
|
|
if DestinationAngle > 180: DestinationAngle = -180
|
|
if DestinationAngle < -180: DestinationAngle = 180
|
|
if Vector2.ZERO.distance_to(global_position) >= 5800: DestinationAngle = rad_to_deg(global_position.angle_to_point(Vector2.ZERO))
|
|
|
|
TurboEnabled = clamp(Input.get_action_raw_strength("turbo") * Hull.Fuel, 0, 1) if Ship is MainShip else (Ship.State == "runaway" and Hull.Fuel > 0)
|
|
var AccelerationInput = Input.get_axis("deccelerate", "accelerate") if Ship is MainShip else 1.0
|
|
if !TurboEnabled:
|
|
Speed = clamp(Speed + AccelerationInput * SpeedAcceleration * delta, MinSpeed, max(MaxSpeed, Speed))
|
|
if Speed > MaxSpeed:
|
|
Speed -= SpeedAcceleration * delta if AccelerationInput != -1 else 0
|
|
else:
|
|
if Hull.Fuel > 0:
|
|
Speed = clamp(Speed + SpeedAcceleration * delta, MinSpeed, MaxTurboSpeed)
|
|
if Speed > MaxSpeed:
|
|
Hull.Fuel -= TurboFuelConsumption * delta
|
|
if Hull.Fuel < 0:
|
|
Hull.Fuel = 0
|
|
|
|
Ship.velocity = Vector2.from_angle(Ship.rotation) * Speed
|
|
Ship.move_and_slide()
|
|
|
|
if Input.is_action_just_released("alternatemovement") and Ship is MainShip:
|
|
AlternativeMovement = !AlternativeMovement
|