欢迎下载体验!
文件大小:25.7 M
下载地址:链接:https://wwrr.lanzoul.com/ifOvc2fe163c
观看演示视频~
Pyqt-跑酷游戏
一.前言
天天酷跑大家都玩过吧,这是我们学生时代的回忆,目前这款游戏还在架,但是有了很大的变化,不是以前的感觉了。本次使用PyQt5开发这款跑酷游戏,带大家召回曾经的感觉~
二.预览
1.游戏准备
在经过一段loading之后,到了游戏准备界面。
在游戏准备界面会播放经典的BGM,我们点击开始游戏后选择角色。
2.角色选择
通过按下字母键的“a”或者“b”选择角色
3.游戏中
在游戏过程中,我们可以通过W键或空格键或者↑箭头键控制角色跳跃,支持二段跳
4.游戏结束
游戏结束会统计我们的表现和跑酷距离,可以在此界面重新游戏。
三.开发思路
1.游戏原理
游戏原理就是贴图
a.奔跑背景效果
其实我们的角色和奔跑过程中生成的障碍物&金币并没有往前跑,而是背景在“往后倒”,我们使用下面的代码可以很轻易的实现这一效果。
def paintEvent(self, event):
# 绘制背景
painter = QPainter(self)
painter.drawPixmap(-self.bg.dx, 0, self.bg.surface)
painter.drawPixmap(self.bg.w - self.bg.dx, 0, self.bg.surface)
b.奔跑角色效果
游戏过程中我们能观察到玩家控制的角色除了跳跃之外,一直处于奔跑状态,这是如何实现的呢?
其实我们为角色设置了多张状态图片,类似于前端的雪碧图,共计12张,能够完成主角色的奔跑状态展示,在游戏过程中我们等比例裁切出需要的图来交替展示,就能完成“角色在奔跑”的状态,障碍物同理。
所以整个游戏场景的paintEvent函数是这样的:
def paintEvent(self, event):
painter = QPainter(self)
# 绘制背景
painter.drawPixmap(-self.bg.dx, 0, self.bg.surface)
painter.drawPixmap(self.bg.w - self.bg.dx, 0, self.bg.surface)
# 绘制分数
self.score_frame.score_label.setText(str(self.score))
if self.gameState == 1:
# 游戏结束画面
self.game_timer.stop()
bus.game_bgm_status_changed.emit(0)
bus.game_progress_changed.emit(4)
else:
# 绘制角色
painter.drawPixmap(0, int(self.role.y), self.role.surface,
int(self.role.currentFrame) * int(self.role.w), 0, int(self.role.w), int(self.role.h))
# 绘制障碍物
for obj in self.objectList:
painter.drawPixmap(int(obj.x), int(obj.y), obj.surface,
int(obj.currentFrame) * int(obj.w), 0, int(obj.w), int(obj.h))
2.场景切换
本次跑酷游戏包含四个游戏场景,主界面是个堆叠组件,所有游戏场景通过addWidget的方式添加到主界面中,通过切换堆叠组件的索引实现场景的切换,这个方式已经屡试不爽了。
# 加载游戏场景
self.gamePrepareScene = GamePrepareScene(self)
self.gameLoadingScene = GameLoadingScene(self)
self.chooseRoleScene = ChooseRoleScene(self)
self.gameScene = GameScene(self)
self.gameOverScene = GameOverScene(self)
self.addWidget(self.gamePrepareScene) # 0
self.addWidget(self.gameLoadingScene) # 1
self.addWidget(self.chooseRoleScene) # 2
self.addWidget(self.gameScene) # 3
self.addWidget(self.gameOverScene) # 4
3.音频播放
为了实现原汁原味的视听游戏体验,本次将bgm和音效分离开来,bgm采用的是.ogg文件,音效时长很短采用的是.wav格式,另外播放bgm时不会因为播放音效而终止,因为音效是在子线程里跑的。
给大家看下我的本地音频文件:
4.项目结构
对游戏代码感兴趣的小伙伴可以了解一下我的项目结构,有助于理解游戏开发思路:
四.总结
本次使用PyQt开发了一款跑酷游戏,目的是和大家分享回忆那段游戏时光,更进一步理解PyQt里相关的用法,与大家分享我开发项目的思路,欢迎大家多多留言讨论!