83 lines
2.9 KiB
GDScript
83 lines
2.9 KiB
GDScript
extends Node3D
|
|
class_name QuizBox
|
|
|
|
@export var question: String
|
|
@export var correct: int
|
|
@export var answer_0: String
|
|
@export var answer_1: String
|
|
@export var answer_2: String
|
|
@export var answer_3: String
|
|
|
|
@onready var animation_player: AnimationPlayer = $AnimationPlayer
|
|
@onready var quiz_light: CSGSphere3D = $quiz_box_sb/quiz_box/quiz_light
|
|
|
|
@onready var answer_pad_0: Area3D = $answers/answer_pad_0/Area3D
|
|
@onready var answer_pad_1: Area3D = $answers/answer_pad_1/Area3D
|
|
@onready var answer_pad_2: Area3D = $answers/answer_pad_2/Area3D
|
|
@onready var answer_pad_3: Area3D = $answers/answer_pad_3/Area3D
|
|
|
|
@onready var answer_0_label: Label3D = $answers/answer_pad_0/answer_0_label
|
|
@onready var answer_1_label: Label3D = $answers/answer_pad_1/answer_1_label
|
|
@onready var answer_2_label: Label3D = $answers/answer_pad_2/answer_2_label
|
|
@onready var answer_3_label: Label3D = $answers/answer_pad_3/answer_3_label
|
|
|
|
@onready var question_label: Label3D = $StaticBody3D/Wall/question_label
|
|
|
|
var answered_correctly := false
|
|
|
|
func _ready() -> void:
|
|
# Texte setzen
|
|
question_label.text = question
|
|
answer_0_label.text = answer_0
|
|
answer_1_label.text = answer_1
|
|
answer_2_label.text = answer_2
|
|
answer_3_label.text = answer_3
|
|
|
|
# Signale verbinden
|
|
answer_pad_0.body_entered.connect(_on_answer_entered.bind(0))
|
|
answer_pad_1.body_entered.connect(_on_answer_entered.bind(1))
|
|
answer_pad_2.body_entered.connect(_on_answer_entered.bind(2))
|
|
answer_pad_3.body_entered.connect(_on_answer_entered.bind(3))
|
|
|
|
# WICHTIG: Material duplizieren, damit es nicht mit anderen Instanzen geteilt wird
|
|
if quiz_light.material != null:
|
|
# tiefe Kopie (alle Subressourcen mitduplizieren)
|
|
quiz_light.material = quiz_light.material.duplicate(true)
|
|
else:
|
|
quiz_light.material = StandardMaterial3D.new()
|
|
|
|
# Grundeinstellungen für diese Instanz
|
|
quiz_light.material.emission_enabled = true
|
|
quiz_light.material.emission_energy = 0.5
|
|
quiz_light.material.albedo_color = Color.WHITE
|
|
quiz_light.material.emission = Color.WHITE
|
|
|
|
func _on_answer_entered(body: Node3D, answer_index: int) -> void:
|
|
if not body.is_in_group("player"):
|
|
return # Nur Player soll triggern
|
|
|
|
# Wenn schon korrekt beantwortet, nichts tun
|
|
if answered_correctly:
|
|
return
|
|
|
|
# Prüfen und nur DIESE Instanzlampe setzen
|
|
if answer_index == correct:
|
|
_set_light_color(Color.GREEN)
|
|
question_label.visible = false
|
|
animation_player.play("open_door")
|
|
answered_correctly = true
|
|
else:
|
|
_set_light_color(Color.RED)
|
|
# optional: nach kurzer Zeit zurücksetzen, damit neu versucht werden kann
|
|
await get_tree().create_timer(1.0).timeout
|
|
_set_light_color(Color.WHITE)
|
|
|
|
func _set_light_color(color: Color) -> void:
|
|
# Setze nur das Material dieser Instanz
|
|
if quiz_light.material == null:
|
|
quiz_light.material = StandardMaterial3D.new()
|
|
quiz_light.material.albedo_color = color
|
|
quiz_light.material.emission = color
|
|
# erhöhe kurz die Emission für Sichtbarkeit bei Farben außer weiß
|
|
quiz_light.material.emission_energy = 1.5 if color != Color.WHITE else 0.5
|