XNA AI:在屏幕上管理敌人

Jun*_*208 1 c# xna design-patterns

我有两个课程,人类和怪物.

两者都有一个名为MoveBehavior的属性

Human有HumanMoveBehavior,而Monster有MonsterMoveBehavior

我希望HumanMoveBehavior从怪兽身上移动,并让MonsterMoveBehavior移动TOWARD Humans.

我遇到的问题是我应该在哪里移动代码?

在人类/怪物类中?

使用这种方法,我有一个Move()方法,它接受游戏中所有实体的List,使用名为GetListOfOpponents(List allsprites)的方法决定它是Monster还是Human,然后运行GetNearestOpponent(List opponents);

但这看起来非常混乱.

我应该有一个SpriteController来决定Sprite移动的位置吗?我不确定我需要把这段代码放在哪里:(

谢谢!

Mar*_*nix 5

你可以想到一个AIManager只是说:

foreach(GameObject go in m_myObjects) // m_myObjects is a list of all objects that require updating
{
    go.Update(); // standard GameObject function
}
Run Code Online (Sandbox Code Playgroud)

之后,每个类都应该处理自己的代码.所以更新在类本身中起作用.

人类说:

// just a class which is a gameObject and also has moving behaviour
// do the same with monster
public class Human : GameObject, IMoveBehaviour
{
    public override Update()
    {
        GoMove();
    }

    public void GoMove()
    {
        // human specific logic here
    }
}

// This interface describes that some movement 
// will happen with the implementing class
public interface IMoveBehaviour
{
    void GoMove();
}
Run Code Online (Sandbox Code Playgroud)

通过使用接口,您可以将特定语言作为类的一部分,并且您不需要创建一些可以为您处理的类.当然有可能.但在现实生活中,人类/怪物是移动的,而不是他携带的物体.

UPDATE

回答评论.因为有一个AIManager,甚至一个完整的GameObjectManager将是很好的维护所有GameObjects,你可以问AIManager你放在哪里你不能去.

由于路径查找大部分时间是通过使用某些导航网格或指定网格完成的,因此GameObjectManager可以返回具有所有可导航点的特定网格.你肯定不能定义每个怪物的所有位置.因为大多数时候,怪物并不完全知道每个人的位置(在现实生活中).因此,知道哪些地方不合适确实很好,但知道每个人的位置,也会给你的AI带来太大的优势.

因此,考虑返回一个网格,其中包含要去的地方和不去的地方,而不是将这些内容保留在怪物/人类中.通过思考现实生活中的问题,始终检查你应该留下什么.