指示离散的AI运动方向

时间:2013-07-02 20:58:58

标签: c# enums

我正在编写一个简单的AI函数,它将返回移动的方向(向上,向下,向左,向右,保持静止),而我的第一直觉是使用简单的枚举:

public enum Direction
{
    None,
    Up,
    Down,
    Left,
    Right
}

但我也希望有对角线方向,这意味着要做一个更加冗长的枚举:

public enum Direction
{
    None,
    Up,
    UpLeft,
    Left,
    DownLeft,
    Down,
    DownRight,
    Right,
    UpRight
}

我的功能类似于:

public Direction Move()
{
    Direction moveDirection;

    // Calculate direction to move

    return moveDirection;
}

然而,我觉得必须有更优雅的方式来做到这一点。我想为每个[Flags] enum进行垂直和水平移动(基本上是两个bool s),但后来我不能包含None个案。

我的问题是:是否有更好的(更清晰,更简洁,更易于修改/维护)方式来指示我希望实体移动的方向?约束条件是它应该是离散的(因此没有速度矢量)。

2 个答案:

答案 0 :(得分:1)

枚举标志可以使用“None”并且仍然具有标志组合。事实上,通常使用标志,你必须有None来表示没有标志。

例如,

    [Flags]
    enum Direction
    {
        None = 0x0,
        East = 0x1,
        North = 0x2,
        West = 0x4,
        South = 0x8
    }

但是......你可能只想添加diaganol方向......例如,它可以让生活更轻松......

    [Flags]
    enum Direction
    {
        None = 0x0,
        East = 0x1,
        North= 0x2,
        West = 0x4,
        South = 0x8,
        NorthEast = Direction.North | Direction.East,
        NorthWest = Direction.North | Direction.West,
        SouthEast = Direction.South | Direction.East,
        SouthWest = Direction.South | Direction.West
    }

    private bool TestDirection(Direction input, Direction test)
    {
        return ((input & test) == test);        
    }

    private void SomeFunction(Direction d)
    {
        if(TestDirection(d, Direction.North) && TestDirection(d, Direction.West)) // NW
            // do something;
        if(TestDirection(d, Direction.NorthWest)) // NW
            // do something;
    }

我会说这里的第二个案例更容易输入。关于这种做法的一件事是,如果你这样做

TestDirection(Direction.North, Direction.NorthWest)

它会回归真实......我不确定你是否想要......但你可能会这样。这样做可能最容易:

    enum Direction
    {
        None ,
        East ,
        North,
        West ,
        South,
        NorthEast, 
        NorthWest,
        SouthEast, 
        SouthWest
    }

    private void SomeFunction(Direction d)
    {
        if(d == Direction.NorthWest)
                // do something
    }

您可能会发现这比使用旗帜更容易。总的来说......根据你的应用,我会说你找到最方便的。带有标志的另一个有效点是:

Direction d = Direction.North | Direction.West | Direction.East | Direction.South;

这没有多大意义......所以也许你只想使用没有旗帜的选项。

答案 1 :(得分:0)

嗯,我不知道你会怎么做,但是,我看到人们在人脸周围制作了一个跟踪红框图标,我想如果你可以将红色框放在相机的中心,你就可以拥有相机无论你身在何处,它本身都会移动......但这只是一个理论。这可能是你可以使用的算法!