我正在编写一个简单的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
个案。
我的问题是:是否有更好的(更清晰,更简洁,更易于修改/维护)方式来指示我希望实体移动的方向?约束条件是它应该是离散的(因此没有速度矢量)。
答案 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)
嗯,我不知道你会怎么做,但是,我看到人们在人脸周围制作了一个跟踪红框图标,我想如果你可以将红色框放在相机的中心,你就可以拥有相机无论你身在何处,它本身都会移动......但这只是一个理论。这可能是你可以使用的算法!