# Spielszene In der Szene des Spiels findet das Spiel statt. Sie wird aufgerufen sobald im Menü "Start" ausgewählt wird. Sie beherbergt die Spielcharakter, die Projektile, den Hintergrund und die Spielinformationen. ## Spielcharacter Der Spieler wird zusammen mit den Gegnern der Szene hinzugefügt, woraufhin sie "existieren" und ihrer Logik folgen können. Damit das Spiel nicht repetetiv wird und um die Gegner nicht selbst platzieren zu müssen, werden diese von einem Spawner an zufällige Punkte auf dem Spielfeld gesetzt. Läuft ein Timer ab wird en zufällig ausgewählter Gegner (oder ein Healthpack) der Szene an einer zufälligen Stelle hinzugefügt. ```{code-block} gdscript func spawn(): if spawn_delay.is_stopped(): spawn_delay.start() var spawn_types = ["charger", "shooter", "healthpack"] var spawn_type = spawn_types[randi() % spawn_types.size()] match spawn_type: "charger": spawn_charger() "shooter": spawn_shooter() "healthpack": spawn_healthpack() _: print("tried to spawn wrong enemy") return ``` ## Projektile Schießt der Spieler oder einer der Gegner erzeugt dieser ein neues "Bullet" Objekt. Dieses fliegt in die gewünschte Richtung und verursacht bei einem Zusammenstoß mit einem anderen Objekt eine bestimmte Menge Schaden. Nach dem Abfeuern hat der Schütze mit dem Projektil nichts mehr zu tun. Nach einer bestimmten Zeit verschwindet die Kugel von selbst. Die Funktion "_process" regelt das Verhalten des Objekts. ```{code-block} gdscript extends CharacterBody2D class_name Bullet export var speed = -600 export var damage = 50 export var direction = 1 const LIFETIME = 20 var current_lifetime = 0 # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): velocity.y = direction * speed # translation += global_transform.basis.x * speed * delta current_lifetime += delta if current_lifetime >= LIFETIME: queue_free() var collision_info = move_and_collide(velocity * delta) if collision_info: var collider = collision_info.get_collider() if collider.has_method("take_damage"): collider.call("take_damage",get_damage()) queue_free() func get_damage(): return damage ``` ## Hintergrund Der Spielszene wird ein Hintergrund hinzugefügt, dieser befindet sich auf der hinteren Betrachtungsebene um nichts zu verdecken. ## Spielinformationen Dem Spieler werden Informationen wie die momentanige Anzahl der Frames und sein Score direkt über Label, die in der Spielszene sichtbar sind. ```{code-block} gdscript extends CanvasLayer onready var fps_label = $FPS_Label onready var score_label = $score_Label var save_data = {} func load_config(): var config = preload("res://Scripts/config.gd").new() config.load_data() save_data = config.save_data func _ready(): load_config() func _process(delta): var score_rootnode = get_parent() if score_rootnode != null: score_label.text = "Score: " + str(score_rootnode.score) if save_data.get("display_fps", false): fps_label.text = "FPS:" + str(Engine.get_frames_per_second()) else: fps_label.text = "" func _on_pause_unpaused(): load_config() ```