class_name SceneManager extends Node2D var bullet = preload("res://scenes/bullet.tscn") @onready var coins: Node2D = $"../Coins" @onready var enemies: Node2D = $"../Enemies" var bulletArray = [] var totalAllowedBullets = 7 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 if coins: updateCoins() if enemies: 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: pass func bulletFactory()->Bullet: var myBullet:Bullet if bulletArray.size() < totalAllowedBullets: # make a new bullet myBullet = bullet.instantiate() myBullet.bulletDamageSignal.connect(Gamecontroller.bulletDamage) owner.add_child(myBullet) else: myBullet = bulletArray.pop_back() bulletArray.push_front(myBullet) return myBullet func makeBullet(_bulletPosition, _bulletSpeed)->void: print("make a bullet, put it in the world") var myBullet = bulletFactory() myBullet.transform = _bulletPosition myBullet.setSpeed(_bulletSpeed) func makeGrenade(_grenadePosition, _grenadeDirection)->void: print("SM make a grenade") var myGrenade:Grenade = grenade.instantiate() 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()