c# - 哪种方式被认为比较这些变量更有效?
问题描述
我正在编写一个播放器控制器,并且我正在两个轴(X,Y)上移动播放器。这些值可以大致-1, 0, 1
位于每个轴上。正值指向 UP 和 RIGHT。根据我之前所做的检查,这两个值都不可能为零。
根据他们的组合,我想确定玩家面对的方向。玩家有八个可能的方向。我使用enum
:FacingDirection
来传递方向。
澄清示例:
如果X = 1
然后Y = 0
玩家正在向屏幕的右侧移动。如果
X = -1
然后Y = -1
玩家正在向屏幕的左下角移动。
对于这个问题,我提出了两种可能的解决方案,但我想知道哪一种更有效。
两种解决方案都使用_inputs
2D 向量来获取 和 的X
值Y
。
解决方案 A
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;
}
}
解决方案 B
这是一种更直接的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;
}
}
}
解决方案
您可以将两个值合并为一个值。例如:
int directions = y * 2 + x;
它唯一地标识一个方向。
其允许值为:-3
... +3
,不包括0
.
然后,您可以在switch
(没有 s 的解决方案 A if
)或字典键中使用它。
推荐阅读
- python - 将熊猫数据框创建为另一个行的函数连接的惯用方法
- javascript - 使用 Microsoft Teams JavaScript 库发送聊天消息
- awk - 在文本文件每一行的最后一个 `/` 之后打印的 `awk` 方法
- windows - 调用/ret 指令之间的 Windows pintool 不匹配
- flutter - 在flutter_bloc中提供后无法立即消耗一肘
- javascript - ajax 实时搜索添加按键向下功能
- java - 仅当字段不为空时,如何使用 javax 验证对字段应用自定义验证?
- java - 将单个 Json 对象作为字符串返回
- python - 如何使用熊猫数据框中的列名访问当前行数据?
- linux - 如何使用并行命令在 MacBook 上利用多核并行性?