基于pygame的打鸭子游戏如图1所示。
图1 打鸭子游戏
从图1中可以看出,玩家通过鼠标控制瞄准镜的移动,点击鼠标左键射击鸭子。而鸭子则从屏幕左边向右边游动,当游到屏幕右侧边界后,重新回到屏幕左侧继续游动。
游戏需要创建两个类,一个是瞄准镜类,另一个是鸭子类。
1 瞄准镜类Crosshair的创建
在pygame编程框架代码的基础上,创建瞄准镜类Crosshair。
1.1 __init__()函数
瞄准镜类Crosshair的__init__()函数代码,如图2所示。
图2 __init__()函数代码
其中,第5行代码表示瞄准镜类Crosshair的父类是pygame.sprite.Sprite,即瞄准镜类是“精灵类”的子类;第6行开始定义__init__()函数,该函数的参数img_path表示瞄准镜图片的文件名;第7行代码调用其父类即pygame.sprite.Sprite的__init__()函数,实现初始化操作;第8行代码通过pygame.image.load()函数导入瞄准镜图片;第9行代码获取图片的位置及大小;第10行代码通过pygame.mixer.Sound()实例化了音频类的对象gun_shot,对应的音频文件是“gunshot.wav”,当玩家点击鼠标左键进行射击时,会有射击的音效。
相关链接1 pygame.sprite.Sprite类及__init__()函数的相关资料,请参考
《Pygame中Sprite类的使用6-1》
1.2 shoot()函数
瞄准镜类Crosshair的shoot()函数代码,如图3所示。
图3 shoot()函数代码
当玩家点击了鼠标左键后,调用该函数播放射击的音频并且判断是否击中了鸭子。其中,第14行代码通过类属性gun_shot播放射击音频,gun_shot即为图2第10行中导入的音频实例;第15行代码通过pygame.sprite.spritecollide()函数判断是否击中了鸭子,也就是对瞄准镜精灵与鸭子精灵进行碰撞检测,第一个参数crosshair是瞄准镜类的实例,第二个参数是鸭子类的精灵组target_group,该函数的作用是判断crosshair与target_group精灵组中的任一精灵发生是否发生碰撞,因为击中鸭子后,鸭子会消失,第三个参数要设置为True,表示当发生碰撞时,删除target_group精灵组中被碰撞的精灵。
相关链接2 精灵组的相关资料,请参考
《Pygame中Sprite类的使用6-3》
1.3 update()函数
瞄准镜类Crosshair的update()函数代码,如图4所示。
图4 update()函数代码
该函数的作用是当玩家移动鼠标时,瞄准镜跟着鼠标一起移动,达到鼠标控制瞄准镜的目的。第16行代码中,将瞄准镜的中心位置rect.center设置为鼠标的位置,pygame.mouse.get_pos()函数的作用就是获取鼠标的位置。