我有一些使用LWJGL的Java代码:
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
...
Display.setDisplayMode(new DisplayMode(200, 200));
Display.create();
Mouse.create();
Mouse.setGrabbed(true);
while (true)
{
Display.update();
System.out.println("Data: d("+ Mouse.getDX() + "," + Mouse.getDY() + ") p(" + Mouse.getX() + "," + Mouse.getY() + ")");
Thread.sleep(1000/20);
}
当我物理移动鼠标时,它可以正常工作,但是当我使用Cocoa应用程序模拟鼠标移动时,它会正常工作:
getDX()
和getDY()
返回0getX()
和getY()
返回前一个值(就像鼠标没有移动一样)我用来移动鼠标的代码是这样的:
PostMouseEvent(0, kCGEventMouseMoved, mouseLocation);
...
void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point)
{
CGWarpMouseCursorPosition(point);
CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button);
CGEventSetType(theEvent, type);
CGEventPost(kCGHIDEventTap, theEvent);
CGAssociateMouseAndMouseCursorPosition(1);
CFRelease(theEvent);
}
几乎在所有其他应用程序(包括鼠标悬停事件)中都起作用。
如何修改我的Objective-C,以便LWJGL正确响应鼠标事件?
干杯
附加信息:
物理移动鼠标并停止之后,我在日志中得到了这个(例如):
Data: d(0,0) p(379,-748)
Data: d(0,0) p(379,-748)
Data: d(0,0) p(379,-748)
Data: d(0,0) p(379,-748)
Data: d(0,0) p(379,-748)
Data: d(0,0) p(379,-748)
当我让我的Cocoa应用程序移动鼠标时,以上内容继续显示
然后,当我再次移动鼠标时,值跳至:
Data: d(163,123) p(542,-625) //this seems like a huge change!
Data: d(8,7) p(550,-618) //normal
Data: d(0,0) p(550,-618) //normal
Data: d(48,36) p(598,-582) //etc
好像鼠标已经传送了?
编辑:使用
java.awt.Robot
移动鼠标时,LWJGL响应预期。 最佳答案
我的第一个假设,即没有可可应用程序响应CGEventPost
所做的鼠标移动,这是错误的。真正的问题是:
如果使用CGEventPost
和CGEventCreateMouseEvent
移动鼠标,则事件没有deltaX
和deltaY
值。而且很多应用程序似乎都依赖它们(就像我的目标应用程序(Minecraft)那样,它从LWJGL接收这些值)。
您必须手动计算这些值并在事件上进行设置。
我的项目中的示例代码:
CGEventRef pointGetEvent = CGEventCreate(NULL);
CGPoint point = CGEventGetLocation(pointGetEvent);
CFRelease(pointGetEvent);
if(test(SNES_Y)){
CGPoint oldPoint = point;
if(test(SNES_LEFT)){
point = CGPointMake(point.x - MOUSE_STEP, point.y);
}
if(test(SNES_RIGHT)){
point = CGPointMake(point.x + MOUSE_STEP, point.y);
}
if(test(SNES_DOWN)){
point = CGPointMake(point.x, point.y + MOUSE_STEP);
}
if(test(SNES_UP)){
point = CGPointMake(point.x, point.y - MOUSE_STEP);
}
if(oldPoint.x != point.x || oldPoint.y != point.y){
CGEventRef move1 = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, point, kCGMouseButtonLeft);
CGEventSetDoubleValueField(move1, kCGMouseEventDeltaX, point.x - oldPoint.x);
CGEventSetDoubleValueField(move1, kCGMouseEventDeltaY, point.y - oldPoint.y);
CGEventPost(kCGSessionEventTap, move1);
CFRelease(move1);
}
}