2015-10-23 48 views
2

我想实现的目标是让游戏的光标停留在窗口的“游戏性”区域,因此用户无法将光标移出这些区域界限。我不希望光标停留在一个位置,我仍然希望用户能够移动鼠标并点击鼠标,我只想让鼠标在某个区域“被封装”。请参阅本演示:如何将光标放在窗口的某个区域

Game screenshot for demonstration

我希望光标留在绿盒子只是我做了粉红色的标记之外。 所以我听说有一种方法可以通过在java中使用“Robot”或通过将MouseGrabbed设置为true来实现此目的,但没有找到足够的教程,所有测试都失败了。

我对Slick2D和java游戏开发一般都很陌生,所以请非常具体并引导我完成您的想法。 在此先感谢!

回答

2

如果我理解正确你你想要的以下内容:

  1. 有被限制在较低的绿色框在您的屏幕截图光标
  2. 仍允许本地光标是可用的(ungrabbed)当在游戏窗口之外导航时(即用户可以点击x按钮等)

我已经通过渲染我自己的光标并在游戏窗口中隐藏本地游标来实现此目的。有几个步骤来完成这一点。我应该提到,这是使用比当前LWJGL产品稍旧的版本完成的,我不确定您运行的是哪个版本。

步骤1:禁用本地光标

您希望您的游戏窗口内时,禁用本地光标。在我的情况下,抓取过于激进,因为它完全禁用了窗口游戏的鼠标。当初始化你的游戏,请尝试以下操作:

try { 
     final Cursor emptyCursor = new Cursor(1, 1, 0, 0, 1, BufferUtils.createIntBuffer(1), null); 
     Mouse.setNativeCursor(emptyCursor); 
    } catch (final LWJGLException e) { 
     //TODO: Consider better exception handling 
     e.printStackTrace(); 
    } 

这样做是什么使本机鼠标如无物,而在你的游戏窗口。这意味着当您将鼠标放在游戏上时,您通常看到的箭头将消失。这并不意味着鼠标不起作用,我们刚刚隐藏了它。

步骤2:鼠标运动轨迹采集的键盘/鼠标输入

public void collectInput() { 
    while(Mouse.next()){ 
     this.mouseX = Mouse.getX(); 
     final int newMousePosition = Mouse.getY(); 

     //Only move the cursor on the Y axis if it is between the upper and lower bounds 
     if(newMousePosition < this.upperBound && newMousePosition > this.lowerBound){ 
      this.mouseY = newMousePosition; 
     } 
     this.mouseY = Display.getHeight()- Mouse.getY(); 
     //TODO: Consider adding logging here 
    } 
} 

我有会抓住按键一个collectInput()方法时,/ I以为鼠标事件是必要的。我在这里所做的只是在我的游戏窗口中抓取鼠标当前的X/Y。从总显示高度中减去Y坐标,以稍后处理渲染坐标与鼠标坐标。在我的情况下,我只是使用了整个窗口的边界,但如果它们超出了你的绿框,你可能会考虑不更新X/Y坐标。

编辑 基于您的评论,我在这里更新的代码块不更新Y坐标,如果新的坐标是不是有些边界之内。您将需要确定您的x和y边界是什么,并且只有在从Mouse类收集到的新坐标位于其中时才更新鼠标X/Y坐标。

第3步:渲染自己的光标

最后,你将要呈现你的光标。这看起来像你会用LWJGL做的任何其他渲染。我的例子假设你有这样的结构:

//Render mouse texture 
    Color.white.bind(); 
    this.mouseTexture.bind(); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    GL11.glBegin(GL11.GL_QUADS); 
    GL11.glTexCoord2f(0, 0); 
    GL11.glVertex2f(this.mouseX, this.mouseY); 
    GL11.glTexCoord2f(1, 0); 
    GL11.glVertex2f(this.mouseX + this.cursorHeight, this.mouseY); 
    GL11.glTexCoord2f(1, 1); 
    GL11.glVertex2f(this.mouseX + this.cursorHeight, this.mouseY + this.cursorWidth); 
    GL11.glTexCoord2f(0, 1); 
    GL11.glVertex2f(this.mouseX, this.mouseY + this.cursorWidth); 
    GL11.glEnd(); 
    GL11.glDisable(GL11.GL_TEXTURE_2D); 

什么这导致的是,当我使用鼠标在游戏窗口,我的自定义光标呈现。很难从图像中分辨出来,但白色圆圈现在是我的光标,并且在我移动鼠标的任何位置都会移动。这里要注意的是,普通本地光标不被显示,由于第1步是很重要的: Controlling the mouse in the window

但是,当我离开游戏窗口,本机鼠标显示,我的自定义光标留在最后的地方它收到输入: enter image description here

+0

当,非常感谢您的彻底解答。我从你的想法中拿出榜样,并将其改造以适应我的需求。所以我所做的就是从网上抓取一个32x32光标,用Slick2D在我的程序中加载它,抓住鼠标使其消失,并使用'Mouse.getX();'将光标图像绑定到鼠标坐标上,等等。所以,现在,光标是我的“鼠标”,它从来没有离开窗口,因为它是一个图像。我现在的问题是:我如何让光标图像不超出下方的绿色矩形?因为它可以穿过绿色的上部绿色地带,心脏等非诺诺。 – MrGreenJam

+0

已添加到答案以显示如何执行此操作。您只需要建立一些边界并在更新x/y坐标时检查它们。如果将鼠标移动到界限之外(您的案例中的绿色框),请勿重新指定mouseX和/或mouseY。 –

+0

非常感谢!那么我在哪里将步骤2中的步骤放在我的Slick2D游戏状态中? (init?渲染?更新?)和最后一个问题,有点偏离主题,但你会知道如何切换鼠标方向被颠倒?如在用户将鼠标移动到左侧的情况下,光标向右移动,如果他将其向上移动,则光标停止等等。如果你无法回答,那很好!但这是我的最终目标,我试图收集尽可能多的信息。 – MrGreenJam

相关问题