我有一些重复的代码可以在游戏中找到方向。我认为应该将其写为switch语句,以便它可以更快地运行。这可能吗?
if (this.dw && !this.dd && !this.ds && !this.da) this.vector.angle = -90;
else if (!this.dw && this.dd && !this.ds && !this.da) this.vector.angle = 0;
else if (!this.dw && !this.dd && this.ds && !this.da) this.vector.angle = 90;
else if (!this.dw && !this.dd && !this.ds && this.da) this.vector.angle = 180;
else if (this.dw && this.dd && !this.ds && !this.da) this.vector.angle = -45;
else if (!this.dw && this.dd && this.ds && !this.da) this.vector.angle = 45;
else if (!this.dw && !this.dd && this.ds && this.da) this.vector.angle = 135;
else if (this.dw && !this.dd && !this.ds && this.da) this.vector.angle = -135;
答案 0 :(得分:1)
var sideDirection = dd ? 1 : (da ? -1 : 0);
var frontDirection = dw ? 1 : (ds ? -1 : 0);
var direction = { sideDirection, frontDirection };
angleBetween(lastDirection, direction);
在您的情况下,我认为您希望角度相对于{0,1}(顶部)。所以:
angleBetween({ 0, 1 }, direction);
答案 1 :(得分:1)
可能只是做一些事情而不是开关:
if (this.dd || this.dw || this.da || this.ds) {
this.vector.angle = [ -135, -90, -45,
180, 0, 0,
135, 90, 45 ][(this.ds - this.dw + 1) * 3 + (this.dd - this.da + 1)];
}
答案 2 :(得分:1)
我会有2d数组/向量:
var vector = [
[ '-135', '-90', '-45'],
[ 180, null, '0' ],
[ 135, '90', '45' ]
];
然后将默认中心点设置为1,1:
var cp = ['1', '1'];
然后使用此中心点变量在矢量周围移动,如下所示,如果按下“W”,则向上移动一行,或者如果按下“S”,则向左移动一行。如果同时按下这两个键,那么您将向上移动一行并离开一行,您将选择“-135”。
因此,要使用此逻辑在keypress事件之后获取变量,我会这样做:
var vector = [
[ '-135', '-90', '-45' ],
[ 180, null, '0' ],
[ 135, '90', '45' ]
];
var cp = ['1', '1'];
this.dw && cp[1]--;
this.da && cp[0]--;
this.ds && cp[1]++;
this.dd && cp[0]++;
this.vector.angle = vector[ cp[0] ][ cp[1] ]
您还可以全局设置矢量变量,这取决于您。如果this.vector.angle返回null,那么就没有按键,所以这也是一种很好的方法来为这种情况做一个回退。此脚本还会计算相反的键,因此如果将“A”和“D”按在一起,则矢量中没有水平移动。
P.S。我对你原来的角度有点困惑,所以矢量变量真的不是这样的吗?:
var vector = [
[ '315', '0', '45' ],
[ 270, null, '90' ],
[ 225, '180', '135' ]
];
答案 3 :(得分:1)
因为询问的问题是switch
(您可以简化parseInt
)
switch ((this.dw << 3) + (this.dd << 2) + (this.ds << 1) + this.da) {
case parseInt('1000', 2): this.vector.angle = -90; break;
case parseInt('0100', 2): this.vector.angle = 0; break;
case parseInt('0010', 2): this.vector.angle = 90; break;
case parseInt('0001', 2): this.vector.angle = 180; break;
case parseInt('1100', 2): this.vector.angle = -45; break;
case parseInt('0110', 2): this.vector.angle = 45; break;
case parseInt('0011', 2): this.vector.angle = 135; break;
case parseInt('1001', 2): this.vector.angle = -135; break;
}
您可以再次将其简化为 Object 查找,例如
this.vector.angle = {
'1000': -90,
'0100': 0,
'0010': 90,
'0001': 180,
'1100': -45,
'0110': 45,
'0011': 135,
'1001': -135,
}['' + (+this.dw) + (+this.dd) + (+this.ds) + (+this.da)];
我刚刚使用二进制字符串使其易于阅读,您可能决定在 Int 中完成所有操作