Week 5: multi-levels, collectibles, enemies, started player damage
This commit is contained in:
1 parent
c358c54487
commit
94ad4f45cc
19 files changed
+1428
-26
No files matched your search
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://cwfj4njnlumvy
|
||||
@@ -0,0 +1,81 @@
|
||||
class_name GameController extends Node2D
|
||||
|
||||
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 = [30, 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)
|
||||
timer.wait_time = 1
|
||||
timer.one_shot = false
|
||||
timer.connect("timeout", secondCounter)
|
||||
timer.start()
|
||||
|
||||
func secondCounter():
|
||||
print("tick "+str(timeLimit))
|
||||
timeLimit -= 1
|
||||
if timeLimit <= 0:
|
||||
print("YOU LOSE...")
|
||||
levelCompleteSignal.emit(levels[currentLevel])
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
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("GameController know about trigger " + effect)
|
||||
if effect == "destroy":
|
||||
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:int)->void:
|
||||
totalCrates = value
|
||||
|
||||
func bulletDamage(body, bullet):
|
||||
if body is Crate:
|
||||
print("Crates remaining: " + str(totalCrates))
|
||||
destroySignal.emit(body)
|
||||
|
||||
func reset():
|
||||
timeLimit = timers[currentLevel]
|
||||
playerHealth = 100
|
||||
|
||||
func death():
|
||||
print("player death animation complete")
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://dtod1rsvbxyti
|
||||
+13
-5
@@ -30,6 +30,14 @@ var pushTarget: RigidBody2D
|
||||
var pushEnable: 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:
|
||||
# Add the gravity.
|
||||
if current_state == State.JUMP:
|
||||
@@ -137,21 +145,21 @@ func handle_collisions() -> void:
|
||||
for i in get_slide_collision_count():
|
||||
var c = get_slide_collision(i)
|
||||
if c.get_collider() is RigidBody2D:
|
||||
c.get_collider().apply_central_impulse(-c.get_normal() * bump_power)
|
||||
c.get_collider().apply_central_impulse(-c.get_normal() * bump_power)
|
||||
|
||||
if right_cast.is_colliding() and facing == FaceDirection.RIGHT:
|
||||
print("Right raycast hitting something")
|
||||
#print("Right raycast hitting something")
|
||||
var collider = right_cast.get_collider()
|
||||
if collider is Node and collider is RigidBody2D:
|
||||
print("I think it's a crate")
|
||||
#print("I think it's a crate")
|
||||
pushTarget = collider
|
||||
pushEnable = true
|
||||
|
||||
if left_cast.is_colliding() and facing == FaceDirection.LEFT:
|
||||
print("Left raycast hitting something")
|
||||
#print("Left raycast hitting something")
|
||||
var collider = left_cast.get_collider()
|
||||
if collider is Node and collider is RigidBody2D:
|
||||
print("I think it's a crate")
|
||||
#print("I think it's a crate")
|
||||
pushTarget = collider
|
||||
pushEnable = true
|
||||
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
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 = []
|
||||
@@ -18,21 +21,48 @@ func _process(delta: float) -> void:
|
||||
|
||||
|
||||
func buildLevel() -> void:
|
||||
# Reset controller timer
|
||||
Gamecontroller.reset()
|
||||
# tell the game controller
|
||||
Gamecontroller.numberOfCrates(countCrates())
|
||||
# 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)
|
||||
|
||||
# Connect trigger signals
|
||||
if triggers:
|
||||
for obj in triggers.get_children():
|
||||
if obj is Trigger:
|
||||
obj.triggerFired.connect(Gamecontroller._on_trigger_fired)
|
||||
# Connect coin signals
|
||||
if coins:
|
||||
for obj in coins.get_children():
|
||||
if obj is Coin:
|
||||
obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected)
|
||||
# Connect enemy signals
|
||||
if enemies:
|
||||
for obj in enemies.get_children():
|
||||
if obj is Slime:
|
||||
obj.playerDamageSignal.connect(Gamecontroller._on_player_damage)
|
||||
|
||||
func countCrates()->int:
|
||||
# count crates
|
||||
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 bulletFactory():
|
||||
var mybullet
|
||||
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
|
||||
@@ -46,3 +76,11 @@ 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()
|
||||
@@ -0,0 +1,24 @@
|
||||
class_name Slime extends Area2D
|
||||
signal playerDamageSignal(body, slime)
|
||||
|
||||
@onready var right_side_cast: RayCast2D = $RightSideCast
|
||||
@onready var left_side_cast: RayCast2D = $LeftSideCast
|
||||
@onready var right_down_cast: RayCast2D = $RightDownCast
|
||||
@onready var left_down_cast: RayCast2D = $LeftDownCast
|
||||
@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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://bsmcx4pr1imsq
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
extends Area2D
|
||||
class_name Trigger extends Area2D
|
||||
|
||||
@export var effect = "destroy"
|
||||
|
||||
|
||||
Reference in new issue
Block a user