6.4. 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.

6.4.1. 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.

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

6.4.2. 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.

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

6.4.3. Hintergrund

Der Spielszene wird ein Hintergrund hinzugefügt, dieser befindet sich auf der hinteren Betrachtungsebene um nichts zu verdecken.

6.4.4. Spielinformationen

Dem Spieler werden Informationen wie die momentanige Anzahl der Frames und sein Score direkt über Label, die in der Spielszene sichtbar sind.

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()