有没有办法将其重写为switch语句?

时间:2014-12-21 18:04:07

标签: javascript switch-statement

我有一些重复的代码可以在游戏中找到方向。我认为应该将其写为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;

4 个答案:

答案 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 中完成所有操作