multi levels, collectibles, enemies, started player damage or death

This commit is contained in:
OddlyTimbot committed 2025-05-12 20:55:34 -04:00
1 parent 54f9fda72e
commit 7f787903b7
18 files changed
+1460 -39

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
class_name Coin extends Area2D
signal coinCollectedSignal(body, coin)
func _on_body_entered(body: Node2D) -> void:
print("Coin collision")
coinCollectedSignal.emit(body, self)
+1
View File
@@ -0,0 +1 @@
uid://cp61o6khv0k24
+48 -9
View File
@@ -3,6 +3,19 @@ var totalCrates = 3
var timeLimit = 10
var timer = Timer.new()
var coinsCollectedTotal := 0
var levels = ["res://scenes/game.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
var timers = [10, 15, 25]
var currentLevel = 0
var playerHealth = 100
signal levelCompleteSignal(level)
signal destroySignal(body)
signal playerDamage
signal playerDeath
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
add_child(timer)
@@ -14,27 +27,53 @@ func secondCounter():
timeLimit -=1
if timeLimit <= 0:
get_tree().reload_current_scene()
#loser!!!!
levelCompleteSignal.emit(levels[currentLevel])
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
if totalCrates == 0:
print("YOU WIN!")
currentLevel +=1
if currentLevel >= levels.size():
currentLevel = 0
levelCompleteSignal.emit(levels[currentLevel])
func _on_trigger_fired(effect: Variant, body: Variant) -> void:
print("Game controller knows :: "+effect)
if effect=="destroy":
totalCrates -= 1
print("Crates Remaining " + str(totalCrates) )
body.queue_free()
if totalCrates == 0:
print("YOU WIN!")
get_tree().reload_current_scene()
if body is Crate:
print("Crates Remaining " + str(totalCrates) )
destroySignal.emit(body)
func _on_coin_collected(body, coin):
coinsCollectedTotal += 1
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()
func numberOfCrates(value):
totalCrates = value
print("Total crates at GC: "+str(totalCrates) )
func bulletDamage(body, bullet):
print("Game controller knows about bullet hit")
func reset():
timeLimit = timers[currentLevel]
playerHealth = 100
func death():
print("player death animation complete")
+7
View File
@@ -29,6 +29,13 @@ var pushTarget:RigidBody2D
var pushEnabled:bool = false
var upJump:bool = false
signal deathComplete
func _player_damage():
print("Player taking damage!")
func _player_death():
print("Player dead!!")
func _physics_process(delta: float) -> void:
+45 -4
View File
@@ -1,20 +1,52 @@
extends Node
@onready var game: GameController = $".."
@onready var crates: Node2D = $"../crates"
@onready var triggers: Node2D = $"../triggers"
@onready var coins: Node2D = $"../coins"
@onready var enemies: Node2D = $"../enemies"
@onready var player: Player = $"../CharacterBody2D"
var bullet = preload("res://scenes/bullet.tscn")
var bulletArray=[]
var totalAllowedBullets = 7
func buildLevel()->void:
Gamecontroller.reset()
#count crates
# tell the game controller
Gamecontroller.numberOfCrates( countCrates() )
if triggers:
for obj in triggers.get_children():
if obj is Trigger:
obj.triggerFired.connect(Gamecontroller._on_trigger_fired)
# coins
if coins:
for obj in coins.get_children():
if obj is Coin:
obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected)
# enemies
if enemies:
for obj in enemies.get_children():
if obj is Slime:
obj.playerDamageSignal.connect(Gamecontroller._on_player_damage)
#Wire up signals
Gamecontroller.levelCompleteSignal.connect(loadLevel)
Gamecontroller.destroySignal.connect(destroy)
Gamecontroller.playerDamage.connect(player._player_damage)
Gamecontroller.playerDeath.connect(player._player_death)
#player connection
player.deathComplete.connect(Gamecontroller.death)
func countCrates()->int:
var totalCrates = 0
for obj in crates.get_children():
if obj is Crate:
totalCrates +=1
# tell the game controller
game.numberOfCrates(totalCrates)
return totalCrates
func _ready() -> void:
buildLevel()
@@ -24,7 +56,7 @@ func bulletFactory():
if bulletArray.size() < totalAllowedBullets:
#new bullet
mybullet = bullet.instantiate()
mybullet.connect("bulletHit", game.bulletDamage)
mybullet.connect("bulletHit", Gamecontroller.bulletDamage)
owner.add_child(mybullet)
else:
#recycled bullet
@@ -38,3 +70,12 @@ func makeBullet(position, speed):
var mybullet = bulletFactory()
mybullet.setSpeed(speed)
mybullet.transform = position
func loadLevel(level):
get_tree().call_deferred("change_scene_to_file", level)
func destroy(body):
if body is Crate:
Gamecontroller.numberOfCrates( countCrates() -1 )
body.queue_free()
+24
View File
@@ -0,0 +1,24 @@
class_name Slime extends Area2D
signal playerDamageSignal(body, slime)
@onready var right_side_cast: RayCast2D = $RightSideCast
@onready var right_down_cast: RayCast2D = $RightDownCast
@onready var left_down_cast: RayCast2D = $LeftDownCast
@onready var left_side_cast: RayCast2D = $LeftSideCast
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
var speed = 100
var direction = 1
func _process(delta: float) -> void:
if not right_down_cast.is_colliding() or right_side_cast.is_colliding():
direction = -1
sprite.flip_h = true
if not left_down_cast.is_colliding() or left_side_cast.is_colliding():
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)
+1
View File
@@ -0,0 +1 @@
uid://bk0hrjj1738iy
+1 -1
View File
@@ -1,4 +1,4 @@
extends Area2D
class_name Trigger extends Area2D
@export var effect = "destroy"