.......
parent
8950c8bc53
commit
6fb21ea18b
|
|
@ -25,8 +25,9 @@ var current_age = AgeState.BABY
|
|||
@export var mesh_castle : Node3D
|
||||
@export var mesh_fort : Node3D
|
||||
|
||||
# 5. Bewegliches Objekt (Regal)
|
||||
@export var heavy_object : RigidBody3D
|
||||
# 5. Interaktive Objekte
|
||||
@export var heavy_object : RigidBody3D # Das Regal
|
||||
@export var age_paper : Node3D # Das Papier mit dem Hinweis
|
||||
|
||||
func _ready():
|
||||
# Automatisch Controller finden, falls vergessen
|
||||
|
|
@ -68,8 +69,8 @@ func change_age(direction: int):
|
|||
|
||||
func apply_age_physics(animate: bool = true):
|
||||
# Sicherheitscheck: Sind alle Nodes zugewiesen?
|
||||
if not player_body or not world_env or not movement_direct or not camera or not audio_baby or not audio_teen or not mesh_castle or not mesh_fort or not heavy_object:
|
||||
printerr("FEHLER: Bitte ALLE Referenzen im Inspektor der Uhr zuweisen!")
|
||||
if not player_body or not world_env or not movement_direct or not camera or not audio_baby or not audio_teen or not mesh_castle or not mesh_fort or not heavy_object or not age_paper:
|
||||
printerr("FEHLER: Bitte ALLE Referenzen (auch Age Paper!) im Inspektor der Uhr zuweisen!")
|
||||
return
|
||||
|
||||
# --- ZIELWERTE DEFINIEREN ---
|
||||
|
|
@ -82,12 +83,11 @@ func apply_age_physics(animate: bool = true):
|
|||
var target_vol_teen = -80.0
|
||||
var translation_step = Vector3.ZERO
|
||||
|
||||
# Sichtbarkeit der Meshes
|
||||
# Logik-Status Variablen
|
||||
var show_castle = false
|
||||
var show_fort = false
|
||||
|
||||
# Regal Status
|
||||
var make_object_movable = false
|
||||
var is_teen_state = false
|
||||
|
||||
match current_age:
|
||||
AgeState.BABY:
|
||||
|
|
@ -109,8 +109,9 @@ func apply_age_physics(animate: bool = true):
|
|||
show_castle = true
|
||||
show_fort = false
|
||||
|
||||
# Regal: Fest (zu schwer)
|
||||
make_object_movable = false
|
||||
# Interaktionen
|
||||
make_object_movable = false # Regal fest
|
||||
is_teen_state = false # Papier = Gekritzel
|
||||
|
||||
AgeState.TEEN:
|
||||
# TEEN WERTE
|
||||
|
|
@ -131,8 +132,9 @@ func apply_age_physics(animate: bool = true):
|
|||
show_castle = false
|
||||
show_fort = true
|
||||
|
||||
# Regal: Beweglich (stark)
|
||||
make_object_movable = true
|
||||
# Interaktionen
|
||||
make_object_movable = true # Regal beweglich
|
||||
is_teen_state = true # Papier = Klartext
|
||||
|
||||
# --- ANWENDUNG ---
|
||||
|
||||
|
|
@ -140,10 +142,14 @@ func apply_age_physics(animate: bool = true):
|
|||
mesh_castle.visible = show_castle
|
||||
mesh_fort.visible = show_fort
|
||||
|
||||
# Aufruf des Skripts auf dem Regal (HeavyObject.gd)
|
||||
# Regal update
|
||||
if heavy_object.has_method("set_movable"):
|
||||
heavy_object.set_movable(make_object_movable)
|
||||
|
||||
# Papier update (NEU)
|
||||
if age_paper.has_method("update_texture"):
|
||||
age_paper.update_texture(is_teen_state)
|
||||
|
||||
# 2. Sofortige Positionierung (gegen Stuck-Bugs)
|
||||
if animate:
|
||||
player.translate(translation_step)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
extends RigidBody3D
|
||||
|
||||
# Referenz zum Griff (der das Pickable-Skript hat)
|
||||
@export var door_handle : XRToolsPickable
|
||||
|
||||
func _ready():
|
||||
# Am Start die Tür einfrieren
|
||||
freeze = true
|
||||
|
||||
if door_handle:
|
||||
# Signale verbinden
|
||||
door_handle.picked_up.connect(_on_grab)
|
||||
door_handle.dropped.connect(_on_release)
|
||||
|
||||
func _on_grab(_pickable):
|
||||
# Wenn angefasst: Physik aktivieren
|
||||
freeze = false
|
||||
sleeping = false # Aufwecken, damit sie sofort reagiert
|
||||
|
||||
func _on_release(_pickable):
|
||||
# Wenn losgelassen: Sofort wieder einfrieren
|
||||
freeze = true
|
||||
|
||||
# WICHTIG: Geschwindigkeit nullen, damit sie sofort stoppt und nicht nachrutscht
|
||||
linear_velocity = Vector3.ZERO
|
||||
angular_velocity = Vector3.ZERO
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://d1f5sdtlqjqr1
|
||||
48
DoorLock.gd
48
DoorLock.gd
|
|
@ -1,37 +1,45 @@
|
|||
extends Node3D
|
||||
extends RigidBody3D
|
||||
|
||||
# Referenz zur Tür (der RigidBody)
|
||||
@export var door_rigidbody : RigidBody3D
|
||||
# Referenz zum Griff (der das Pickable-Skript hat)
|
||||
@export var door_handle : XRToolsPickable
|
||||
|
||||
# Referenz zur SnapZone (der "WheelSpace")
|
||||
@export var wheel_snap_zone : XRToolsSnapZone
|
||||
|
||||
var wheel_inserted : bool = false
|
||||
|
||||
func _ready():
|
||||
# Wir verbinden das Signal der SnapZone
|
||||
# Am Start die Tür einfrieren
|
||||
freeze = true
|
||||
|
||||
if door_handle:
|
||||
# Signale verbinden
|
||||
door_handle.picked_up.connect(_on_grab)
|
||||
door_handle.dropped.connect(_on_release)
|
||||
|
||||
if wheel_snap_zone:
|
||||
# "has_picked_up" wird gefeuert, wenn die Zone ein Objekt fängt
|
||||
wheel_snap_zone.has_picked_up.connect(_on_wheel_inserted)
|
||||
|
||||
# Optional: Wenn man das Rad wieder rausnimmt, soll die Tür wieder zu gehen?
|
||||
# Dann aktiviere die nächste Zeile:
|
||||
# wheel_snap_zone.has_dropped.connect(_on_wheel_removed)
|
||||
|
||||
# Sicherstellen, dass die Tür am Start zu ist
|
||||
lock_door()
|
||||
wheel_snap_zone.has_dropped.connect(_on_wheel_removed)
|
||||
|
||||
func _on_wheel_inserted(_object):
|
||||
print("Rad eingesetzt! Tür wird entriegelt.")
|
||||
unlock_door()
|
||||
wheel_inserted = true
|
||||
|
||||
func _on_wheel_removed(_object):
|
||||
print("Rad entfernt! Tür wird verriegelt.")
|
||||
lock_door()
|
||||
wheel_inserted = false
|
||||
|
||||
func unlock_door():
|
||||
if door_rigidbody:
|
||||
door_rigidbody.freeze = false # Physik an -> Tür beweglich
|
||||
# Optional: Schlafeinschlafen verhindern
|
||||
func _on_grab(_pickable):
|
||||
# Wenn angefasst: Physik aktivieren
|
||||
if wheel_inserted:
|
||||
freeze = false
|
||||
sleeping = false # Aufwecken, damit sie sofort reagiert
|
||||
|
||||
func lock_door():
|
||||
if door_rigidbody:
|
||||
door_rigidbody.freeze = true # Physik aus -> Tür fest wie eine Wand
|
||||
func _on_release(_pickable):
|
||||
# Wenn losgelassen: Sofort wieder einfrieren
|
||||
freeze = true
|
||||
|
||||
# WICHTIG: Geschwindigkeit nullen, damit sie sofort stoppt und nicht nachrutscht
|
||||
linear_velocity = Vector3.ZERO
|
||||
angular_velocity = Vector3.ZERO
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
extends Node3D
|
||||
|
||||
# Referenz zum Mesh, damit wir das Material ändern können
|
||||
@export var mesh_instance : MeshInstance3D
|
||||
|
||||
# Platzhalter für die zwei Texturen (Bilder)
|
||||
@export var texture_baby : Texture2D # Gekritzel
|
||||
@export var texture_teen : Texture2D # Klartext
|
||||
|
||||
func _ready():
|
||||
# Wir stellen sicher, dass das Material einzigartig ist,
|
||||
# damit wir nicht versehentlich alle Papiere in der Welt ändern.
|
||||
if mesh_instance.material_override:
|
||||
mesh_instance.material_override = mesh_instance.material_override.duplicate()
|
||||
elif mesh_instance.mesh and mesh_instance.mesh.material:
|
||||
mesh_instance.mesh.material = mesh_instance.mesh.material.duplicate()
|
||||
|
||||
func update_texture(is_teen: bool):
|
||||
# Wir holen uns das aktuelle Material
|
||||
var mat = null
|
||||
if mesh_instance.material_override:
|
||||
mat = mesh_instance.material_override
|
||||
else:
|
||||
mat = mesh_instance.mesh.material
|
||||
|
||||
if mat is StandardMaterial3D:
|
||||
if is_teen:
|
||||
mat.albedo_texture = texture_teen
|
||||
else:
|
||||
mat.albedo_texture = texture_baby
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://ckfh21xv64xk8
|
||||
|
|
@ -3,6 +3,7 @@ extends Node3D
|
|||
# Referenz zur SnapZone (das Schloss)
|
||||
@export var snap_zone : XRToolsSnapZone
|
||||
|
||||
@export var wheel: RigidBody3D
|
||||
# Einstellungen für die Bewegung
|
||||
@export var slide_offset : Vector3 = Vector3(0.5, 0, 0) # 0.5 auf X
|
||||
@export var animation_duration : float = 1.0 # Dauer in Sekunden
|
||||
|
|
@ -22,9 +23,11 @@ func _ready():
|
|||
else:
|
||||
printerr("FEHLER: Bitte SnapZone im Inspektor zuweisen!")
|
||||
|
||||
|
||||
func _on_unlock(_object):
|
||||
print("Schlüssel steckt! Schublade öffnet sich.")
|
||||
move_drawer(start_position + slide_offset)
|
||||
wheel.enabled = true
|
||||
|
||||
func _on_lock(_object):
|
||||
print("Schlüssel entfernt! Schublade schließt sich.")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://ddn0hta2sm7to"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://ddn0hta2sm7to"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_1nyor"]
|
||||
[ext_resource type="PackedScene" uid="uid://da2qgxxwwitl6" path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.tscn" id="2_j2emh"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_1nyor"]
|
||||
radius = 0.3
|
||||
|
|
@ -12,5 +11,3 @@ snap_require = "Key"
|
|||
|
||||
[node name="CollisionShape3D" parent="." index="0"]
|
||||
shape = SubResource("SphereShape3D_1nyor")
|
||||
|
||||
[node name="HighlightRing" parent="." index="2" instance=ExtResource("2_j2emh")]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
[gd_scene load_steps=9 format=3 uid="uid://d1bmffs5q85hn"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_ngymr"]
|
||||
[ext_resource type="Script" uid="uid://ckfh21xv64xk8" path="res://addons/godot-xr-tools/objects/AgePaper.gd" id="2_856bp"]
|
||||
[ext_resource type="Texture2D" uid="uid://bdnh5ako4yfpr" path="res://assets/tippi/gekritzel.png" id="3_e14vg"]
|
||||
[ext_resource type="Texture2D" uid="uid://dstv63bc0f6tp" path="res://assets/tippi/passwort.png" id="4_jxdx2"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ngymr"]
|
||||
size = Vector3(0.42, 0.58, 0.02)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_e14vg"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_856bp"]
|
||||
material = SubResource("StandardMaterial3D_e14vg")
|
||||
size = Vector3(0.42, 0.58, 0.02)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rarql"]
|
||||
albedo_texture = ExtResource("4_jxdx2")
|
||||
|
||||
[node name="Paper" instance=ExtResource("1_ngymr")]
|
||||
|
||||
[node name="CollisionShape3D" parent="." index="0"]
|
||||
shape = SubResource("BoxShape3D_ngymr")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." index="1"]
|
||||
mesh = SubResource("BoxMesh_856bp")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_rarql")
|
||||
|
||||
[node name="MysteryPaper" type="Node3D" parent="." index="2" node_paths=PackedStringArray("mesh_instance")]
|
||||
script = ExtResource("2_856bp")
|
||||
mesh_instance = NodePath("../MeshInstance3D")
|
||||
texture_baby = ExtResource("3_e14vg")
|
||||
texture_teen = ExtResource("4_jxdx2")
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://c31oleh3x06ku"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://c31oleh3x06ku"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_13vdp"]
|
||||
[ext_resource type="PackedScene" uid="uid://da2qgxxwwitl6" path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.tscn" id="2_js6x5"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_js6x5"]
|
||||
resource_local_to_scene = true
|
||||
|
|
@ -13,5 +12,3 @@ snap_require = "Wheel"
|
|||
|
||||
[node name="CollisionShape3D" parent="." index="0"]
|
||||
shape = SubResource("SphereShape3D_js6x5")
|
||||
|
||||
[node name="HighlightRing" parent="." index="2" instance=ExtResource("2_js6x5")]
|
||||
|
|
|
|||
455
level.tscn
455
level.tscn
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue