multi levels, closed loop for coins, custom resources for character stats, enemy attacks, player attacks, started enemy movement
This commit is contained in:
1 parent
8d07c7630f
commit
b40f2baaa7
17 files changed
+981
-52
No files matched your search
@@ -3,6 +3,8 @@ class_name Bullet extends Area2D
|
||||
var speed:float = 700
|
||||
@onready var bullet_graphic: Sprite2D = $BulletGraphic
|
||||
|
||||
signal bulletDamageSignal(area, bullet)
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
pass # Replace with function body.
|
||||
@@ -16,3 +18,7 @@ func setSpeed(value)->void:
|
||||
speed = value
|
||||
if speed<0:
|
||||
bullet_graphic.flip_h = true
|
||||
|
||||
|
||||
func _on_area_entered(area: Area2D) -> void:
|
||||
bulletDamageSignal.emit(area, self)
|
||||
@@ -16,3 +16,6 @@ func _on_body_entered(body: Node2D) -> void:
|
||||
print("body entered in coin")
|
||||
if body is Player:
|
||||
coinCollectedSignal.emit(body, self)
|
||||
if body is Grenade:
|
||||
body.queue_free()
|
||||
self.queue_free()
|
||||
+89
-17
@@ -3,53 +3,125 @@ extends Node2D
|
||||
var totalCrates = 2 #This will be updated in the future, see SceneManager
|
||||
var cratesDestroyed = 0
|
||||
var timeLimit = 10
|
||||
var timer:= Timer.new()
|
||||
#var timer:= Timer.new()
|
||||
#var timerLabel =
|
||||
|
||||
var coinsCollectedTotal:int = 0
|
||||
var totalCoinsAvailable:int = 0
|
||||
|
||||
var levels = ["res://scenes/game.tscn", "res://scenes/level2.tscn", "res://scenes/level3.tscn"]
|
||||
var timers = [6, 10, 15]
|
||||
var timeAvailable:int = 0
|
||||
var currentLevel = 0
|
||||
var timer:= Timer.new()
|
||||
|
||||
# signals
|
||||
signal levelChangeSignal(level)
|
||||
signal destroySignal(body)
|
||||
signal playerDamagedSignal(health, maxHealth)
|
||||
signal playerDeathSignal
|
||||
|
||||
var enemy:CharacterStats
|
||||
var player:CharacterStats
|
||||
var enemiesDict = {}
|
||||
var playerCurrentHealth:int = 0
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
# load in characters
|
||||
enemy = load("res://scripts/rscs/slime_stats.tres")
|
||||
player = load("res://scripts/rscs/player_stats.tres")
|
||||
playerCurrentHealth = player.starting_health
|
||||
|
||||
add_child(timer)
|
||||
timer.wait_time = 1
|
||||
timer.one_shot = false
|
||||
timer.connect("timeout", secondCounter)
|
||||
timer.start()
|
||||
$TimerLabel.text = str(timeLimit)
|
||||
#$TimerLabel.text = str(timeLimit)
|
||||
|
||||
func secondCounter():
|
||||
timeLimit -= 1
|
||||
$TimerLabel.text = str(timeLimit)
|
||||
if timeLimit <=0:
|
||||
func secondCounter() -> void:
|
||||
#timeLimit -= 1
|
||||
#$TimerLabel.text = str(timeLimit)
|
||||
#if timeLimit <=0:
|
||||
# print("You lose baby!")
|
||||
# get_tree().reload_current_scene()
|
||||
|
||||
#class
|
||||
timeAvailable -= 1
|
||||
if timeAvailable <= 0:
|
||||
print("You lose baby!")
|
||||
get_tree().reload_current_scene()
|
||||
levelChangeSignal.emit(levels[currentLevel])
|
||||
|
||||
func reset() -> void:
|
||||
timeAvailable = timers[currentLevel]
|
||||
enemiesDict.clear()
|
||||
playerCurrentHealth = player.starting_health
|
||||
|
||||
func _on_trigger_fired(intent: Variant, body) -> void:
|
||||
#print("GC knows trigger fired " +intent)
|
||||
match intent:
|
||||
"destroy":
|
||||
if body.name.begins_with("Crate"):
|
||||
cratesDestroyed +=1
|
||||
body.queue_free() # destroy the crate - again will move to SceneManager
|
||||
if cratesDestroyed>=totalCrates:
|
||||
print("You win baby!")
|
||||
get_tree().reload_current_scene()
|
||||
#if body.name.begins_with("Crate"):
|
||||
# cratesDestroyed +=1
|
||||
# body.queue_free() # destroy the crate - again will move to SceneManager
|
||||
#if cratesDestroyed>=totalCrates:
|
||||
# print("You win baby!")
|
||||
# get_tree().reload_current_scene()
|
||||
destroySignal.emit(body)
|
||||
"powerup":
|
||||
print("power up this thing")
|
||||
|
||||
func _on_coin_collected(body, coin):
|
||||
print("GC knows coin collected")
|
||||
coinsCollectedTotal += 1
|
||||
coin.queue_free()
|
||||
if coinsCollectedTotal >= totalCoinsAvailable:
|
||||
print("You won the level!")
|
||||
destroySignal.emit(coin)
|
||||
|
||||
func totalCoins(value):
|
||||
totalCoinsAvailable = value
|
||||
if value == 0:
|
||||
# you won
|
||||
print("you won")
|
||||
currentLevel += 1
|
||||
if currentLevel >= levels.size():
|
||||
currentLevel = 0
|
||||
levelChangeSignal.emit(levels[currentLevel])
|
||||
|
||||
func _on_slime_damage(body, slime):
|
||||
print("GC knows slime damage")
|
||||
print("Damage " + str(enemiesDict[slime]["damage"]))
|
||||
playerCurrentHealth -= enemiesDict[slime]["damage"]
|
||||
if playerCurrentHealth <= 0:
|
||||
print("YOU DIED")
|
||||
playerDeathSignal.emit()
|
||||
else:
|
||||
print("Player Health " + str(playerCurrentHealth) + " of " + str(player.starting_health))
|
||||
playerDamagedSignal.emit(playerCurrentHealth, player.starting_health)
|
||||
|
||||
func totalEnemies(value):
|
||||
print("GC knows total enemies " + str(value))
|
||||
#totalEnemies = value
|
||||
|
||||
func addEnemyToLevel(slime) -> void:
|
||||
print("GC adding enemy")
|
||||
var randDamage:int = randi() % 10
|
||||
var enemyStat = {
|
||||
"health": enemy.health,
|
||||
"damage": enemy.meleeDamage + randDamage
|
||||
}
|
||||
enemiesDict[slime] = enemyStat
|
||||
|
||||
func bulletDamage(area, bullet) -> void:
|
||||
print("Bullet hitting area")
|
||||
if area is Slime:
|
||||
print("Hitting a slime")
|
||||
enemiesDict[area]["health"] -= player.rangeDamage
|
||||
if enemiesDict[area]["health"] <= 0:
|
||||
print("enemy killed")
|
||||
removeEnemyFromLevel(area)
|
||||
destroySignal.emit(area)
|
||||
else:
|
||||
print("Slime health " + str(enemiesDict[area]["health"]))
|
||||
|
||||
func removeEnemyFromLevel(slime) -> void:
|
||||
enemiesDict.erase(slime)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
class_name CharacterStats extends Resource
|
||||
|
||||
@export_category("Health")
|
||||
@export var health:int = 100
|
||||
@export var max_health:int = 100
|
||||
@export var starting_health:int = 100
|
||||
|
||||
# dealing damage
|
||||
@export_category("Damage")
|
||||
@export var meleeDamage:int = 10
|
||||
@export var rangeDamage:int = 0
|
||||
@@ -0,0 +1 @@
|
||||
uid://cvat5tqlqhakd
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://deoygngkmis5q"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvat5tqlqhakd" path="res://scripts/rscs/character_stats.gd" id="1_828p3"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_828p3")
|
||||
rangeDamage = 10
|
||||
metadata/_custom_type_script = "uid://cvat5tqlqhakd"
|
||||
@@ -0,0 +1,10 @@
|
||||
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://tgmiodedtib6"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvat5tqlqhakd" path="res://scripts/rscs/character_stats.gd" id="1_i64ta"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_i64ta")
|
||||
health = 10
|
||||
max_health = 10
|
||||
starting_health = 10
|
||||
metadata/_custom_type_script = "uid://cvat5tqlqhakd"
|
||||
+40
-20
@@ -5,8 +5,6 @@ var bullet = preload("res://scenes/bullet.tscn")
|
||||
@onready var coins: Node2D = $"../Coins"
|
||||
@onready var enemies: Node2D = $"../Enemies"
|
||||
|
||||
@onready var game: Node2D = $".."
|
||||
|
||||
var bulletArray = []
|
||||
var totalAllowedBullets = 7
|
||||
|
||||
@@ -14,28 +12,44 @@ var grenade = preload("res://scenes/grenade.tscn")
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
Gamecontroller.reset()
|
||||
buildLevel()
|
||||
|
||||
func buildLevel() -> void:
|
||||
# hook up coins
|
||||
var totalCoins = 0
|
||||
if coins:
|
||||
for obj in coins.get_children():
|
||||
if obj is Coin:
|
||||
totalCoins += 1
|
||||
# hook up a listener at the game controller
|
||||
obj.coinCollectedSignal.connect(game._on_coin_collected)
|
||||
# tell GC how many coins total
|
||||
game.totalCoins(totalCoins)
|
||||
updateCoins()
|
||||
|
||||
var totalEnemies = 0
|
||||
if enemies:
|
||||
for obj in enemies.get_children():
|
||||
if obj is Slime:
|
||||
totalEnemies += 1
|
||||
# hook up a listener at the game controller
|
||||
obj.slimeDamageSignal.connect(game._on_slime_damage)
|
||||
game.totalEnemies(totalEnemies)
|
||||
updateEnemies()
|
||||
|
||||
# wire up signals from GameController
|
||||
Gamecontroller.levelChangeSignal.connect(changeScene)
|
||||
Gamecontroller.destroySignal.connect(destroy)
|
||||
|
||||
func updateEnemies() -> void:
|
||||
var totalEnemies = 0
|
||||
for obj in enemies.get_children():
|
||||
if obj is Slime:
|
||||
totalEnemies += 1
|
||||
# hook up a listener at the game controller
|
||||
if not obj.slimeDamageSignal.is_connected(Gamecontroller._on_slime_damage):
|
||||
obj.slimeDamageSignal.connect(Gamecontroller._on_slime_damage)
|
||||
Gamecontroller.addEnemyToLevel(obj)
|
||||
Gamecontroller.totalEnemies(totalEnemies)
|
||||
|
||||
func updateCoins() -> void:
|
||||
var totalCoins = 0
|
||||
for obj in coins.get_children():
|
||||
if obj is Coin:
|
||||
totalCoins += 1
|
||||
# hook up a listener at the game controller
|
||||
if not obj.coinCollectedSignal.is_connected(Gamecontroller._on_coin_collected):
|
||||
obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected)
|
||||
if not obj.tree_exited.is_connected(updateCoins):
|
||||
obj.tree_exited.connect(updateCoins)
|
||||
# tell GC how many coins total
|
||||
Gamecontroller.totalCoins(totalCoins)
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
@@ -46,7 +60,8 @@ func bulletFactory()->Bullet:
|
||||
if bulletArray.size() < totalAllowedBullets:
|
||||
# make a new bullet
|
||||
myBullet = bullet.instantiate()
|
||||
game.add_child(myBullet)
|
||||
myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage)
|
||||
owner.add_child(myBullet)
|
||||
else:
|
||||
myBullet = bulletArray.pop_back()
|
||||
|
||||
@@ -62,7 +77,12 @@ func makeBullet(_bulletPosition, _bulletSpeed)->void:
|
||||
func makeGrenade(_grenadePosition, _grenadeDirection)->void:
|
||||
print("SM make a grenade")
|
||||
var myGrenade:Grenade = grenade.instantiate()
|
||||
game.add_child(myGrenade)
|
||||
owner.add_child(myGrenade)
|
||||
myGrenade.apply_central_impulse(Vector2(_grenadeDirection, -1)*200)
|
||||
myGrenade.transform = _grenadePosition
|
||||
|
||||
|
||||
func changeScene(level) -> void:
|
||||
get_tree().call_deferred("change_scene_to_file", level)
|
||||
|
||||
func destroy(body) -> void:
|
||||
body.queue_free()
|
||||
+9
-1
@@ -1,5 +1,13 @@
|
||||
class_name Slime extends Area2D
|
||||
|
||||
@onready var right_cast: RayCast2D = $RightCast
|
||||
@onready var left_cast: RayCast2D = $LeftCast
|
||||
@onready var right_down_cast: RayCast2D = $RightDownCast
|
||||
@onready var left_down_cast: RayCast2D = $LeftDownCast
|
||||
|
||||
var speed:int = 100
|
||||
var direction = 1
|
||||
|
||||
signal slimeDamageSignal(body, slime)
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
@@ -9,7 +17,7 @@ func _ready() -> void:
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
position.x += direction * speed * delta
|
||||
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
|
||||
Reference in new issue
Block a user