Files
evilsatellites/EvilSatellites/Radar.cs
T

126 lines
4.1 KiB
C#
Raw Normal View History

2021-04-11 17:09:57 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SynthySound;
using EvilSatellites.Screens;
using EvilSatellites.Objects;
using Microsoft.Xna.Framework;
namespace EvilSatellites
{
public class Radar
{
public bool Active { get; set; }
public IGameObject Owner;
public IGameObject Target;
public IScreen Screen;
2021-04-20 15:57:44 +02:00
public ISoundEffect3D RadarNoise;
2021-04-19 15:41:37 +02:00
public ObjectType Filter;
2021-04-20 15:57:44 +02:00
public Vector3 RadarDirection;
public Vector3 RadarPosition;
public bool IsPlaying;
public Vector3 RadarTarget;
2021-04-11 17:09:57 +02:00
public Radar(IGameObject owner, IScreen screen)
{
Owner = owner;
Screen = screen;
2021-04-20 15:57:44 +02:00
RadarNoise = Screen.Manager.Sound.Load3D(@"sfx/ui/radar/pingEnemy.wav");
2021-04-11 17:09:57 +02:00
RadarNoise.Loop = true;
2021-04-19 15:41:37 +02:00
Filter = ObjectType.Satellite;
2021-04-20 15:57:44 +02:00
2021-04-11 17:09:57 +02:00
Active = false;
}
2021-04-19 15:41:37 +02:00
public void SetObjectType(ObjectType type)
{
Filter = type;
}
2021-04-11 17:09:57 +02:00
public void Start()
{
RadarNoise.Reset();
RadarNoise.Play();
Active = true;
}
public void Stop()
{
RadarNoise.Pause();
Active = false;
}
2021-04-20 15:57:44 +02:00
public void UpdateX(List<IGameObject> objects)
2021-04-11 17:09:57 +02:00
{
2021-04-11 18:42:22 +02:00
if (objects.Count < 1) return;
2021-04-19 19:49:13 +02:00
float minDistance = 50000000;
2021-04-19 15:41:37 +02:00
Target = null;
2021-04-11 17:09:57 +02:00
foreach (var obj in objects)
{
2021-04-19 15:41:37 +02:00
if (obj.Type != Filter) continue;
2021-04-11 17:09:57 +02:00
float distance = Vector3.Distance(obj.Position, Owner.Position);
if (distance < minDistance)
{
minDistance = distance;
Target = obj;
}
}
2021-04-19 15:41:37 +02:00
if (Target == null)
{
RadarNoise.Pitch = 0.1;
return;
}
2021-04-11 17:09:57 +02:00
Vector3 radarTarget = (Target.Position - Owner.Position);
radarTarget.Normalize();
RadarNoise.Pitch = MathHelper.Clamp(0.1f / Vector3.Distance(Owner.Rotation.Forward, radarTarget) * 3f, 0, 1);
}
2021-04-20 15:57:44 +02:00
public void Update(List<IGameObject> objects)
{
if (IsPlaying)
{
RadarPosition += RadarDirection;
RadarNoise.Position = new System.Numerics.Vector3(RadarPosition.X, RadarPosition.Y, RadarPosition.Z);
RadarNoise.Pitch = MathHelper.Clamp(0.1f / Vector3.Distance(Owner.Rotation.Forward, RadarTarget) * 3f, 0, 2);
if (Vector3.Distance(RadarPosition, Owner.Position) > 20)
{
IsPlaying = false;
}
} else
{
if (objects.Count < 1) return;
float minDistance = 50000000;
Target = null;
foreach (var obj in objects)
{
if (obj.Type != Filter) continue;
float distance = Vector3.Distance(obj.Position, Owner.Position);
if (distance < minDistance)
{
minDistance = distance;
Target = obj;
}
}
if (Target == null)
{
// RadarNoise.Pitch = 0.1;
return;
}
Vector3 radarTarget = (Target.Position - Owner.Position);
radarTarget.Normalize();
RadarTarget = radarTarget;
RadarPosition = new Vector3(Owner.Position.X+Owner.Dimensions.X/2, Owner.Position.Y+Owner.Dimensions.Y/2, Owner.Position.Z+Owner.Dimensions.Z/2);
RadarDirection = new Vector3(radarTarget.X*0.5f, radarTarget.Y*0.5f, radarTarget.Z*0.5f);
RadarNoise.Reset();
// RadarNoise.Play();
IsPlaying = true;
// RadarNoise.Pitch = MathHelper.Clamp(0.1f / Vector3.Distance(Owner.Rotation.Forward, radarTarget) * 3f, 0, 1);
}
}
2021-04-11 17:09:57 +02:00
}
}