除了说我的 LWJGL 似乎对鼠标和绘制纹理有不同的坐标系之外,我真的不确定如何对此进行扩展。似乎纹理具有将 (0, 0) 放在左上角的通常 Java2D 方式,而鼠标则采用更明智的方式将原点放在左下角。我已经检查了我的代码一堆,但我没有看到任何修改我读取它们的位置和我使用它们的位置之间的值。它让我陷入了一个循环,我无法弄清楚。
我会把所有涉及到鼠标输入和纹理绘制的代码贴出来给大家看看。
private static void pollHelpers()
{
while(Mouse.next())
{
InputHelper.acceptMouseInput(Mouse.getEventButton(),
Mouse.getEventX(), Mouse.getEventY());
}
while (Keyboard.next()) {
if (Keyboard.getEventKeyState()) {
InputHelper.acceptKeyboardInput(Keyboard.getEventKey(), true);
} else {
InputHelper.acceptKeyboardInput(Keyboard.getEventKey(), false);
}
}
}
public static void acceptMouseInput(int mouseButton, int x, int y)
{
for(InputHelper ie: InputHelper.instances)
{
if(ie.checkRectangle(x, y))
{
ie.sendMouseInputToParent(mouseButton);
}
}
}
private void sendMouseInputToParent(int mouseButton)
{
parent.onClick(mouseButton);
}
public boolean checkRectangle(int x, int y)
{
//y = InputManager.HEIGHT - y; See below for explanation
return x > parent.getX() && x < parent.getX() + parent.getWidth() &&
y > parent.getY() && y < parent.getY() + parent.getHeight();
}
我把这行代码放进去是因为它暂时解决了坐标系问题。但是,我希望我的代码尽可能独立,因此我希望尽可能多地消除对其他类的依赖。
这些是触摸鼠标输入的唯一方法,据我所知,它们都没有改变任何东西,所以这里一切都很好。现在对于纹理方法:
public void draw()
{
if(!clicked || deactivatedImage == null)
{
activatedImage.bind();
glBegin(GL_QUADS);
{
DrawHelper.drawGLQuad(activatedImage, x, y, width, height);
}
glEnd();
} else {
deactivatedImage.bind();
glBegin(GL_QUADS);
{
DrawHelper.drawGLQuad(deactivatedImage, x, y, width,
height);
}
glEnd();
}
}
public static void drawGLQuad(Texture texture, float x, float y, float width, float
height)
{
glTexCoord2f(x, y);
glVertex2f(x, y);
glTexCoord2f(x, y + texture.getHeight());
glVertex2f(x, y + height);
glTexCoord2f(x + texture.getWidth(), y + texture.getHeight());
glVertex2f(x + width, y +height);
glTexCoord2f(x + texture.getWidth(), y);
glVertex2f(x + width, y);
}
老实说,我对这种方法中真正发生的事情一无所知,但我能够自己将它组合在一起并让它发挥作用。我的猜测是这就是问题所在。
谢谢你的帮助!