#这是 Classic 经典版 使用了来自网络的素材(图片、音频)
运用课上所学知识与pygame库实现一个飞机
有GUI用户界面设计
从键盘输入键值时不影响程序进程
能正确判定各类事件并及时响应
具备一定趣味与可玩性
学习了python相关基础语法与面向对象编程等知识后,我们认为可以尝试利用所学知识结合pygame模块开发一些简单的小游戏。我们首先直接结合pygame的内置简单绘图方法设计了一款打砖块游戏,熟悉了其用法后,我们设想在打砖块游戏基础上进行改进,以设计一个飞机大战游戏。具体来说,我们把具体对象(例如飞机,石块,子弹等)分别封装成类(都从pygame中的sprite类继承)以使各自的方法用起来更方便,调高了FPS,改变了碰撞逻辑,把原先的直接绘图改为贴图,加入了bgm等等。
设计思路上,我们先写出在屏幕上绘制各个元素的显示函数(实质上是对pygame内置绘图方法的封装),再写出飞机,石块和子弹等的类(根据sprite),并定义各自的一些方法,例如飞机的发射与共有的绘图更新等等,之后载入所有外部资源(贴图,bgm)并加载到窗口中;最后我们主循环中依次检查所有的碰撞事件、作出响应,并判断游戏是否结束即可。
最终,我们完成了一款飞行射击游戏。玩家操作飞机在窗口底端左右移动,并可从下向上发射子弹,窗口顶端随机刷新射向下方不同方向的速度、大小均不同的石块;玩家子弹击中石块可使其爆炸以消灭之,并有几率随机出现增强玩家火力或护盾的道具;玩家若被石块集中会根据石块的大小扣减护盾值,护盾值归零即损失一条生命,一局游戏中玩家总共有2条生命,损失殆尽时游戏结束。
效果截图
继承sprite类时我们一开始没能正确应用其分层策略与碰撞判定机制,导致游戏无法运行,后来我们上网查阅资料,学习了他人的代码后才得以解决。
游戏测试时我们发现消息循环接受的键盘操作存在明显延时,来自键盘的操作会导致其他精灵对象出现粘滞暂停。我们优化了获取键值的方法并提高了刷新率,使粘滞现象变得十分不明显。
导入资源时曾经由于文件夹有中文名无法正常读取。
导入贴图时曾由于贴图长宽太大导致不能在游戏中正常显示,后来李羿杉同学自己设计与修改了一些小比例图片成功导入游戏窗口解决问题。
文字显示位置方面,我们都是经过多次尝试测试出较合适的摆放位置,从而使界面更加美观。