91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
class_name SceneManager extends Node2D
 | 
						|
 | 
						|
var bullet = preload("res://scenes/bullet.tscn")
 | 
						|
var grenade = preload("res://scenes/grenade.tscn")
 | 
						|
@onready var coins = $"../Coins"
 | 
						|
@onready var enemies = $"../Enemies"
 | 
						|
 | 
						|
 | 
						|
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
 | 
						|
	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 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
 | 
						|
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:
 | 
						|
	print("Change to level "+level)
 | 
						|
	get_tree().call_deferred("change_scene_to_file", level)
 | 
						|
	
 | 
						|
func destroy(body)->void:
 | 
						|
	body.queue_free()
 |