From a360f8e84fb552617fdec14b26956742255433fb Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 13 Apr 2026 20:36:57 -0400 Subject: [PATCH] final week --- .../player/death/Player Death 64x64.png | Bin 0 -> 1584 bytes .../death/Player Death 64x64.png.import | 40 ++++ .../player/hurt/Player Hurt 48x48.png | Bin 0 -> 1448 bytes .../player/hurt/Player Hurt 48x48.png.import | 40 ++++ project.godot | 10 + scenes/game.tscn | 69 ++++--- scenes/level2.tscn | 5 + scenes/level3.tscn | 5 + scenes/player.tscn | 189 +++++++++++++++++- scenes/ui.tscn | 48 +++++ scripts/SceneManager.gd | 13 +- scripts/gameController.gd | 35 +++- scripts/player.gd | 23 ++- scripts/rscs/charecterStats.gd | 11 + scripts/rscs/charecterStats.gd.uid | 1 + scripts/rscs/playerStats.tres | 7 + scripts/rscs/slimeStats.tres | 12 ++ scripts/ui.gd | 16 ++ scripts/ui.gd.uid | 1 + 19 files changed, 481 insertions(+), 44 deletions(-) create mode 100644 assets/graphics/player/death/Player Death 64x64.png create mode 100644 assets/graphics/player/death/Player Death 64x64.png.import create mode 100644 assets/graphics/player/hurt/Player Hurt 48x48.png create mode 100644 assets/graphics/player/hurt/Player Hurt 48x48.png.import create mode 100644 scenes/ui.tscn create mode 100644 scripts/rscs/charecterStats.gd create mode 100644 scripts/rscs/charecterStats.gd.uid create mode 100644 scripts/rscs/playerStats.tres create mode 100644 scripts/rscs/slimeStats.tres create mode 100644 scripts/ui.gd create mode 100644 scripts/ui.gd.uid diff --git a/assets/graphics/player/death/Player Death 64x64.png b/assets/graphics/player/death/Player Death 64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..2e6a1ae0514b237d754893f563c87ba5f95dc109 GIT binary patch literal 1584 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 void: # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - pass + if Input.is_action_just_pressed("save"): + print("save the game") + if Input.is_action_just_pressed("load"): + print("load the game") func buildLevel()->void: print("building level") @@ -31,6 +36,12 @@ func buildLevel()->void: Gamecontroller.destroySignal.connect(destroy) Gamecontroller.teleportSignal.connect(teleport) Gamecontroller.levelChangeSignal.connect(loadLevel) + Gamecontroller.playerDamageSignal.connect(player.playerDamage) + Gamecontroller.playerDamageSignal.connect(ui.updateHealth) + Gamecontroller.playerDeathSignal.connect(player.playerDead) + Gamecontroller.countDownSignal.connect(ui.updateTimer) + Gamecontroller.coinsCollectedSignal.connect(ui.updateCoins) + player.deathAnimationCompleteSignal.connect(Gamecontroller.loadLevel) func updateEnemies()->void: if slimes: var totalSlimes = 0 diff --git a/scripts/gameController.gd b/scripts/gameController.gd index 4b12228..0bb9ac4 100644 --- a/scripts/gameController.gd +++ b/scripts/gameController.gd @@ -4,6 +4,10 @@ var crateTotal = 0 signal destroySignal(body) signal teleportSignal(body) signal levelChangeSignal(level) +signal playerDamageSignal(health, maxHealth) +signal playerDeathSignal +signal countDownSignal(timeRemaning) +signal coinsCollectedSignal(totalCoinsCollected, coinsRemaning) var currentScene:String = "res://scenes/game.tscn" var timer := Timer.new() @@ -19,8 +23,15 @@ var playerHealth = 100 var playerStartingHealth = 100 var enemiesDict={} + +var enemy:CharectorStats +var player:CharectorStats + + # Called when the node enters the scene tree for the first time. func _ready() -> void: + enemy = load("res://scripts/rscs/slimeStats.tres") + player = load("res://scripts/rscs/playerStats.tres") get_window().grab_focus() add_child(timer) timer.wait_time = 1 @@ -30,10 +41,12 @@ func _ready() -> void: func reset()->void: timeAvailable = timers[currentLevel] - playerHealth = playerStartingHealth + playerHealth = player.starting_health + coinsCollected = 0 func secondCounter()->void: timeAvailable -=1 + countDownSignal.emit(timeAvailable) if timeAvailable <=0: print("YOU LOST YOU ARE A LOSER YOU SUCK") levelChangeSignal.emit(levels[currentLevel]) @@ -72,7 +85,7 @@ func bulletDamage(body:Node2D, bullet:Bullet)->void: destroySignal.emit(body) destroySignal.emit(bullet) if body is Slime: - enemiesDict[body]["health"] -= 10 + enemiesDict[body]["health"] -= player.rangeDamage if enemiesDict[body]["health"] <= 0: destroySignal.emit(body) destroySignal.emit(bullet) @@ -84,6 +97,7 @@ func _on_coin_collected(body:Node2D, coin:Coin): func totalCoins(value)->void: print("GC know coins remaning "+str(value)) + coinsCollectedSignal.emit(coinsCollected, value) if value <= 0: currentLevel += 1 if currentLevel >= levels.size(): @@ -93,12 +107,19 @@ func _on_slime_damage(boyd:Node2D, slime:Slime)->void: playerHealth -= enemiesDict[slime]["damage"] print("GC DAMAGE THE PLAYER AND KILL THEM "+str(playerHealth)) if playerHealth <=0: - print(" YOU DED ") - levelChangeSignal.emit(levels[currentLevel]) + print("YOU Dieded") + playerDeathSignal.emit() + #levelChangeSignal.emit(levels[currentLevel]) + else: + #damage + playerDamageSignal.emit(playerHealth, player.max_health) func addEnemyToLevel(slime:Slime)->void: - var randDamage:int = randi()%10 + #var randDamage:int = randi()%10 var enemyStat = { - "health":50, - "damage":randDamage + "health":enemy.starting_health, + "damage":enemy.meleeDamage } enemiesDict[slime]=enemyStat + +func loadLevel()->void: + levelChangeSignal.emit(levels[currentLevel]) diff --git a/scripts/player.gd b/scripts/player.gd index c65a487..cff7fc5 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -10,15 +10,17 @@ const BUMP_POWER = 1000 enum FaceDirection{LEFT, RIGHT} var facing:FaceDirection = FaceDirection.RIGHT var direction -enum PlayerState{IDLE,RUNNING,JUMPING,FALLING} +enum PlayerState{IDLE,RUNNING,JUMPING,FALLING,HURT,DEATH,SPAWN} var current_player_state:PlayerState = PlayerState.IDLE var jumpUp:bool = false +signal deathAnimationCompleteSignal + func _physics_process(delta: float) -> void: #Handle Shoot - - handle_input() + if current_player_state != PlayerState.DEATH: + handle_input() handle_movement(delta) handle_state() handle_animation() @@ -76,6 +78,10 @@ func handle_animation()->void: player_graphic.play("jumping") PlayerState.FALLING: player_graphic.play("falling") + PlayerState.HURT: + player_graphic.play("hurt") + PlayerState.DEATH: + player_graphic.play("death") func handle_movement(delta)->void: # Add the gravity. @@ -104,3 +110,14 @@ func _on_animation_finished() -> void: match current_player_state: PlayerState.JUMPING: jumpUp = false + PlayerState.HURT: + current_player_state = PlayerState.IDLE + PlayerState.DEATH: + deathAnimationCompleteSignal.emit() + +func playerDamage(health, maxHealth) ->void: + print("c") + current_player_state = PlayerState.HURT +func playerDead()-> void: + print("You FINALY DIED") + current_player_state = PlayerState.DEATH diff --git a/scripts/rscs/charecterStats.gd b/scripts/rscs/charecterStats.gd new file mode 100644 index 0000000..10c6e94 --- /dev/null +++ b/scripts/rscs/charecterStats.gd @@ -0,0 +1,11 @@ +class_name CharectorStats extends Resource + +@export_category("Health") +@export var health:int = 100 +@export var max_health:int = 100 +@export var starting_health:int = 100 + +#damage +@export_category("Damage") +@export var meleeDamage:int =10 +@export var rangeDamage: int =5 diff --git a/scripts/rscs/charecterStats.gd.uid b/scripts/rscs/charecterStats.gd.uid new file mode 100644 index 0000000..144ac98 --- /dev/null +++ b/scripts/rscs/charecterStats.gd.uid @@ -0,0 +1 @@ +uid://b7u1be28qy8ye diff --git a/scripts/rscs/playerStats.tres b/scripts/rscs/playerStats.tres new file mode 100644 index 0000000..0797df2 --- /dev/null +++ b/scripts/rscs/playerStats.tres @@ -0,0 +1,7 @@ +[gd_resource type="Resource" script_class="CharectorStats" format=3 uid="uid://omvjulu840js"] + +[ext_resource type="Script" uid="uid://b7u1be28qy8ye" path="res://scripts/rscs/charecterStats.gd" id="1_sqkfu"] + +[resource] +script = ExtResource("1_sqkfu") +metadata/_custom_type_script = "uid://b7u1be28qy8ye" diff --git a/scripts/rscs/slimeStats.tres b/scripts/rscs/slimeStats.tres new file mode 100644 index 0000000..6d189db --- /dev/null +++ b/scripts/rscs/slimeStats.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="CharectorStats" format=3 uid="uid://dep2ewei086m4"] + +[ext_resource type="Script" uid="uid://b7u1be28qy8ye" path="res://scripts/rscs/charecterStats.gd" id="1_ppipo"] + +[resource] +script = ExtResource("1_ppipo") +health = 20 +max_health = 30 +starting_health = 20 +meleeDamage = 20 +rangeDamage = 0 +metadata/_custom_type_script = "uid://b7u1be28qy8ye" diff --git a/scripts/ui.gd b/scripts/ui.gd new file mode 100644 index 0000000..82d5c52 --- /dev/null +++ b/scripts/ui.gd @@ -0,0 +1,16 @@ +class_name UI 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: + health.text = "Hi MOM" + +func updateTimer(timerValue)->void: + timer.text =str(timerValue) + +func updateHealth(healthValue, maxHealth)->void: + health.text = str(healthValue) + +func updateCoins(collectedCoins, coinsRemaning)->void: + coins.text=str(collectedCoins)+" of "+str(coinsRemaning+collectedCoins) diff --git a/scripts/ui.gd.uid b/scripts/ui.gd.uid new file mode 100644 index 0000000..2cd240b --- /dev/null +++ b/scripts/ui.gd.uid @@ -0,0 +1 @@ +uid://dcpm4dbhpfksa