139 lines
3.8 KiB
GDScript
139 lines
3.8 KiB
GDScript
extends CharacterBody2D
|
|
|
|
const WALK_ACCEL = 50.0
|
|
const WALK_TOPSPEED = 160.0
|
|
|
|
const FLY_ACCEL = 50.0
|
|
const FLY_TOPSPEED = 200.0
|
|
|
|
const GRAVITY = 15.0
|
|
const FAST_FALL_VELOCITY = 500.0
|
|
|
|
var downward_velocity = 0.0
|
|
var max_downward_velocity = 1200.0
|
|
var fast_fall_max_downward_velocity = 1500.0
|
|
|
|
var fuel = 100.0
|
|
const jetpack_velocity = 10.0
|
|
|
|
var score = 0
|
|
|
|
var aim_direction = 1
|
|
|
|
const BULLET = preload("res://weapons/spreadshot/spread_shot.tscn")
|
|
const GRAZE_PARTICLES = preload("res://sprites/Player/graze_particles.tscn")
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
var axis = Input.get_axis("ui_left","ui_right")
|
|
if axis != 0: aim_direction = axis
|
|
#region ground movement
|
|
if axis != 0:
|
|
if velocity.y < 0:
|
|
move(FLY_ACCEL,FLY_TOPSPEED)
|
|
else:
|
|
move(WALK_ACCEL,WALK_TOPSPEED)
|
|
if is_on_floor():
|
|
%Sprite.play("walk")
|
|
else:
|
|
%Sprite.play("fly")
|
|
else:
|
|
velocity.x = move_toward(velocity.x, 0, WALK_ACCEL)
|
|
%Sprite.play("idle")
|
|
#endregion
|
|
#region gun
|
|
if Input.is_action_just_pressed("shoot"):
|
|
%ShootSound.play()
|
|
var bullet = BULLET.instantiate()
|
|
bullet.global_position = global_position
|
|
get_parent().add_child(bullet)
|
|
#endregion
|
|
#region jetpack flight
|
|
if Input.is_action_pressed("fly"):
|
|
if fuel > 0.0:
|
|
%Sprite.play("fly")
|
|
fuel -= 40.0 * delta
|
|
downward_velocity = 0.0
|
|
if %JetpackSound.is_playing() == false: %JetpackSound.play()
|
|
if %JetpackSound.pitch_scale < 1.25:
|
|
%JetpackSound.pitch_scale += 0.4 * delta
|
|
velocity.y -= jetpack_velocity
|
|
emit_fire(true)
|
|
|
|
else:
|
|
emit_fire(false)
|
|
else:
|
|
if %JetpackSound.pitch_scale > 0.4:
|
|
%JetpackSound.pitch_scale -= 0.1 * delta
|
|
emit_fire(false)
|
|
|
|
#endregion
|
|
if is_on_floor():
|
|
downward_velocity = 0.0
|
|
GlobalFunctions.append_score()
|
|
fuel = 100.0
|
|
silence_jetpack(delta)
|
|
else:
|
|
if Input.is_action_pressed("fast_fall"):
|
|
silence_jetpack(delta)
|
|
else:
|
|
%JetpackSound.volume_db = 0.0
|
|
|
|
if Input.is_action_pressed("fast_fall"):
|
|
downward_velocity += FAST_FALL_VELOCITY
|
|
downward_velocity = clamp(downward_velocity,0.0,fast_fall_max_downward_velocity)
|
|
velocity.y = clamp(velocity.y,velocity.y,fast_fall_max_downward_velocity)
|
|
else:
|
|
downward_velocity += GRAVITY
|
|
downward_velocity = clamp(downward_velocity,0.0,max_downward_velocity)
|
|
velocity.y = clamp(velocity.y,velocity.y,max_downward_velocity)
|
|
fuel -= 1 * delta
|
|
|
|
|
|
|
|
#jetpack pitch
|
|
|
|
velocity.y += downward_velocity * delta
|
|
move_and_slide()
|
|
#if event.is_action_pressed()
|
|
#endregion
|
|
|
|
|
|
func move(acceleration,topspeed):
|
|
var axis = Input.get_axis("ui_left","ui_right")
|
|
velocity.x += (axis * acceleration)
|
|
%Sprite.scale.x = axis
|
|
velocity.x = clamp(velocity.x,-topspeed,topspeed)
|
|
|
|
func silence_jetpack(delta):
|
|
%JetpackSound.pitch_scale = 1.0
|
|
%JetpackSound.volume_db -= 50 * delta
|
|
|
|
func emit_fire(emit:bool=true,lifetime:float=0.24):
|
|
get_tree().get_nodes_in_group("fire_particles")[0].emitting = emit
|
|
get_tree().get_nodes_in_group("fire_particles")[0].lifetime = lifetime
|
|
get_tree().get_nodes_in_group("fire_particles")[1].emitting = emit
|
|
get_tree().get_nodes_in_group("fire_particles")[1].lifetime = lifetime
|
|
|
|
func _on_area_2d_body_entered(body: Node2D) -> void:
|
|
if body.is_in_group("death"):
|
|
get_tree().reload_current_scene()
|
|
|
|
|
|
func _on_area_2d_area_entered(area: Area2D) -> void:
|
|
#if area.is_in_group("death") or area.is_in_group("hurt"):
|
|
#get_tree().reload_current_scene()
|
|
pass
|
|
|
|
|
|
func _on_hurtbox_area_entered(area: Area2D) -> void:
|
|
get_tree().reload_current_scene()
|
|
|
|
|
|
func _on_graze_hitbox_area_entered(area: Area2D) -> void:
|
|
if area.is_in_group("enemy_bullet"):
|
|
if area.get_parent().grazed == false:
|
|
GlobalFunctions.queue_score(0)
|
|
var graze_particle = GRAZE_PARTICLES.instantiate()
|
|
graze_particle.global_position = global_position
|
|
get_parent().add_child(graze_particle)
|
|
area.get_parent().grazed = true
|