球员走向左上角

时间:2012-11-30 13:33:11

标签: java

我在游戏循环中有这个代码:

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    if (aPress) {
                        rotate -= rotSpd;
                        rotate = rotate < 0 ? 360 + rotate : rotate;
                    }
                    if (dPress) {
                        rotate += rotSpd;
                        rotate = rotate > 360 ? rotate - 360 : rotate;
                    }
                    if (wPress) {
                        x += (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));
                        y += (rotate < 270 ? (rotate < 90 ? -speed : speed) : -speed) * Math.abs(Math.cos(Math.toRadians(rotate)));
                    }
                    if (sPress) {
                        x -= (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));
                        y -= (rotate < 270 ? (rotate < 90 ? -speed : speed) : -speed) * Math.abs(Math.cos(Math.toRadians(rotate)));
                    }
                    repaint();
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException annoyingUncheckedException) {}
                }
            }

        }).start();

它做它应该做的事情:当你按A时,它逆时针转动。按D键时,顺时针旋转。当你按下W时,它向前移动,当你按下S时,它会向后移动。但是,如果我按住W和D,首先它会像它应该的那样进入一个圆圈,但它会慢慢地朝左上角的方向开始。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

首先,我会使用模运算符,以便更好地理解整个代码(也许它也更不容易出错)。

if (aPress) {
    rotate = (rotate - rotSpd + 360) % 360;
}
if (dPress) {
    rotate = (rotate + rotSpd) % 360;
}
if (wPress) {
    x += Math.cos(Math.toRadians(rotate));
    y += Math.sin(Math.toRadians(rotate));
}
if (sPress) {
    x -= Math.cos(Math.toRadians(rotate));
    y -= Math.sin(Math.toRadians(rotate));
}

关于你的问题,I made a quick jsFiddle看我是否可以重现问题,但我不能,所以我猜这与按键(向下/向上/按住)事件的处理方式有关。也许您可以尝试在每次迭代时记录按下的键集,并尝试查看是否存在某种不一致。

注意:在我的jsFiddle中,W / A / S / D键已被UP / DOWN / LEFT / RIGHT取代,以最大限度地减少键盘布局问题。我还重构了循环的代码以反映我的逻辑和SJuan76答案。

答案 1 :(得分:1)

这是一个评论,但为了更好的格式化,我会使用答案。

我发现这段代码(以及其他类似代码)有点奇怪:

x += (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));

x(水平值)应该取决于余弦,而不是窦。此外,奇怪的是,您必须更改速度的符号,然后将sin的值设为绝对值。

不是更好吗?

x+= speed * Math.cos(Math.toRadians(rotate))

当然,您可能希望使用垂直指向的0标题,但即使我发现更容易

x+= speed * Math.cos(Math.toRadians(rotate) + Math.PI/4)

答案 2 :(得分:0)

你可以通过做这样的事情来决定你想要的行为吗?

if(wPress && dPress)
{
    //code for both being hit
}

我的猜测是你当前的问题是由于w和d按下速度不相等导致非圆形运动路径的事实。