我已经为其他敌人实施了基本的跟随玩家行为
// For knife soldier, simply runs at player
IEnumerable<int> FollowPlayer(float acceleration = 0.3f)
{
while (true)
{
if (!PlayerShip.Instance.IsDead)
Velocity += (PlayerShip.Instance.Position - Position) * (acceleration / (PlayerShip.Instance.Position - Position).Length());
if (Velocity != Vector2.Zero)
Orientation = PlayerShip.Instance.Position.ToAngle();
yield return 0;
}
}`
我想为狙击手实施更复杂的行为。它的前提是狙击手必须与玩家保持一定距离才能射击。 这是该代码:
public static void HandleSniperShotRange()
{
float acceleration = 0.2f;
// Check whether player is within sniper range (Used for sniper behaviour)
for (int i = 0; i < enemies.Count; i++)
{
if (enemies[i].IsActive && IsCollidingSniperRange(PlayerShip.Instance, enemies[i]))
{
enemies[i].Velocity += (PlayerShip.Instance.Position - enemies[i].Position) * (acceleration / (PlayerShip.Instance.Position - enemies[i].Position).Length());
enemies[i].Orientation = PlayerShip.Instance.Position.ToAngle() * -1;
}
}
}
private static bool IsCollidingSniperRange(Entity a, Entity b)
{
float radius = a.Radius + b.Radius + 120;
return !a.IsExpired && !b.IsExpired && Vector2.DistanceSquared(a.Position, b.Position) < radius * radius;
}
我的代码当前会在屏幕上绘制一个狙击手,但不会移动。
现在我无法将它们都放在同一个Enemy类中,因为我的EntityManager类存储了所有添加的敌方实体的列表。当我确实将狙击手行为列入敌人的职业时,它会起作用,但是如果一个人离得太近,所有敌人都会撤离玩家。
我如何将这段代码放入我的Enemy类中,或者如何将其留在EntityManager中,但是如何更新每帧并正确进行交互?
谢谢
答案 0 :(得分:0)
如果我正确理解了这个问题,那么您的问题是如何在一个ManagerClass中处理不同的EnemyClass?
您通常有一个基本敌人类(如果您没有在其中定义逻辑,也可以是一个接口),它提供了基本的行为。最重要的是,您可以定义特定的敌人类型。 您的经理班级只处理某种敌人清单,而逻辑则保留在特定的敌人班级中。 这是继承和多态的简单示例...
伪代码:
interface IEnemy
{
void FollowPlayer();
}
class EnemySniper : IEnemy
{
void FollowPlayer()
{
//Implement Followig Player Logic for Sniper
}
}
class EnemyManager
{
List<IEnemy> enemies = new List<IEnemy>();
//Add all your enemies at gamestart or wherever
foreach(IEnemy ie in enemies) //this needs to be called on each Update()
ie.FollowPlayer();
}