diff --git a/project.godot b/project.godot index 5685975..92bed9d 100644 --- a/project.godot +++ b/project.godot @@ -102,6 +102,10 @@ config/name="project-dung" run/main_scene="res://scenes/main.tscn" config/icon="res://icon.png" +[debug] + +settings/stdout/print_fps=true + [display] window/size/width=2048 @@ -157,6 +161,14 @@ dialogic_default_action={ ] } +[layer_names] + +3d_physics/layer_1="Static" +3d_physics/layer_2="Player Hitbox" +3d_physics/layer_3="Player Interact Box" +3d_physics/layer_4="Interactable" +3d_physics/layer_5="Camera Zone" + [physics] common/enable_pause_aware_picking=true diff --git a/scenes/camera_room.tscn b/scenes/camera_room.tscn new file mode 100644 index 0000000..c3f0fbd --- /dev/null +++ b/scenes/camera_room.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scripts/camera_room.gd" type="Script" id=1] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 2.39087, 1.93969, 2.08096 ) + +[sub_resource type="CapsuleShape" id=2] +radius = 2.07384 +height = 8.68195 + +[node name="camera_room0" type="Spatial"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.4075, 0, 0 ) +script = ExtResource( 1 ) + +[node name="camera" type="Camera" parent="."] +transform = Transform( 0.054985, 0.806829, -0.588221, 0, 0.589112, 0.808052, 0.998487, -0.0444307, 0.0323923, -6.51055, 9.74907, 0 ) +fov = 49.8 + +[node name="hitbox" type="Area" parent="."] +collision_layer = 16 +collision_mask = 2 + +[node name="CollisionShape" type="CollisionShape" parent="hitbox"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.12314, 2.07098, 0.535633 ) +shape = SubResource( 1 ) + +[node name="CollisionShape2" type="CollisionShape" parent="hitbox"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0097599, 0, -0.487964 ) +shape = SubResource( 2 ) + +[connection signal="area_entered" from="hitbox" to="." method="_on_hitbox_area_entered"] +[connection signal="area_exited" from="hitbox" to="." method="_on_hitbox_area_exited"] diff --git a/scenes/main.tscn b/scenes/main.tscn index 918778c..4a76190 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,18 +1,140 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://assets/moonbase_whitebox/Moonbase_Whitebox.tscn" type="PackedScene" id=1] -[ext_resource path="res://scripts/main_camera.gd" type="Script" id=2] +[ext_resource path="res://scripts/cameras.gd" type="Script" id=2] [ext_resource path="res://scenes/player.tscn" type="PackedScene" id=3] +[ext_resource path="res://scenes/camera_room.tscn" type="PackedScene" id=4] +[ext_resource path="res://scripts/camera_room.gd" type="Script" id=5] +[ext_resource path="res://scripts/tracking_camera.gd" type="Script" id=6] + +[sub_resource type="CylinderShape" id=1] +height = 5.22615 +radius = 8.72145 + +[sub_resource type="BoxShape" id=4] +extents = Vector3( 1.78436, 2.33105, 6.04815 ) + +[sub_resource type="Animation" id=3] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath(".:camera_lerp") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "switch_camera" +length = 0.3 +tracks/0/type = "value" +tracks/0/path = NodePath(".:camera_lerp") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.3 ), +"transitions": PoolRealArray( -2, 1 ), +"update": 0, +"values": [ 0.0, 1.0 ] +} [node name="main" type="Spatial"] [node name="Moonbase_Whitebox" parent="." instance=ExtResource( 1 )] -[node name="main_camera" type="Camera" parent="."] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12.6083, 0 ) -current = true -script = ExtResource( 2 ) -target = NodePath("../Player") - [node name="Player" parent="." instance=ExtResource( 3 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.27448 ) + +[node name="cameras" type="Spatial" parent="."] +script = ExtResource( 2 ) +target = NodePath("../Player") +camera_lerp = 0.0 + +[node name="main_camera" type="Camera" parent="cameras"] +current = true + +[node name="camera_room_center" type="Spatial" parent="cameras"] +script = ExtResource( 5 ) + +[node name="camera" type="Camera" parent="cameras/camera_room_center"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 12, 0 ) +script = ExtResource( 6 ) +target = NodePath("../../../Player") + +[node name="hitbox" type="Area" parent="cameras/camera_room_center"] +collision_layer = 16 +collision_mask = 2 + +[node name="CollisionShape" type="CollisionShape" parent="cameras/camera_room_center/hitbox"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.52689, 0 ) +shape = SubResource( 1 ) + +[node name="camera_room_hallway" type="Spatial" parent="cameras"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0726166, 0, 17.4284 ) +script = ExtResource( 5 ) + +[node name="camera" type="Camera" parent="cameras/camera_room_hallway"] +transform = Transform( -4.37114e-08, 0.965926, -0.258819, 0, 0.258819, 0.965926, 1, 4.2222e-08, -1.13133e-08, -1.397, 10, -2.312 ) + +[node name="hitbox" type="Area" parent="cameras/camera_room_hallway"] +collision_layer = 16 +collision_mask = 2 + +[node name="CollisionShape" type="CollisionShape" parent="cameras/camera_room_hallway/hitbox"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.52689, -1.44831 ) +shape = SubResource( 4 ) + +[node name="camera_room0" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.408, 0, 0 ) + +[node name="camera_room1" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( 0.707107, 0, 0.707107, 0, 1, 0, -0.707107, 0, 0.707107, 10.653, 0, -10.485 ) + +[node name="camera_room2" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( -0.0170336, 0, 0.999855, 0, 1, 0, -0.999855, 0, -0.0170336, -0.079, 0, -15.007 ) + +[node name="camera_room3" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( -0.70219, 0, 0.711989, 0, 1, 0, -0.711989, 0, -0.70219, -10.6346, 0, -10.3156 ) + +[node name="camera_room4" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( -0.999986, 0, 0.00521851, 0, 1, 0, -0.00521851, 0, -0.999986, -15.0328, 0, 0.198143 ) + +[node name="camera_room5" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( -0.661796, 0, -0.749684, 0, 1, 0, 0.749684, 0, -0.661796, -10.4671, 0, 10.8794 ) + +[node name="camera_room6" parent="cameras" instance=ExtResource( 4 )] +transform = Transform( 0.696427, 0, -0.717628, 0, 1, 0, 0.717628, 0, 0.696427, 10.8827, 0, 10.7342 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="cameras"] +anims/RESET = SubResource( 3 ) +anims/switch_camera = SubResource( 2 ) + +[connection signal="player_entered" from="cameras/camera_room_center" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room_center" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="area_entered" from="cameras/camera_room_center/hitbox" to="cameras/camera_room_center" method="_on_hitbox_area_entered"] +[connection signal="area_exited" from="cameras/camera_room_center/hitbox" to="cameras/camera_room_center" method="_on_hitbox_area_exited"] +[connection signal="player_entered" from="cameras/camera_room_hallway" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room_hallway" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="area_entered" from="cameras/camera_room_hallway/hitbox" to="cameras/camera_room_hallway" method="_on_hitbox_area_entered"] +[connection signal="area_exited" from="cameras/camera_room_hallway/hitbox" to="cameras/camera_room_hallway" method="_on_hitbox_area_exited"] +[connection signal="player_entered" from="cameras/camera_room0" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room0" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room1" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room1" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room2" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room2" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room3" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room3" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room4" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room4" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room5" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room5" to="cameras" method="_on_camera_room_player_exited"] +[connection signal="player_entered" from="cameras/camera_room6" to="cameras" method="_on_camera_room_player_entered"] +[connection signal="player_exited" from="cameras/camera_room6" to="cameras" method="_on_camera_room_player_exited"] diff --git a/scenes/player.tscn b/scenes/player.tscn index ff86aa6..181fa2e 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -19,7 +19,7 @@ colors = PoolColorArray( 0, 0, 0, 1, 0, 0, 0, 0.429105, 0, 0, 0, 0 ) gradient = SubResource( 4 ) fill_to = Vector2( 0, 1 ) -[node name="Player" type="KinematicBody"] +[node name="Player" type="KinematicBody" groups=["player"]] axis_lock_motion_y = true move_lock_y = true script = ExtResource( 1 ) @@ -33,6 +33,8 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6244, 0 ) [node name="TriggerVolume" type="Area" parent="DungMan"] unique_name_in_owner = true transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.630386 ) +collision_layer = 4 +collision_mask = 8 [node name="CollisionShape" type="CollisionShape" parent="DungMan/TriggerVolume"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.778807, 0.291356 ) @@ -42,6 +44,13 @@ shape = SubResource( 3 ) transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.641703, 0 ) shape = SubResource( 2 ) +[node name="hitbox" type="Area" parent="."] +collision_layer = 2 +collision_mask = 16 + +[node name="CollisionShape" type="CollisionShape" parent="hitbox"] +shape = SubResource( 2 ) + [node name="UI" type="CanvasLayer" parent="."] [node name="Control" type="Control" parent="UI"] diff --git a/scripts/Player.gd b/scripts/Player.gd index b69cd77..e16906f 100644 --- a/scripts/Player.gd +++ b/scripts/Player.gd @@ -10,7 +10,7 @@ var item_in_hand # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + $hitbox.set_meta("owner", self) func _physics_process(delta): var input = Vector3(Input.get_axis("left", "right"), 0.0, Input.get_axis("up", "down")) diff --git a/scripts/camera_room.gd b/scripts/camera_room.gd new file mode 100644 index 0000000..4d5691a --- /dev/null +++ b/scripts/camera_room.gd @@ -0,0 +1,18 @@ +extends Spatial +signal player_entered(player, camera) +signal player_exited(player, camera) + +func _on_hitbox_area_entered(area): + var owner = area + if area.has_meta("owner"): + owner = area.get_meta("owner") + if owner.is_in_group("player"): + emit_signal("player_entered", owner, $camera) + + +func _on_hitbox_area_exited(area): + var owner = area + if area.has_meta("owner"): + owner = area.get_meta("owner") + if owner.is_in_group("player"): + emit_signal("player_exited", owner, $camera) diff --git a/scripts/cameras.gd b/scripts/cameras.gd new file mode 100644 index 0000000..98df6fa --- /dev/null +++ b/scripts/cameras.gd @@ -0,0 +1,31 @@ +extends Spatial + +export var target: NodePath +onready var target_node: Spatial = get_node(target) +export var camera_lerp := 1.0 + +var tracking_cameras = [] +onready var prev_camera: Camera = $camera_room_center/camera +onready var current_camera: Camera = $camera_room_center/camera setget set_current_camera + +func set_current_camera(new_value: Camera): + prev_camera = current_camera + current_camera = new_value + camera_lerp = 0.0 + $AnimationPlayer.play("switch_camera") + +func _on_camera_room_player_entered(player, camera): + assert(tracking_cameras.find(camera) == -1) + tracking_cameras.append(camera) + if tracking_cameras.size() == 1: + self.current_camera = tracking_cameras.back() + +func _on_camera_room_player_exited(player, camera): + tracking_cameras.erase(camera) + assert(tracking_cameras.find(camera) == -1) + if tracking_cameras.size() == 1: + self.current_camera = tracking_cameras.back() + +func _physics_process(delta): + $main_camera.global_transform.basis = Basis(prev_camera.global_transform.basis.get_rotation_quat().slerp(current_camera.global_transform.basis.get_rotation_quat(), camera_lerp)) + $main_camera.global_transform.origin = lerp(prev_camera.global_transform.origin, current_camera.global_transform.origin, camera_lerp) diff --git a/scripts/main_camera.gd b/scripts/tracking_camera.gd similarity index 79% rename from scripts/main_camera.gd rename to scripts/tracking_camera.gd index b246de7..2a82c7a 100644 --- a/scripts/main_camera.gd +++ b/scripts/tracking_camera.gd @@ -1,7 +1,7 @@ -extends Camera +extends Spatial export var target: NodePath onready var target_node: Spatial = get_node(target) -func _process(delta): +func _physics_process(delta): global_transform = global_transform.looking_at(target_node.global_transform.origin, Vector3.UP)