From ce71477b7618390fa80f5e18dbad8f1b12d3ef1d Mon Sep 17 00:00:00 2001 From: GabriellePipo Date: Mon, 3 Feb 2025 21:02:52 -0500 Subject: [PATCH] bad guys, collectibles, levels --- .../assets/graphics/collectibles/coin.png | Bin 0 -> 500 bytes .../graphics/collectibles/coin.png.import | 34 ++ .../assets/graphics/enemies/slime_purple.png | Bin 0 -> 1030 bytes .../graphics/enemies/slime_purple.png.import | 34 ++ GodotProject/project.godot | 4 + GodotProject/scenes/coin.tscn | 114 +++++ GodotProject/scenes/game.tscn | 27 +- GodotProject/scenes/level2.tscn | 472 ++++++++++++++++++ GodotProject/scenes/purpleslime.tscn | 74 +++ GodotProject/scripts/coin.gd | 8 + GodotProject/scripts/gamecontroller.gd | 59 ++- GodotProject/scripts/purpleslime.gd | 27 + GodotProject/scripts/res/characterstats.gd | 5 + GodotProject/scripts/res/playerstats.tres | 9 + GodotProject/scripts/res/slimestats.tres | 9 + GodotProject/scripts/scene_manager.gd | 28 +- 16 files changed, 879 insertions(+), 25 deletions(-) create mode 100644 GodotProject/assets/graphics/collectibles/coin.png create mode 100644 GodotProject/assets/graphics/collectibles/coin.png.import create mode 100644 GodotProject/assets/graphics/enemies/slime_purple.png create mode 100644 GodotProject/assets/graphics/enemies/slime_purple.png.import create mode 100644 GodotProject/scenes/coin.tscn create mode 100644 GodotProject/scenes/level2.tscn create mode 100644 GodotProject/scenes/purpleslime.tscn create mode 100644 GodotProject/scripts/coin.gd create mode 100644 GodotProject/scripts/purpleslime.gd create mode 100644 GodotProject/scripts/res/characterstats.gd create mode 100644 GodotProject/scripts/res/playerstats.tres create mode 100644 GodotProject/scripts/res/slimestats.tres diff --git a/GodotProject/assets/graphics/collectibles/coin.png b/GodotProject/assets/graphics/collectibles/coin.png new file mode 100644 index 0000000000000000000000000000000000000000..01ae33d70b398db7f1f7bcafe883a0a469805201 GIT binary patch literal 500 zcmV^r!6hi!Wct>kSmw76A*+mkqIDVjdDL!Rb}5E?Td;C@2y9S zHih2xK(yTWh+gXdrTqK8Uwx^_$MoI4V|67Hn26^Qp-rJ*c_3P5d_*tx|6%^yEznE& zeE6^KHvJ|vI7934d=L#ytZIR)9hxaN1Jm8sZ6_j{Yx1#nTWt!D2<;1?{VNX?M*l~R zzukKP+i+D+FAlB;7qkOXfaGA?&h>EX&+$Oxqgs>{d4C#zhd05hUS`kO@{&+Bb`?-H zKXwYn7Ms9B!`F}PQh%-o65r;4=uy!A4;g>*6iCRL!wF!o{9{X0YM%Mf@U=DvM2}Kx zY#A;!e+4Y{Qh#m^NPMe5dkcj0f5`ZIy8@JYG2kpkh}LrU76{dHI?&Z}2LKX(>v1MX z4k6>OaQ_N1p97frj@jdSpELonJ&y=&3jN9h(K6#Bda3^x^WUBW>`ee7IfzLSUk<|l qVg27u071wNc?u+CjZ6R`YyJS*Ofbr5QwY-l0000$4CBvg?)Ed z_vO50>IiWPSm-r%m!<3^wh~P~_4RS~ zpI=Gub+-QhIeq%h`RaxX{5TJNc>dLzfkEQSwe9u4|AzdIT*^2{!A86~-QWe|7ymwB zC>Ti{|81}_`+UPPl@+TN=sEg&On58UrMgnvLQXF0_ys@bQ1@EdnLWo=s>t&5b6*sD zcFMcwU?tm(D_Xg)W-Wc$-E!h}Crjk()1K3gUwWA?xq;Wdw18cHo3k~Zx-$Fb`AU$*-@DD zmGPf?jG6V$dCTQj>{2>(Zt>F0fcfj}50vb4xa*Xko3|y%e%9UPUyOMTg5ncDvEEv- z-pIj{ckVgygWdnMA2Z(bzqjb#^{`seQ^pPQ$9_6a&90O2#S*<mC1;UMyZZkxfN& z@uKHWkGnrH91Z`H^EmwCk41a3FUGWg-!^5J_|wx1K5Uz!#D3x7Zw}ELVrNTt9P8IR z_1(WOXsY%rc>^6i*W&vj&+HC_UuW8s@vbNLPX_a void: + if body.is_in_group("player"): + coinCollected.emit() + queue_free() diff --git a/GodotProject/scripts/gamecontroller.gd b/GodotProject/scripts/gamecontroller.gd index f403b85..0e8e461 100644 --- a/GodotProject/scripts/gamecontroller.gd +++ b/GodotProject/scripts/gamecontroller.gd @@ -1,41 +1,74 @@ extends Node2D -var totalBoxes = 3 var timer:= Timer.new() var countdown = 10 -var totalCrates = 0 +var totalCrates := 0 +var cratesDestroyed := 0 +var totalCoins := 0 +var totalCoinsCollected := 0 +var totalEnemies := 0 +#level information +var levels = ["res://scenes/game.tscn","res://scenes/level2.tscn"] +var timers = [10,15] +var currentLevel = 0 + +var player:Resource +# signals from game controller signal destroyBox(body) - +signal levelComplete(levelToLoad) # Called when the node enters the scene tree for the first time. func _ready(): + player = load("res://scripts/res/playerstats.tres") + print("Player health: "+str(player.health)) + print("Number of levels: "+str(levels.size())) + reset() add_child(timer) timer.wait_time = 1 timer.one_shot = false timer.connect("timeout", secondCounter) - # timer.start() + timer.start() +func reset(): + countdown = timers[currentLevel] func secondCounter(): countdown -=1 + print("minus one") if countdown <=0: print("you lose") - get_tree().reload_current_scene() + levelComplete.emit(levels[currentLevel]) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): pass -func _on_trigger_alert(body): - totalBoxes -=1 - body.queue_free() - if totalBoxes <=0: - print("you won") - get_tree().reload_current_scene() +func coinCollected(): + print("gane cotroller knows coin collected") + totalCoinsCollected+=1 + +func playerDamaged(): + player.health -= 20 + print("game controller knows player damaged, health is now "+str(player.health)) func bulletHit(body): print("game controller knows bullet hit something") if body.is_in_group("destructable"): destroyBox.emit(body) - -func coutnCrates(value): + totalCrates -=1 + cratesDestroyed +=1 + body.queue_free() + if totalCrates <=0: + print("you won") + #refactor this --make it a single + currentLevel +=1 + if currentLevel >= levels.size(): + currentLevel = 0 + levelComplete.emit(levels[currentLevel]) + else: + print("crates remaining: "+str(totalCrates)) +# scene manager stuff +func countCrates(value): totalCrates = value +func countCoins(value): + totalCoins = value diff --git a/GodotProject/scripts/purpleslime.gd b/GodotProject/scripts/purpleslime.gd new file mode 100644 index 0000000..90a2816 --- /dev/null +++ b/GodotProject/scripts/purpleslime.gd @@ -0,0 +1,27 @@ +class_name purpleslime extends Area2D +@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D +@onready var rightray: RayCast2D = $rightray +@onready var leftray: RayCast2D = $leftray +@onready var rightfloorray: RayCast2D = $rightfloorray +@onready var leftfloorray: RayCast2D = $leftfloorray +const speed = 60 +var direction = 1 +#signals +signal playerDamage + +func _process(delta: float) -> void: + if not rightfloorray.is_colliding(): + direction = -1 + sprite.flip_h = true + #about to fall on the right + if not leftfloorray.is_colliding(): + direction = 1 + sprite.flip_h = false + #about to fall on the right + position.x += direction * speed * delta +func _on_body_entered(body: Node2D) -> void: + if body.is_in_group("player"): + print("bad guy collected") + playerDamage.emit() + if body.is_in_group("destructable"): + print("box hit") diff --git a/GodotProject/scripts/res/characterstats.gd b/GodotProject/scripts/res/characterstats.gd new file mode 100644 index 0000000..d10a15f --- /dev/null +++ b/GodotProject/scripts/res/characterstats.gd @@ -0,0 +1,5 @@ +class_name CharacterStats extends Resource + +@export var max_health:int = 100 +@export var starting_health:int = 100 +@export var health:int = 100 diff --git a/GodotProject/scripts/res/playerstats.tres b/GodotProject/scripts/res/playerstats.tres new file mode 100644 index 0000000..8fc2655 --- /dev/null +++ b/GodotProject/scripts/res/playerstats.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://bamuvf71pw641"] + +[ext_resource type="Script" path="res://scripts/res/characterstats.gd" id="1_6olhj"] + +[resource] +script = ExtResource("1_6olhj") +max_health = 100 +starting_health = 100 +health = 100 diff --git a/GodotProject/scripts/res/slimestats.tres b/GodotProject/scripts/res/slimestats.tres new file mode 100644 index 0000000..a1b58c7 --- /dev/null +++ b/GodotProject/scripts/res/slimestats.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://u3yqeui6rnih"] + +[ext_resource type="Script" path="res://scripts/res/characterstats.gd" id="1_smxrk"] + +[resource] +script = ExtResource("1_smxrk") +max_health = 60 +starting_health = 50 +health = 50 diff --git a/GodotProject/scripts/scene_manager.gd b/GodotProject/scripts/scene_manager.gd index a1c5393..452bbc9 100644 --- a/GodotProject/scripts/scene_manager.gd +++ b/GodotProject/scripts/scene_manager.gd @@ -1,22 +1,40 @@ extends Node -@onready var game: Node2D = $".." @onready var crates: Node2D = $"../crates" +@onready var coins: Node2D = $"../coins" +@onready var enemies: Node2D = $"../enemies" + var bullet = preload("res://scenes/bullet.tscn") var bulletArray:Array = [] var bulletMadeTotal:= 0 - var totalCrates := 0 # Called when the node enters the scene tree for the first time. func _ready() -> void: - game.destroyBox.connect(boxDestroy) + #give game controller number of crates + Gamecontroller.destroyBox.connect(boxDestroy) for obj in crates.get_children(): if obj.is_in_group("destructable"): #increase box counter totalCrates +=1 + var totalCoins = 0 + for obj in coins.get_children(): + if obj.is_in_group("collectibles"): + totalCoins+=1 + obj.coinCollected.connect(Gamecontroller.coinCollected) + var totalEnemies = 0 + for obj in enemies.get_children(): + if obj.is_in_group("enemies"): + totalEnemies += 1 + obj.playerDamage.connect(Gamecontroller.playerDamaged) + Gamecontroller.countCrates(totalCrates) + + #subscribe to vital events from the game controller + Gamecontroller.levelComplete.connect(changeLevel) + Gamecontroller.reset() - +func changeLevel(level): + get_tree().change_scene_to_file(level) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass @@ -45,7 +63,7 @@ func onBulletHit(bullet, body): bullet.setSpeed(0) print("Scene manager knows bullet hit") - game.bulletHit(body) + Gamecontroller.bulletHit(body) func boxDestroy(body): body.queue_free()