2

我的游戏循环中有这段代码:

        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,起初它会像它应该的那样绕一个圆圈,但它会慢慢开始向左上角的方向移动。我怎样才能解决这个问题?

4

3 回答 3

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));
}

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

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

于 2013-01-15T01:50:26.683 回答
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)
于 2012-11-30T13:42:08.887 回答
0

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

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

我的猜测是,您当前的问题是由于 aw 和 d 压力机的速度不相等导致非圆形运动路径。

于 2012-11-30T13:40:47.140 回答