我正在编写一个播放器控制器,并且让玩家在两个轴(X、Y)上移动。每个轴上的值可以大致为 -1, 0, 1
。正值指向上方和右侧。根据我之前所做的检查,两个值不可能为零。
根据他们的组合,我想确定玩家面对的方向。玩家可以选择八个可能的方向。我使用 enum
: FacingDirection
来传递方向。
举例说明:
如果 X = 1
和 Y = 0
则玩家正在向屏幕右侧移动。
如果 X = -1
和 Y = -1
则玩家正在向屏幕左下角移动。
我想出了两种可能的解决方案来解决这个问题,但我想知道哪个更有效。
两种解决方案都使用 _inputs
(二维向量)来获取 X
和 Y
的值。
private FacingDirection findMoveDirection() {
int x = 0, y = 0;
float testing = _inputs.x;
for(int i = 0; i < 2; i++) {
int temp;
if (testing != 0) {
temp = (testing > 0) ? 1 : -1;
} else {
temp = 0;
}
if (i < 1) {
x = temp;
} else {
y = temp;
break;
}
testing = _inputs.y;
}
int check = x + y;
switch (check) {
case 2 : {
return FacingDirection.UP_RIGHT;
}
case -2 : {
return FacingDirection.DOWN_LEFT;
}
case 1 : {
if (x > 0) {
return FacingDirection.RIGHT;
} else {
return FacingDirection.UP;
}
}
case 0 : {
if (x > 0) {
return FacingDirection.DOWN_RIGHT;
} else {
return FacingDirection.UP_LEFT;
}
}
case -1 : {
if (x < 0) {
return FacingDirection.LEFT;
} else {
return FacingDirection.DOWN;
}
}
default : {
Debug.LogWarning("Something went wrong while determining moving direction. Returning DOWN as moving direction.");
return FacingDirection.DOWN;
}
}
这是一种更直接的 if/else
方法。
private FacingDirection findMoveDirection() {
float x = _inputs.x, y = _inputs.y;
if (x != 0) {
if (x > 0) {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_RIGHT;
} else {
return FacingDirection.DOWN_RIGHT;
}
} else {
return FacingDirection.RIGHT;
}
} else {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_LEFT;
} else {
return FacingDirection.DOWN_LEFT;
}
} else {
return FacingDirection.LEFT;
}
}
} else {
if (y > 0) {
return FacingDirection.UP;
} else {
return FacingDirection.DOWN;
}
}
}
答案 0 :(得分:1)
您可以将两个值合并为一个。例如:
int directions = y * 2 + x;
它唯一标识一个方向。
其允许值为:-3
... +3
,不包括0
。
然后,您可以在 switch
(没有 if
的解决方案 A)中或作为字典键使用它。
答案 1 :(得分:0)
解决方案 B 肯定更快,在最坏的情况下进行 4 次比较,而解决方案 A 在最坏的情况下进行 8 次比较,就在 for 循环内.
您可以对这两种方法进行基准测试并进行验证。实际衡量性能总是一个好主意:这段代码很简单,但在更复杂的情况下,有些因素并不明显(即处理内存中的许多对象时 CPU 缓存效果)。