mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-26 20:51:13 +00:00
SpectatorCamera can now follow the 'tracer' actor. Also added a 'lagdistance' property for lazy follow.
This commit is contained in:
parent
2b555d7556
commit
7fbb4cd06c
1 changed files with 50 additions and 9 deletions
|
@ -132,6 +132,11 @@ class AimingCamera : SecurityCamera
|
|||
class SpectatorCamera : Actor
|
||||
{
|
||||
|
||||
double lagdistance;
|
||||
bool chasing_tracer;
|
||||
property lagdistance : lagdistance;
|
||||
property chasing_tracer : chasing_tracer;
|
||||
|
||||
default
|
||||
{
|
||||
+NOBLOCKMAP
|
||||
|
@ -140,29 +145,65 @@ class SpectatorCamera : Actor
|
|||
+NOINTERACTION
|
||||
RenderStyle "None";
|
||||
CameraHeight 0;
|
||||
SpectatorCamera.chasing_tracer false;
|
||||
SpectatorCamera.lagdistance 0.0;
|
||||
}
|
||||
|
||||
void Init(double dist, double yaw, double inpitch, int inflags)
|
||||
{
|
||||
if(((inflags > 0) && (inflags & VPSF_ORTHOGRAPHIC)) || ((inflags < 0) && (ViewPos.Flags & VPSF_ORTHOGRAPHIC))) dist *= 3.0;
|
||||
SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)-0.5*players[consoleplayer].mo.height), inflags);
|
||||
// CameraHeight = players[consoleplayer].mo.viewheight; // Not used
|
||||
|
||||
double zshift = 0.0;
|
||||
if(tracer != NULL)
|
||||
{
|
||||
if(player != NULL) zshift = -0.5*tracer.height;
|
||||
else zshift = 0.5*tracer.height;
|
||||
}
|
||||
else if (player != NULL && player.mo != NULL) zshift = -0.5*player.mo.height;
|
||||
|
||||
SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)+zshift), inflags);
|
||||
LookAtSelf(inpitch);
|
||||
}
|
||||
|
||||
void LookAtSelf(double inpitch)
|
||||
{
|
||||
if(ViewPos.Offset != (0., 0., 0.))
|
||||
{
|
||||
Vector3 negviewpos = (-1.0) * ViewPos.Offset;
|
||||
angle = negviewpos.Angle();
|
||||
pitch = inpitch;
|
||||
}
|
||||
if(ViewPos.Offset != (0., 0., 0.))
|
||||
{
|
||||
Vector3 negviewpos = (-1.0) * ViewPos.Offset;
|
||||
angle = negviewpos.Angle();
|
||||
pitch = inpitch;
|
||||
}
|
||||
}
|
||||
|
||||
override void Tick()
|
||||
{
|
||||
if(player != NULL)
|
||||
if(tracer != NULL)
|
||||
{
|
||||
Vector3 distvec = tracer.pos - pos;
|
||||
double dist = distvec.length();
|
||||
if((dist <= 4 && chasing_tracer) || lagdistance <= 0.0) // Keep tracer centered on screen
|
||||
{
|
||||
SetOrigin(tracer.pos, true);
|
||||
chasing_tracer = false;
|
||||
}
|
||||
else // Lazy follow tracer
|
||||
{
|
||||
if(dist >= 2*lagdistance)
|
||||
{
|
||||
SetOrigin(tracer.pos, true);
|
||||
chasing_tracer = false;
|
||||
}
|
||||
else if(dist > lagdistance && !chasing_tracer) chasing_tracer = true;
|
||||
|
||||
if(chasing_tracer)
|
||||
{
|
||||
speed = tracer.vel.xy.length()/dist;
|
||||
if(speed == 0.0) speed = tracer.speed/dist;
|
||||
SetOrigin(pos + 2*distvec*speed, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(player != NULL && player.mo != NULL)
|
||||
{
|
||||
cameraFOV = player.FOV;
|
||||
SetOrigin(player.mo.pos, true);
|
||||
|
|
Loading…
Reference in a new issue