Week 6: player health, damage animation, enemy damage
This commit is contained in:
1 parent
94ad4f45cc
commit
77eccef08c
20 files changed
+416
-34
No files matched your search
+47
-15
@@ -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
@@ -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()
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
uid://cb4odxbsudi2y
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
@@ -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")
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://cv1at33pu2ae2
|
||||
Reference in new issue
Block a user