Week 6: player health, damage animation, enemy damage

This commit is contained in:
AnicaCihla committed 2025-05-26 20:57:02 -04:00
1 parent 94ad4f45cc
commit 77eccef08c
20 files changed
+416 -34

No files matched your search

+47 -15
View File
@@ -1,4 +1,4 @@
class_name GameController extends Node2D
extends Node2D
var totalCrates = 3
var timeLimit = 10
@@ -12,13 +12,25 @@ var currentLevel = 0
var playerHealth = 100
var player:CharacterStats
var slime:CharacterStats
var enemiesDict = {}
signal levelCompleteSignal(level)
signal destroySignal(body)
signal playerDamage
signal playerDamage(health, maxHealth)
signal playerDeath
signal countDown(timeRemaining)
signal coinUpdate(totalCoins)
signal enemyHurt(enemy)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
func _ready() -> void:
#load custom resources for player and slime
player = load("res://scripts/res/playerstats.tres")
slime = load("res://scripts/res/slimestats.tres")
add_child(timer)
timer.wait_time = 1
timer.one_shot = false
@@ -28,6 +40,7 @@ func _ready() -> void:
func secondCounter():
print("tick "+str(timeLimit))
timeLimit -= 1
countDown.emit(timeLimit)
if timeLimit <= 0:
print("YOU LOSE...")
levelCompleteSignal.emit(levels[currentLevel])
@@ -50,32 +63,51 @@ func _on_trigger_fired(effect: Variant, body: Variant) -> void:
func _on_coin_collected(body, coin):
coinsCollectedTotal += 1
coinUpdate.emit(coinsCollectedTotal)
destroySignal.emit(coin)
print("GC knows coin collected")
func _on_player_damage(body, enemy):
if enemy is Slime:
print("slime attack!")
playerHealth -= 10
if playerHealth > 0:
print("Player damaged")
playerDamage.emit()
else:
print("Player dead")
playerDeath.emit()
#playerHealth -= slime.meleeDamage
playerHealth -= enemiesDict[enemy]["damage"]
if playerHealth > 0:
print("Player damaged")
playerDamage.emit(playerHealth, player.max_health)
else:
print("Player dead")
playerDeath.emit()
func addEnemyToLevel(enemy):
var randHealth = randi() % 20
var randDamage = randi() % 10
var enemyStat = {
"health":slime.health + randHealth,
"damage":slime.meleeDamage + randDamage
}
enemiesDict[enemy] = enemyStat
func numberOfCrates(value:int)->void:
totalCrates = value
func bulletDamage(body, bullet):
if body is Crate:
print("Crates remaining: " + str(totalCrates))
destroySignal.emit(body)
#if body is Crate:
# print("Crates remaining: " + str(totalCrates))
# destroySignal.emit(body)
if body is Slime:
enemiesDict[body]["health"] -= player.rangeDamage
print("Enemy Health "+str(enemiesDict[body]["health"]))
enemyHurt.emit(body)
if enemiesDict[body]["health"] <= 0:
destroySignal.emit(body)
enemiesDict.erase(body)
func reset():
timeLimit = timers[currentLevel]
playerHealth = 100
playerHealth = player.starting_health
func death():
print("player death animation complete")
levelCompleteSignal.emit(levels[currentLevel])
+15 -3
View File
@@ -19,7 +19,7 @@ const JUMP_VELOCITY = -400.0
@export var acceleration = 50
@export var hard_gravity = 5
enum State {IDLE, RUN, JUMP, FALLING, MELEE}
enum State {IDLE, RUN, JUMP, FALLING, MELEE, HURT, DEATH}
var current_state = State.IDLE
enum FaceDirection {LEFT, RIGHT}
@@ -32,11 +32,13 @@ var upJump: bool = false
signal deathComplete
func _player_damage():
func _player_damage(_currentHealth, _maxHealth):
print("Player taking damage!")
current_state = State.HURT
func _player_death():
print("Player dead!!!")
current_state = State.DEATH
func _physics_process(delta: float) -> void:
# Add the gravity.
@@ -46,7 +48,8 @@ func _physics_process(delta: float) -> void:
velocity += get_gravity() * hard_gravity * delta
# Handle input
handle_input()
if current_state != State.HURT and current_state != State.DEATH:
handle_input()
update_movement()
# Handle states and animation
@@ -140,6 +143,10 @@ func update_animation()->void:
player_graphic.play("fall")
State.MELEE:
player_graphic.play("melee")
State.HURT:
player_graphic.play("hurt")
State.DEATH:
player_graphic.play("death")
func handle_collisions() -> void:
for i in get_slide_collision_count():
@@ -173,3 +180,8 @@ func _on_animation_finished() -> void:
upJump = false
State.MELEE:
current_state = State.IDLE
State.HURT:
current_state = State.IDLE
State.DEATH:
print("Death animation finished")
deathComplete.emit()
+8
View File
@@ -0,0 +1,8 @@
class_name CharacterStats extends Resource
@export var max_health:int = 100
@export var starting_health:int = 100
@export var health:int = 100
@export var meleeDamage:int = 10
@export var rangeDamage:int = 0
+1
View File
@@ -0,0 +1 @@
uid://cb4odxbsudi2y
+12
View File
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://d2w3olbk7mqqq"]
[ext_resource type="Script" uid="uid://cb4odxbsudi2y" path="res://scripts/res/characterstats.gd" id="1_4nldt"]
[resource]
script = ExtResource("1_4nldt")
max_health = 100
starting_health = 100
health = 100
meleeDamage = 10
rangeDamage = 30
metadata/_custom_type_script = "uid://cb4odxbsudi2y"
+12
View File
@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://b4ilwsa0a21fi"]
[ext_resource type="Script" uid="uid://cb4odxbsudi2y" path="res://scripts/res/characterstats.gd" id="1_fftob"]
[resource]
script = ExtResource("1_fftob")
max_health = 50
starting_health = 50
health = 50
meleeDamage = 40
rangeDamage = 0
metadata/_custom_type_script = "uid://cb4odxbsudi2y"
+7
View File
@@ -5,6 +5,7 @@ extends Node
@onready var coins: Node2D = $"../Coins"
@onready var enemies: Node2D = $"../Enemies"
@onready var player: Player = $"../CharacterBody2D"
@onready var control: Control = $"../CanvasLayer/Control"
var bullet = preload("res://scenes/bullet.tscn")
var bulletArray = []
@@ -29,9 +30,13 @@ func buildLevel() -> void:
Gamecontroller.levelCompleteSignal.connect(loadLevel)
Gamecontroller.destroySignal.connect(destroy)
Gamecontroller.playerDamage.connect(player._player_damage)
Gamecontroller.playerDamage.connect(control.healthUpdate)
Gamecontroller.coinUpdate.connect(control.coinsUpdate)
Gamecontroller.playerDeath.connect(player._player_death)
# player connection
player.deathComplete.connect(Gamecontroller.death)
# UI signals
Gamecontroller.countDown.connect(control.timerUpdate)
# Connect trigger signals
if triggers:
@@ -48,6 +53,8 @@ func buildLevel() -> void:
for obj in enemies.get_children():
if obj is Slime:
obj.playerDamageSignal.connect(Gamecontroller._on_player_damage)
Gamecontroller.enemyHurt.connect(obj.damage)
Gamecontroller.addEnemyToLevel(obj)
func countCrates()->int:
# count crates
+20 -5
View File
@@ -11,14 +11,29 @@ var speed = 100
var direction = 1
func _process(delta: float) -> void:
if not right_down_cast.is_colliding() or right_side_cast.is_colliding():
if not right_down_cast.is_colliding():
direction = -1
sprite.flip_h = true
if not left_down_cast.is_colliding() or left_side_cast.is_colliding():
if right_side_cast.is_colliding():
if not right_side_cast.get_collider() is Player:
direction = -1
sprite.flip_h = true
if not left_down_cast.is_colliding():
direction = 1
sprite.flip_h = false
if left_side_cast.is_colliding():
if not left_side_cast.get_collider() is Player:
direction = 1
sprite.flip_h = false
position.x += direction * speed * delta
func _on_body_entered(body: Node2D) -> void:
print("Slime Contact")
playerDamageSignal.emit(body, self)
func _on_body_entered(body: Node2D) -> void:
if body is Player:
print("Slime Contact")
playerDamageSignal.emit(body, self)
func damage(body)->void:
if body == self:
sprite.play("hurt")
+17
View File
@@ -0,0 +1,17 @@
extends Control
@onready var health: Label = $VBoxContainer/HBoxContainer/MarginContainer/Health
@onready var timer: Label = $VBoxContainer/HBoxContainer/MarginContainer2/Timer
@onready var coins: Label = $VBoxContainer/HBoxContainer/MarginContainer3/Coins
func _ready() -> void:
pass
func healthUpdate(currentHealth, maxHealth) -> void:
health.text = "Health: "+str(currentHealth)+"/"+str(maxHealth)
func coinsUpdate(currentCoins) -> void:
coins.text = "Coins: "+str(currentCoins)
func timerUpdate(currentTimer) -> void:
timer.text = "Timer: "+str(currentTimer)
+1
View File
@@ -0,0 +1 @@
uid://cv1at33pu2ae2