LD54_Box_Survival/PlayerCharacterBody2D.gd

133 lines
4 KiB
GDScript

extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -800.0
const DEFAULT_COLOR = Color(0.7, 0.7, 0.85)
const HURT_COLOR = Color(1.0, 0.2, 0.2)
const HURT_TIME = 0.5
const MAX_PARTICLE_VELOCITY = 1500
const MIN_PARTICLE_VELOCITY = 550
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
var health = 5
var hurt_timer = 0.0
@onready var text_label = $TimerLabel
var text_timer = 0.0
var text_format = "%.1f"
@onready var health_label = $HPLabel
var health_text_format = "%d"
@onready var self_sprite = $Sprite2D
var particle = preload("res://circleParticle.tscn")
@onready var hit_sfx = $HitSFX
@onready var jump_sfx = $JumpSFX
@onready var title_text = $GameTitleText
var title_timer = 5.0
@onready var touch_jump = $JumpTouchButton
@onready var touch_left = $LeftTouchButton
@onready var touch_right = $RightTouchButton
@onready var jump_label = $JumpTouchButton/JumpLabel
@onready var left_label = $LeftTouchButton/LeftLabel
@onready var right_label = $RightTouchButton/RightLabel
func _ready():
self_sprite.self_modulate = DEFAULT_COLOR
health_label.text = health_text_format % health
title_text.add_theme_font_size_override("normal_font_size", 40)
title_text.add_text("LD54 - Box Survival\nBy: BurnedKirby\nMade in Godot\nWAD or Touch to move")
var somewhat_transparent_color = Color(1, 1, 1, 0.3)
text_label.label_settings.font_color = somewhat_transparent_color
health_label.label_settings.font_color = somewhat_transparent_color
jump_label.label_settings.font_color = somewhat_transparent_color
left_label.label_settings.font_color = somewhat_transparent_color
right_label.label_settings.font_color = somewhat_transparent_color
func _physics_process(delta):
if title_timer > 0.0:
title_timer -= delta
if title_timer < 0.0:
title_timer = 0.0
title_text.get_parent().remove_child(title_text)
var white = Color(1, 1, 1, 1)
text_label.label_settings.font_color = white
health_label.label_settings.font_color = white
jump_label.label_settings.font_color = white
left_label.label_settings.font_color = white
right_label.label_settings.font_color = white
if health <= 0:
return
text_timer += delta
text_label.text = text_format % text_timer
# Add the gravity.
if not is_on_floor():
velocity.y += gravity * delta
# Handle Jump.
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = JUMP_VELOCITY
jump_sfx.play()
if Input.is_action_just_released("jump") and velocity.y < 0.0:
velocity.y /= 3.0
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var direction = Input.get_axis("left", "right")
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide()
hurt_timer -= delta
if hurt_timer < 0.0:
hurt_timer = 0.0
self_sprite.self_modulate = DEFAULT_COLOR
func spawn_particle(color):
var particle_instance = particle.instantiate()
particle_instance.find_child("Sprite2D").self_modulate = color
var random_angle = randf_range(0.0, PI * 2.0)
particle_instance.position = self.position
var vel = randf_range(MIN_PARTICLE_VELOCITY, MAX_PARTICLE_VELOCITY)
particle_instance.linear_velocity = Vector2(cos(random_angle) * vel, sin(random_angle) * vel)
get_parent().add_child(particle_instance)
func damaged(projectile):
var projectile_color = projectile.find_child("Sprite2D").self_modulate
for i in range(50):
spawn_particle(projectile_color)
if hurt_timer == 0.0:
health -= 1
health_label.text = health_text_format % health
self_sprite.self_modulate = HURT_COLOR
hurt_timer = HURT_TIME
hit_sfx.play()
if health <= 0:
velocity = Vector2(0, 0)
collision_layer = 0
collision_mask = 0
self_sprite.self_modulate = Color(0, 0, 0, 0)
for i in range(100):
spawn_particle(Color(1, 1, 1))
get_parent().on_player_death()
touch_jump.hide()
touch_left.hide()
touch_right.hide()