首页 » 父与子的编程之旅:与小卡特一起学Python » 父与子的编程之旅:与小卡特一起学Python全文在线阅读

《父与子的编程之旅:与小卡特一起学Python》18.3 鼠标事件

关灯直达底部

我们刚才看到了如何从键盘得到按键事件,以及如何使用这些事件来控制程序中的某些方面。前面使用箭头键让沙滩球向上和向下移动。现在打算使用鼠标来控制球。从中你会了解到如何处理鼠标事件以及如何使用鼠标位置信息。

最常用的 3 类鼠标事件如下:

  • MOUSEBUTTONUP

  • MOUSEBUTTONDOWN

  • MOUSEMOTION

最简单的事情是:只要鼠标在 Pygame 窗口中移动,就让沙滩球随着鼠标位置移动。要移动沙滩球,我们将使用球的 rect.center 属性。这样一来,球的中心就会跟着鼠标移动。

我们要把 while 循环中检测按键事件的代码替换为检测鼠标事件。

这比检测键盘事件还要简单。对代码清单 18-2 完成以上修改,并试着运行这个程序。event.pos 部分是鼠标的位置(x 和 y 坐标)。只需要把球的中心移动到这个位置。注意,只要鼠标在移动,球就跟着移动。也就是说,只要 MOUSEMOVE 事件正在发生,球就会随着移动。改变球的 rect.center 会同时改变 x 和 y 位置。我们不再只是让球向上或向下移动,而是会上下左右同时移动。如果没有鼠标事件(可能因为鼠标没有移动,或者鼠标光标落在 Pygame 窗口之外),球就会继续在左右两边反弹。

现在试着只是在鼠标按钮保持按下时才让鼠标控制起作用。鼠标按钮保持按下时移动鼠标称为拖动(dragging)。并没有一种 MOUSEDRAG 事件类型,所以需要使用现有的事件类型来得到我们希望的效果。

如何区分是否在拖动鼠标呢?拖动意味着鼠标移动时鼠标按钮一直保持按下。我们可以利用 MOUSEBUTTONDOWN 事件得到鼠标按钮何时按下,另外利用 MOUSEBUTTONUP 事件可以得到按钮何时松开(还原,不再按下)。因此只需跟踪按钮的状态,可以通过建立一个变量来做到,我们将这个变量命名为 held_down。具体做法如下:

拖动条件(鼠标移动时鼠标按钮保持按下)在以上代码的最后一个 elif 块中检测。前面已经修改过代码清单 18-2,在这个修改后的代码中,对 while 循环完成上述修改。运行这个程序,看看它的效果。

嘿,要知道我们从第 1 章就已经开始编程了!不过,因为现在开始使用图形、动画精灵和鼠标,所以变得更有意思了。前面说过会谈到这些内容。不过你要跟上我的思路,先来学习一些基础知识。