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
bdaeeec44f
commit
d5c87727b9
17 files changed
+1290
-46
No files matched your search
+6
-2
@@ -2,7 +2,7 @@ class_name Bullet extends Area2D
|
||||
|
||||
var speed:float = 700
|
||||
@onready var bullet_graphic = $BulletGraphic
|
||||
|
||||
signal bulletDamageSignal(area, bullet)
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
@@ -12,9 +12,13 @@ func _ready():
|
||||
func _process(delta):
|
||||
position += transform.x * speed * delta
|
||||
|
||||
func xz(value)->void:
|
||||
func setSpeed(value)->void:
|
||||
speed = value
|
||||
if speed<0:
|
||||
bullet_graphic.flip_h = true
|
||||
else:
|
||||
bullet_graphic.flip_h = false
|
||||
|
||||
|
||||
func _on_area_entered(area):
|
||||
bulletDamageSignal.emit(area, self)
|
||||
@@ -16,3 +16,8 @@ func _on_body_entered(body):
|
||||
print("body connected with coin")
|
||||
if body is Player:
|
||||
coinCollectedSignal.emit(body, self)
|
||||
if body is Grenade:
|
||||
body.queue_free()
|
||||
self.queue_free()
|
||||
|
||||
|
||||
+85
-11
@@ -3,10 +3,48 @@ extends Node2D
|
||||
var coinsCollectedTotal:int = 0
|
||||
var totalCoinsAvailable:int = 0
|
||||
|
||||
var levels=["res://scenes/game.tscn","res://scenes/level2.tscn","res://scenes/level3.tscn"]
|
||||
var timers=[16,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():
|
||||
pass # Replace with function body.
|
||||
#load in characters
|
||||
enemy = load("res://scripts/rscs/slimeStats.tres")
|
||||
player = load("res://scripts/rscs/playerStats.tres")
|
||||
playerCurrentHealth = player.starting_health
|
||||
|
||||
add_child(timer)
|
||||
timer.wait_time = 1
|
||||
timer.one_shot = false
|
||||
timer.connect("timeout", secondCounter)
|
||||
timer.start()
|
||||
|
||||
func secondCounter()->void:
|
||||
timeAvailable -=1
|
||||
if timeAvailable <=0:
|
||||
print("YOu LOOSAE Baby!")
|
||||
print(levels[currentLevel])
|
||||
levelChangeSignal.emit(levels[currentLevel])
|
||||
|
||||
func reset()->void:
|
||||
timeAvailable = timers[currentLevel]
|
||||
enemiesDict.clear()
|
||||
playerCurrentHealth = player.starting_health
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
@@ -18,21 +56,57 @@ func _on_trigger_fired(intent, body):
|
||||
match intent:
|
||||
"destroy":
|
||||
print("destroy this thing")
|
||||
body.queue_free()
|
||||
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!")
|
||||
|
||||
func totalCoins(value):
|
||||
totalCoinsAvailable = value
|
||||
destroySignal.emit(coin)
|
||||
|
||||
func _on_slime_damage(body, slime):
|
||||
func totalCoins(value):
|
||||
if value == 0:
|
||||
#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"]))
|
||||
print("Player Health "+str(playerCurrentHealth)+" of "+str(player.starting_health))
|
||||
playerCurrentHealth -= enemiesDict[slime]["damage"]
|
||||
if playerCurrentHealth <=0:
|
||||
print("YOU DED")
|
||||
playerDeathSignal.emit()
|
||||
else:
|
||||
print("Taking damage")
|
||||
playerDamagedSignal.emit(playerCurrentHealth, player.starting_health)
|
||||
|
||||
func totalEnemies(value):
|
||||
print("GC knows total enemies "+str(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")
|
||||
print("Slime health "+str(enemiesDict[area]["health"]))
|
||||
enemiesDict[area]["health"]-=player.rangeDamage
|
||||
if enemiesDict[area]["health"] <=0:
|
||||
print("enemy killed")
|
||||
removeEnemyFromLevel(area)
|
||||
destroySignal.emit(area)
|
||||
else:
|
||||
print("enemy damaged")
|
||||
func removeEnemyFromLevel(slime)->void:
|
||||
enemiesDict.erase(slime)
|
||||
@@ -25,3 +25,4 @@ func _on_body_entered(body):
|
||||
if body.is_in_group("splodable"):
|
||||
body.queue_free()
|
||||
explode()
|
||||
|
||||
@@ -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://oewo8kn4jbkl
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://4yftkv4qq0bd"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://oewo8kn4jbkl" path="res://scripts/rscs/characterstats.gd" id="1_sqkfu"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_sqkfu")
|
||||
rangeDamage = 10
|
||||
metadata/_custom_type_script = "uid://oewo8kn4jbkl"
|
||||
@@ -0,0 +1,11 @@
|
||||
[gd_resource type="Resource" script_class="CharacterStats" load_steps=2 format=3 uid="uid://8cwcd0phesw4"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://oewo8kn4jbkl" path="res://scripts/rscs/characterstats.gd" id="1_ppipo"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ppipo")
|
||||
health = 50
|
||||
max_health = 50
|
||||
starting_health = 50
|
||||
meleeDamage = 5
|
||||
metadata/_custom_type_script = "uid://oewo8kn4jbkl"
|
||||
+45
-19
@@ -5,36 +5,54 @@ var grenade = preload("res://scenes/grenade.tscn")
|
||||
@onready var coins = $"../Coins"
|
||||
@onready var enemies = $"../Enemies"
|
||||
|
||||
@onready var game = $".."
|
||||
|
||||
var bulletArray = []
|
||||
var totalAllowedBullets = 7
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
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 game controller
|
||||
obj.slimeDamageSignal.connect(game._on_slime_damage)
|
||||
pass
|
||||
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 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:
|
||||
if not obj.coinCollectedSignal.is_connected(Gamecontroller._on_coin_collected):
|
||||
#hook up a listener at the game controller
|
||||
obj.coinCollectedSignal.connect(Gamecontroller._on_coin_collected)
|
||||
if not obj.tree_exited.is_connected(updateCoins):
|
||||
obj.tree_exited.connect(updateCoins)
|
||||
totalCoins +=1
|
||||
#tell GC how many coins total
|
||||
Gamecontroller.totalCoins(totalCoins)
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
pass
|
||||
@@ -43,7 +61,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()
|
||||
|
||||
@@ -59,6 +78,13 @@ 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:
|
||||
print("Change to level "+level)
|
||||
get_tree().call_deferred("change_scene_to_file", level)
|
||||
|
||||
func destroy(body)->void:
|
||||
body.queue_free()
|
||||
+8
-1
@@ -1,4 +1,11 @@
|
||||
class_name Slime extends Area2D
|
||||
@onready var right_cast = $RightCast
|
||||
@onready var left_cast = $LeftCast
|
||||
@onready var right_down_cast = $RightDownCast
|
||||
@onready var left_down_cast = $LeftDownCast
|
||||
|
||||
var speed:int = 100
|
||||
var direction = 1
|
||||
|
||||
signal slimeDamageSignal(body, slime)
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
@@ -8,7 +15,7 @@ func _ready():
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
pass
|
||||
position.x += direction * speed * delta
|
||||
|
||||
|
||||
func _on_body_entered(body):
|
||||
|
||||
Reference in new issue
Block a user