今天我们来看看国外开发者“Rik Cross”制作的一款迷你跑步游戏。

他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的?

在此之前,先向大家介绍一个游戏框架:pgzero。

该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装:
pip install pgzero

需求:
通过键盘的左右键操作,让运动员向前奔跑,每过25米有路标提醒,最后看谁在百米跑步中耗时最少。

代码下载地址:
https://github.com/IoToutpost/Python_game/tree/master/Sprint

素材(地址同上):
Images文件夹中有21张图,包括运动员的动作分解、跑道等。

其中的关键代码,是一个叫做Sprinter()的类。

class Sprinter(Actor):def init(self, **kwargs):super().init(image='idle', pos=(200,220), **kwargs)self.startTime = time()self.finishTime = time()self.runFrames = ['run' + str(i) for i in range(1,16)]self.timeOnCurrentFrame = 0self.speed = 0self.lastPressed = Noneself.keyPressed = Falseself.distance = 0# 将运动员推进到下一帧def nextFrame(self):# 如果当前空闲,则启动正在运行的动画。 if self.image == 'idle':self.image = self.runFrames[0]else:# 在列表中找到下一个图像,然后返回到第一个图像 # 当列表已经到末尾的时候nextImageIndex = (self.runFrames.index(self.image) + 1) % len(self.runFrames)self.image = self.runFrames[nextImageIndex]#  检查左右方向键是否正确被交替按下def isNextKeyPressed(self):if keyboard.left and self.lastPressed is not 'left' and not keyboard.right:self.lastPressed = 'left'return Trueif keyboard.right and self.lastPressed is not 'right' and not keyboard.left:self.lastPressed = 'right'return Truereturn Falsedef update(self):# 更新运动员的速度# 交替按键加速if self.isNextKeyPressed() and self.distance < 100:self.speed = min(self.speed + ACCELERATION, 0.15)# 如果没有按键,减速else:self.speed = max(0, self.speed-DECELERATION)# 根据运动员的速度更新距离 self.distance += self.speed# 根据运动员的速度对其进行动画self.timeOnCurrentFrame += 1if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):self.timeOnCurrentFrame = 0self.nextFrame()#如果不移动,则设置为空闲if self.speed <= 0:self.image = 'idle'

里面有一些变量用来跟踪运动员的速度和距离,以及全局的常量(ACCELERATION和DECELERATION的值)。这样可以确定玩家的速度变化。这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。

玩家通过交替按左右键来增加运动员的速度。这个输入由Sprinter类中的isNextKeyPressed()方法处理,如果按下正确的键,该方法将返回True。

lastPressed变量用于确保左右键被交替按压。如果未按下任何键,玩家会减速,并且该减速程度应小于加速度,以免让玩家突然停下。

在游戏设计中,作者用了http://gameart2d.com上一个名为“The Boy”的免费形象来作为运动员,里面有15张跑步动作分解图构成的循环。他将从空闲状态开始,只要速度大于0,就切换到跑步动作循环。

这是通过index()在runFrames列表中查找当前运动员图像的名称来实现的,程序会将当前图像设置为列表中的下一个图像(并且在到达列表的末尾时返回第一个图像)。

我们还需要让运动员在跑步动作循环中以成比例的速度向前移动,通过跟踪当前图像显示的帧数来实现(在那个名为timeOnCurrentFrame的变量中)。

为了给玩家一种移动的错觉,作者添加了一些经过玩家的物品:一条终点线和三个显示跑动距离的标记。

这些物品出现的时机是根据运动员在屏幕上的x位置和运动距离计算出来的。

​然而,这意味着每个物品距离玩家最多只有100像素的距离,似乎移动的有点缓慢。我们可以通过SCALE因子来解决,它对应的是运动员跑过的米数和屏幕上像素之间的关系。比如设成1:75。

这些物品最初被绘制在屏幕看不见的右侧,然后向左移动并更快地经过运动员。

最后,startTime和finishTime变量用于计算比赛时间。这两个值最初都设置为比赛开始的时间,只要跑动的距离小于100,finishTime就会更新。使用time模块,比赛时间可以简单地计算为finishTime – startTime。

附注:该游戏在树莓派和Windows PC上都能跑,如果要试玩,记得在Python文件前面加pgzrun命令。

安装:
pip install pgzero


PS:若要全面系统学习Pygame Zero可以参考《趣学Python游戏编程》一书,该书通过十个经典游戏案例,深入浅出地介绍了游戏编程的基本原理,以及Pygame Zero的具体使用方法。相信学完这本书后你也能开发出如此精彩的小游戏。

教你用Python开发的一款迷你跑步游戏相关推荐

  1. Python开发游戏超简单 迷你跑步游戏

    前言 (文末送读者福利) 01.迷你跑步游戏 他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的呢? 在此之前,先向大家介绍一个游戏框架: pgzero. 该框架全名Pygame Zer ...

  2. 十大python开发软件-7款公认比较出色的Python IDE,你值得拥有!

    Python作为一款比较"简洁"的编程语言,它拥有很多性价比高的性能,造就了它现在比较火热的局面,很多人都来学习Python.Python 的学习过程少不了 IDE 或者代码编辑器 ...

  3. python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐

    手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和bgm都是同款的哦~ 效果图 基本配置 wi ...

  4. python能做什么游戏-你也可以用Python开发出一款火遍全球的游戏!

    还记得这款火遍全球的像素小鸟游戏吗? 没有精细的动画,极简的游戏机制.却成为苹果商店下载量最多的免费 app,并为游戏制作人带来了数百万美元的收益. 当姜文说"站着把钱挣了"的时候 ...

  5. 利用Python开发手机同款游戏:开心消消乐

    手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用Python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和BGM都是同款的哦~ 效果图 基本配置 Wi ...

  6. 12 岁的孩子教你使用 Python 开发游戏

    这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员.你可以在Google+和Twitter上找到他. 你可曾想过如何创建视频游戏吗?它不像你想象的那么复杂! 在 ...

  7. 手把手教你用Python做个可视化的“剪刀石头布”小游戏

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 众里寻他千百度.蓦然回首,那人却在 ...

  8. Python开发过哪些知名网站和游戏?

    我们都知道,Python不仅在数据分析.人工智能方面有着广泛的应用,在网站开发.游戏开发方面更是一枝独秀. 今天达妹就带大家盘点一下,哪些知名的大型公司和网站在用Python开发,以及用Python开 ...

  9. 广州python开发工程师招聘_【广州游戏开发工程师招聘_最新广州游戏开发工程师招聘信息】-前程无忧...

    诚伯信息有限公司广州-天河区0.6-1.5万/月12-18 学历要求:本科|工作经验:1年|公司性质:民营公司|公司规模:5000-10000人 岗位职责1.与一流的开发团队协同工作,分析游戏各种玩法 ...

最新文章

  1. CSS父级子级学习总结
  2. cancase lin管脚_汽车里有什么信号是传送到总线(CAN/LIN)上?
  3. CPU并行与GPU并行联系及区别
  4. java8 list切片_java中怎么从一个数组中截取一定长度的元素放到新数组中
  5. AT4502-[AGC029C]Lexicographic constraints【二分,栈】
  6. Promise.all 处理error
  7. mysql数据库的安全机制管理_mysql管理之安全机制
  8. 看不懂旷视升级,是因为不知道中国AI正在经历的变革
  9. 12.1 LNMP架构介绍 12.2 MySQL安装 12.3/12.4 PHP安装 12.5 Ng
  10. iconfont-矢量图标字体的运用
  11. 电影院售票系统,电影院订票系统,电影院购票管理系统计算机毕业设计
  12. AXURE RP EXTENSION FOR CHROME:AXURE RP铬延展剂--谷歌工具插件使用配置(打开并成功预览本地.html文件)
  13. 强化学习平台安装 Mujoco、mujoco-py、gym、baseline
  14. GitHub上的那些LGTM和WIP代表什么
  15. 54、消防控制室的设置要求
  16. unity3D原生声音系统
  17. JS异步:执行原理与回调
  18. USB Type-C简介
  19. 斐讯k3搭建nginx+php+MariaDB(mysql )的教程
  20. 文字转语音:CyberBukit TTS for php 1.2.3

热门文章

  1. C++设计原则——开闭原则(持续更新中)
  2. 会声会影视频剪辑详细教程
  3. 亲身实践已解决:Mysql Row size too large ( 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT
  4. mac程序进程无法退出,强制退出后有重启了,怎么彻底解决?
  5. jQuery下的ajax之省市区三级联动
  6. mongodb count查询记录条数
  7. 求生之路服务器参数配置
  8. GPGPU基础(二):GPGPU需要用到的OpenGL概念
  9. java 日期calendar_java成神之——date和calendar日期的用法
  10. 极客时间 算法训练营 第一周总结