3.2.1 使用鼠标右键来操作
根据之前的设想,使用鼠标右键来执行插旗子的操作。如何让游戏响应鼠标的右键单击事件呢?我们已经知道,Pgzero提供了on_mouse_down()函数来处理鼠标的单击事件。事实上,该函数不仅提供了获取坐标的参数pos,还提供了一个参数button,用来保存鼠标的按键信息。此外,Pgzero还提供了一个内置对象mouse,并在其中定义了一些常量值,用来表示不同的鼠标按键,例如mouse.LEFT表示鼠标左键,mouse.RIGHT表示鼠标右键。于是可以使用表达式“button == mouse.RIGHT”来判断玩家是否单击了鼠标右键。
另外,在执行插旗子之前,还需要知道鼠标右键单击的是哪一个方块。对于方块而言,就是要判断鼠标单击处的坐标是否位于自身范围之内,这可以通过方块角色的collidepoint()方法来实现。collidepoint()方法是Pgzero为Actor类定义的方法,该方法接受一对坐标值作为参数,用来判断该坐标是否位于角色范围之内。因此可以将鼠标单击处的坐标值传给该方法,进而判断某个方块是否被鼠标单击。
接下来定义一个遍历循环,依次对各个方块进行检查,并对符合条件的方块执行插旗子操作。具体来说,程序首先判断某个方块是否被鼠标单击,进而判断鼠标单击的是否为右键,若这两个条件都满足则给该方块插上旗子。为on_mouse_down()函数编写如下代码:
运行一下程序,试试能否执行插旗子操作?结果可能令你失望了,当你试着用鼠标右键单击某个方块时,旗子并没有出现,而是收到了编辑器的错误提示:名字set_flag没有定义。
那么set_flag(block)这一句的作用究竟是什么呢?看起来像是一个函数调用,可是我们并没有定义该函数啊。别着急,先来猜测一下它的作用。该函数的参数是block,表示是对某个方块进行操作,而从名字来看,似乎意味着插旗子的操作。没错,该函数就是用来对方块执行插旗子操作的!还记得模块化的编程方法吗?可以将程序中的特定操作定义为函数,当需要执行操作的时候直接调用函数即可。这样做使得代码结构清晰,可读性好,也可以重复利用代码。
这里正是使用了模块化的编程方法,为插旗子操作定义了一个新的函数set_flag(),并将方块角色作为参数传给该函数,以实现对某个指定方块的插旗子操作。下面看看如何实现该函数的功能。