Implement spectator camera
This commit is contained in:
parent
82fcfe0ea0
commit
698c9067a7
@ -3,5 +3,5 @@
|
||||
[ext_resource type="MapResource" uid="uid://c7n1tacc7a73t" path="res://maps/default_map.tres" id="1_glms7"]
|
||||
|
||||
[node name="game_manager" type="GameManager" unique_id=1442044769]
|
||||
respawn_timer = 5.0
|
||||
respawn_timer = 10.0
|
||||
maps = Array[MapResource]([ExtResource("1_glms7")])
|
||||
|
||||
@ -5,12 +5,13 @@
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
|
||||
|
||||
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "splorch")]
|
||||
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "splorch", "spectator_camera")]
|
||||
move_speed = 5.0
|
||||
soldier_mesh = NodePath("soldier_m")
|
||||
collider = NodePath("collision_shape_3d")
|
||||
splorch = NodePath("gpu_particles_3d")
|
||||
health = 100
|
||||
spectator_camera = NodePath("spectate_root/spectate_camera")
|
||||
collision_layer = 2
|
||||
collision_mask = 4
|
||||
|
||||
@ -23,3 +24,9 @@ shape = SubResource("CapsuleShape3D_1cgct")
|
||||
|
||||
[node name="gpu_particles_3d" parent="." unique_id=986677517 instance=ExtResource("2_orxjf")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4540546, 0)
|
||||
|
||||
[node name="spectate_root" type="Node3D" parent="." unique_id=624336254]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7611488, 0)
|
||||
|
||||
[node name="spectate_camera" type="Camera3D" parent="spectate_root" unique_id=1408688016]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.89379096, 0.44848388, 0, -0.44848388, 0.89379096, 0, 0.6601318, 1.0407685)
|
||||
|
||||
@ -113,6 +113,7 @@ pub struct LocalPlayer {
|
||||
|
||||
is_dead: bool,
|
||||
dead_for: f64,
|
||||
killer_id: Option<u16>,
|
||||
|
||||
locked: bool,
|
||||
|
||||
@ -227,6 +228,7 @@ impl IPlayer for LocalPlayer {
|
||||
splorch.set_emitting(true);
|
||||
}
|
||||
self.is_dead = true;
|
||||
self.killer_id = Some(source_player);
|
||||
}
|
||||
}
|
||||
|
||||
@ -251,6 +253,10 @@ impl ICharacterBody3D for LocalPlayer {
|
||||
if let Some(mesh) = &mut self.soldier_mesh {
|
||||
self.weapon = mesh.bind_mut().spawn_raygun();
|
||||
}
|
||||
|
||||
if let Some(camera) = &mut self.camera {
|
||||
camera.set_current(true);
|
||||
}
|
||||
}
|
||||
|
||||
fn process(&mut self, delta: f64) {
|
||||
@ -267,6 +273,25 @@ impl ICharacterBody3D for LocalPlayer {
|
||||
let time_remaining = respawn_timer - self.dead_for;
|
||||
label.set_text(&format!("Respawn in\n{:.2}", time_remaining));
|
||||
}
|
||||
|
||||
if let Some(camera) = &self.camera {
|
||||
if camera.is_current() && self.dead_for > 3. {
|
||||
if let Some(game) = Game::singleton()
|
||||
&& let Some(killer_id) = self.killer_id
|
||||
{
|
||||
let game = game.bind();
|
||||
let remote_player = game.find_player(killer_id);
|
||||
if let Some(remote_player) = &remote_player
|
||||
&& let Some(remote_character) = remote_player.character.clone()
|
||||
&& let Ok(mut remote_character) =
|
||||
remote_character.try_cast::<RemotePlayer>()
|
||||
&& let Some(camera) = &mut remote_character.bind_mut().spectator_camera
|
||||
{
|
||||
camera.set_current(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.shoot_cd -= delta;
|
||||
@ -398,6 +423,8 @@ pub struct RemotePlayer {
|
||||
splorch: Option<Gd<GpuParticles3D>>,
|
||||
#[export]
|
||||
health: i32,
|
||||
#[export]
|
||||
spectator_camera: Option<Gd<Camera3D>>,
|
||||
|
||||
pub player_id: Option<u16>,
|
||||
pub weapon: Option<DynGd<Node3D, dyn Weapon>>,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user