当前位置: 首页 > 知识库问答 >
问题:

球员走向左上角

匡凌
2023-03-14

我的游戏循环中有以下代码:

        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个答案

桂德义
2023-03-14

你可以通过做这样的事情来支配你想要的行为,对吗?

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

我猜你现在的问题是因为w和d的速度不相等,导致了非圆形的运动路径。

章盛
2023-03-14

这确实是一个评论,但为了更好地格式化,我将使用一个答案。

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

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)
张森
2023-03-14

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

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,看看是否可以重现这个问题,但我不能,所以我想这与按键(down/up/hold)事件的处理方式有关。也许你可以试着在每次迭代中记录一组按下的键,看看是否存在某种不一致性。

注意:在我的JSFIDLE中,W/A/S/D键已被UP/DOWN/LEFT/RIGHT替换,以最小化键盘布局问题。我还重构了循环的代码,以反映我的逻辑和SJuan76的答案。

 类似资料:
  • 实现气球左右阻尼摇摆动画效果,也就是摇动从激烈到完全静止。可以摇晃设备或者点击按钮让气球开始摇动。 [Code4App.com]

  • 我有一个有向无环图,在该图中有一个原点。 我如何访问从可达的所有顶点,这样,如果我访问,我就已经访问了所有有的顶点了? 示例: 从开始,必须在之后访问。 我尝试只执行一个BFS并检查每个顶点的父级,如果没有访问它们,则稍后重新添加它,但这证明太慢了,我相信可以是。 知道图是二进制的可能会有帮助,每个顶点将被最多两个顶点指向。在另一个方向上,每个顶点指向很多顶点。

  • 本文向大家介绍手写代码:给你一个格子,一个人在格子的左上角,他只能向右走一步,或者向下走一步,他走到右下角共有多少种方法相关面试题,主要包含被问及手写代码:给你一个格子,一个人在格子的左上角,他只能向右走一步,或者向下走一步,他走到右下角共有多少种方法时的应答技巧和注意事项,需要的朋友参考一下 参考回答:    

  • 2006年,GNOME与KDE都站在一个全新的起点,获得商业公司和更多自由程序员支持的GNOME踌躇满志,将超越的目光放在Mac OSX系统。也许你认为WindowsVista的半透明和三维界面将Linux远远抛在后面,那么我们告诉你这是绝对的误解,GNOME目前已经可以实现类似的效果,Novell在前几个月就向外界作过详细的演示。当前的KDE也可支持相当不错的半透明和阴影特效,技术上毫不落后于G

  • 我需要在我的代码中检测滑动方向。我可以检测到方向,但它就像我向右、右上方或左上方滑动一样。左边也一样,我的要求是不抬手指,如果我向左划,它应该只向左,所有的方向都一样。有人能帮帮我吗。提前感谢! @重写公共布尔onTouchEvent(MotionEvent touchevent){

  • 我正在制作一个带有pygame广告的平铺地图平台游戏,我为玩家定义了X和Y运动,以及一个代表重力的Y力,以使其正确跳跃。然而,当我的玩家摔倒在地上并且游戏开始时,由于重力不断将他推向下方,它既不能向右移动也不能向左移动。除此之外,当玩家跳跃并且我将其向右移动时,就像它无法识别与墙壁底部的碰撞一样(请参阅下面的gif以获取视觉解释)。 我尝试在玩家落地时禁用重力,在玩家跳跃时启用重力,但它没有按预期