鼠标输入

所有的pyglet窗口都可以接受来自带有2维滚轮的3键鼠标的输入。鼠标指针通常由操作系统绘制,但您可以覆盖此选项并请求不同的光标形状或提供您自己的图像或动画。

鼠标事件

所有鼠标事件都由从操作系统接收事件的窗口调度。通常情况下,这是鼠标光标所在的窗口,但是鼠标独占和拖动操作意味着情况并不总是如此。

鼠标指针位置的坐标空间相对于窗口的左下角,随着Y值的增加而接近屏幕顶部(请注意,与许多其他窗口工具包相比,这是颠倒的,但与pyglet中的默认OpenGL投影一致)。

../_images/mouse_coordinates.png

鼠标指针的坐标空间。

最基本的鼠标事件是 on_mouse_motion() 它在每次鼠标移动时被调度::

def on_mouse_motion(x, y, dx, dy):
    pass

这个 xy 参数提供鼠标指针相对于窗口左下角的坐标。

每当操作系统记录鼠标移动时,都会调度该事件。这不一定是每移动一个像素一次--操作系统通常以固定的频率对鼠标进行采样,并且很容易以比这更快的速度移动鼠标。相反,如果您的应用程序处理事件的速度不够快,您可能会发现多个排队的鼠标事件在一个 dispatch_events() 打电话。没有必要为这两个问题担心;后者很少会引起问题,前者是无法避免的。

许多游戏并不关心鼠标光标的实际位置,只需要知道鼠标移动的方向。例如,第一人称游戏中的鼠标通常控制玩家看的方向,但不显示鼠标指针本身。

这个 dxdy 参数用于此目的:它们给出鼠标沿每个轴移动到其当前位置的距离。这可以通过存储以前的 xy 参数,但除了编码繁琐外,它不考虑其他遮挡窗口的影响。最好使用 dxdy 参数而不是。

当按下或松开鼠标按钮,或在按住任何按钮的同时移动鼠标时,窗口将调度以下事件:

def on_mouse_press(x, y, button, modifiers):
    pass

def on_mouse_release(x, y, button, modifiers):
    pass

def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
    pass

这个 xydxdy 参数与 on_mouse_motion() 事件。新闻发布活动不需要 dxdy 参数,因为在本例中它们将为零。这个 modifiers 参数与键盘事件相同,请参见 键盘输入

这个 button 参数表示按下了哪个鼠标按钮,它是以下常量之一:

pyglet.window.mouse.LEFT
pyglet.window.mouse.MIDDLE
pyglet.window.mouse.RIGHT

这个 buttons 中的参数 on_mouse_drag() 是当前按住的所有鼠标按钮的按位组合。例如,要测试用户是否正在使用左键执行拖动手势::

from pyglet.window import mouse

def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
    if buttons & mouse.LEFT:
        pass

当用户开始拖动操作(即,按住鼠标按钮,然后移动鼠标)时,他们开始拖动的窗口将继续接收 on_mouse_drag() 只要按住按钮,就会发生。即使鼠标离开窗口,也是如此。您通常不需要特别处理这一点:所有操作系统之间的惯例是,拖动是一种手势,而不是对用户界面小部件的直接操作。

存在鼠标进入或离开窗口时的事件::

def on_mouse_enter(x, y):
    pass

def on_mouse_leave(x, y):
    pass

的坐标 on_mouse_leave() 会躺在你的窗外。在执行拖动操作时,不会调度这些事件。

鼠标滚轮生成 on_mouse_scroll() 活动::

def on_mouse_scroll(x, y, scroll_x, scroll_y):
    pass

这个 scroll_y 参数提供轮子移动的“点击”次数,正数表示轮子被向前推。这个 scroll_x 参数对于大多数鼠标来说是0,但是一些新鼠标(如Apple Might Mouse)使用球而不是滚轮; scroll_x 参数给出了在这种情况下的水平移动。这些数字的范围是未知的;它通常由用户在其操作系统首选项中设置。

更改鼠标光标

鼠标光标可以设置为操作系统光标之一、自定义图像或完全隐藏。对光标的更改将仅适用于您对其进行更改的窗口。若要隐藏鼠标光标,请调用 set_mouse_visible() **

win = pyglet.window.Window()
win.set_mouse_visible(False)

如果鼠标会模糊用户正在键入的文本,这会很有用。如果要隐藏鼠标光标以便在游戏环境中使用,请考虑将鼠标设置为独占;请参见 鼠标独占性 ,见下文。

使用 set_mouse_cursor() 若要更改鼠标光标的外观,请执行以下操作。鼠标光标是 MouseCursor 。您可以使用以下命令获取操作系统定义的游标 get_system_mouse_cursor() **

cursor = win.get_system_mouse_cursor(win.CURSOR_HELP)
win.set_mouse_cursor(cursor)

下面列出了pyglet定义的游标,以及它们在Windows和Mac OS X上的典型外观。Linux上的指针图像依赖于窗口管理器。

常量

WindowsXP

Mac OS X

CURSOR_DEFAULT

../_images/cursor_win_default.png ../_images/cursor_mac_default.png

CURSOR_CROSSHAIR

../_images/cursor_win_crosshair.png ../_images/cursor_mac_crosshair.png

CURSOR_HAND

../_images/cursor_win_hand.png ../_images/cursor_mac_hand.png

CURSOR_HELP

../_images/cursor_win_help.png ../_images/cursor_mac_default.png

CURSOR_NO

../_images/cursor_win_no.png ../_images/cursor_mac_no.png

CURSOR_SIZE

../_images/cursor_win_size.png ../_images/cursor_mac_default.png

CURSOR_SIZE_DOWN

../_images/cursor_win_size_up_down.png ../_images/cursor_mac_size_down.png

CURSOR_SIZE_DOWN_LEFT

../_images/cursor_win_size_nesw.png ../_images/cursor_mac_default.png

CURSOR_SIZE_DOWN_RIGHT

../_images/cursor_win_size_nwse.png ../_images/cursor_mac_default.png

CURSOR_SIZE_LEFT

../_images/cursor_win_size_left_right.png ../_images/cursor_mac_size_left.png

CURSOR_SIZE_LEFT_RIGHT

../_images/cursor_win_size_left_right.png ../_images/cursor_mac_size_left_right.png

CURSOR_SIZE_RIGHT

../_images/cursor_win_size_left_right.png ../_images/cursor_mac_size_right.png

CURSOR_SIZE_UP

../_images/cursor_win_size_up_down.png ../_images/cursor_mac_size_up.png

CURSOR_SIZE_UP_DOWN

../_images/cursor_win_size_up_down.png ../_images/cursor_mac_size_up_down.png

CURSOR_SIZE_UP_LEFT

../_images/cursor_win_size_nwse.png ../_images/cursor_mac_default.png

CURSOR_SIZE_UP_RIGHT

../_images/cursor_win_size_nesw.png ../_images/cursor_mac_default.png

CURSOR_TEXT

../_images/cursor_win_text.png ../_images/cursor_mac_text.png

CURSOR_WAIT

../_images/cursor_win_wait.png ../_images/cursor_mac_wait.png

CURSOR_WAIT_ARROW

../_images/cursor_win_wait_arrow.png ../_images/cursor_mac_default.png

或者,您也可以使用您自己的图像作为鼠标光标。使用 pyglet.image.load() 加载图像,然后创建 ImageMouseCursor 以及光标的图像和“热点”。热点是图像中与屏幕上实际指针位置相对应的点,例如,箭头的点:

image = pyglet.image.load('cursor.png')
cursor = pyglet.window.ImageMouseCursor(image, 16, 8)
win.set_mouse_cursor(cursor)

您甚至可以使用OpenGL直接渲染鼠标光标。例如,您可以绘制一个三维光标或粒子轨迹。要做到这一点,子类 MouseCursor 并实现您自己的绘制方法。即使您在应用程序的其余部分中使用其他投影,也将使用默认的pyglet窗口投影来调用DRAW方法。

鼠标独占性

可以完全控制您自己的应用程序的鼠标,防止它被用来激活其他应用程序。这对于第一人称射击等身临其境的游戏最有用。

启用鼠标独占模式后,鼠标光标将不再可用。它不仅仅是隐藏的--再多的鼠标移动都不会使它离开您的应用程序。因为不再有鼠标光标,所以 xy 鼠标事件的参数是没有意义的;您应该只使用 dxdy 参数来确定鼠标的移动方式。

使用以下命令激活鼠标独占模式 set_exclusive_mouse() **

win = pyglet.window.Window()
win.set_exclusive_mouse(True)

即使你的窗口是全屏的,你也应该激活鼠标独占模式:这将防止窗口“击中”屏幕的边缘,并在多显示器设置中正常运行(商业全屏游戏的一个常见问题是鼠标只是隐藏的,这意味着它可能意外地移动到应用程序仍然可见的另一台显示器上)。

请注意,在Linux上设置独占鼠标还会禁用Alt+Tab和其他用于切换应用程序的热键。目前还没有发现解决此问题的方法。