我在游戏循环中有这个代码:
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,首先它会像它应该的那样进入一个圆圈,但它会慢慢地朝左上角的方向开始。我该如何解决这个问题?
答案 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按下速度不相等导致非圆形运动路径的事实。