【问题标题】:Slick2D: Changing mouse sensitivity changes cursor x/y positionsSlick2D:更改鼠标灵敏度会更改光标 x/y 位置
【发布时间】:2015-10-26 21:30:41
【问题描述】:

我目前正在构建一个测试游戏,我可以在其中尝试创建游戏中发生的某些效果,例如当用户更改设置中的值时更改鼠标灵敏度。首先,让我澄清一下,所有这些都是在 Java 中使用 Slick2D 和 lwjgl 完成的。

现在已经不碍事了,我需要告诉你我的鼠标在屏幕上的显示方式。由于我将玩弄鼠标移动,我决定在我的 init{} 方法中使用 Mouse.setGrabbed(true); 隐藏本机鼠标,从网络上抓取一个 32x32 的光标图像,并将光标图像 x/y 坐标与本机绑定鼠标坐标,因此它现在显示为本机鼠标。这是如何完成的:

int xpos = Math.max(Math.min(Mouse.getX(), 945), 4);
int ypos = Math.max(Math.min(Mouse.getY(), 572), 23);

这一切都只是意味着4< xpos< 94523< ypos<572 所以光标停留在我的窗口范围内(不是真正重要的信息,但我决定包含它)。

让我们来解决问题。在鼠标的“默认”状态下,它与上述本地鼠标的坐标相关联。所以光标是这样渲染的:

cursor.draw(xpos, 640 - ypos);

(需要640 - ypos,因为鼠标坐标是从左下角开始的)现在,当用户进入游戏设置并将鼠标灵敏度更改为更高,例如比通常速度高8倍时,我像这样渲染光标坐标(只有x灵敏度乘以方便测试):

if(settingsSens == 0){
xpos = Math.max(Math.min(Mouse.getX()*8-28, 945), 4); //This means that 4< xpos< 945 so the image always stay within the window
cursor.draw(xpos, 640 - ypos);
}

settingsSens 是设置中鼠标灵敏度变化的布尔值。发生的情况是光标图像没有走出窗口,因为它的 xpos 被限制在其中,但坐标似乎消失了......这真的很难解释:看起来图像保留但坐标离开,因此如果您将鼠标移到右侧,光标会停在窗口的右侧,当您尝试将其移回时,光标会“粘”在窗口的右侧,直到 x 坐标达到 945,在这一点光标将再次向左移动并从窗口的右侧分离。我想阻止这一切!

我正在寻找的只是更改鼠标的灵敏度,而不会在更改后更改光标位置。因为到目前为止,一旦您更改灵敏度并返回,由于 xpos 乘以 8,因此坐标超出了窗口,而不是 xpos 过去以正常速度运行的旧位置。

【问题讨论】:

    标签: java window mouse slick2d


    【解决方案1】:

    您缺少的是坐标的正确边界,因为您需要在计算 xPosyPos 时应用灵敏度修改,而不是在绘制鼠标时。

    我强烈建议您将 x 和 y 坐标的计算逻辑正确地提取到一个单独的方法中,一次封装一个坐标的灵敏度和边界,如下所示:

    static int boundedCoordinate(int coordinate, int sensitivity, int maximum, int minimum) {
        // 4 < xpos < 945
        int result = coordinate * sensitivity;
        result = Math.max(minimum, result);
        result = Math.min(maximum, result);
    }
    

    然后对于您的绘图循环,请执行以下操作:

    cursor.draw(boundedCoordinate(xPos, sensitivity, X_MAXIMUM, X_MINIMUM),
        boundedCoordinate(yPos, sensitivity, Y_MAXIMUM, Y_MINIMUM));
    

    【讨论】:

    • 好的,我明白了,所以您建议我在绘制鼠标之前将 xPos 和 yPos 乘以灵敏度因子? (Java 对“Pair”很生气)
    • @MrGreenJam 这应该更明显... Pair 只是我在需要从方法返回多个结果时避免返回数组的一个噱头
    • 好的,我明白了。是的,所以我所做的是在绘制哪种方法之前将 xpos 乘以 8?.. 所以光标图像不会离开窗口,这很棒,但是.. 真的很难解释:看起来图像仍然存在但是坐标离开了,所以如果你向右移动鼠标,光标会停在窗口的右侧,当你试图把它带回来时,光标会停留在窗口的右侧,直到 x 坐标达到 945光标将再次向左移动并与窗口右侧分离。
    • @MrGreenJam 正确。不幸的是,我不知道如何解决这个问题,因为我没有捕获鼠标的经验。这是一个更复杂的问题:)
    • 确实,非常感谢您的意见!我会再等一会儿,希望有一个英雄可以让我摆脱这种我喜欢称之为“被卡住”的麻烦经历,对不起……我有点累了,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2010-11-16
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多