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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

01

迷你跑步游戏

他用了不到一百行代码,就写出了值得一玩的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 = 0  
         self.speed = 0  
         self.lastPressed = None  
         self.keyPressed = False  
         self.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 True  
    if keyboard.right and self.lastPressed is not 'right' and not keyboard.left:  
        self.lastPressed = 'right'  
        return True  
    return False  
  
def 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 += 1  
    if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):  
        self.timeOnCurrentFrame = 0  
        self.nextFrame()  
    # 如果不移动,则设置为空闲  
    if self.speed <= 0:  
        self.image = 'idle'

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

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

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

在游戏设计中,作者用了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命令。

02

参考书籍

**《**趣学Python游戏编程》

ISBN:978-7-302-54977-2

何青 编著

定价:49元

编辑推荐

本书是高校教师多年开发经验的结晶之作,深入浅出地讲解使用Python语言进行游戏开发,帮助读者快速掌握游戏设计的基本原理和方法,同时提高应用Python语言的编程能力。

全书精选十个游戏案例,涵盖不同的游戏类型,每一章围绕一个经典游戏案例展开,并突出一个游戏编程的主题。本书涉及的主要知识点有游戏循环的原理、鼠标及键盘事件处理、碰撞检测及处理、随机数的运用、定时器的使用、游戏场景的滚动、角色动画的播放、音效及音乐的播放、缓动效果、游戏关卡设计、游戏人工智能的原理及运用等。本书将 Python语法知识及常用的编程技巧糅合在各个游戏案例中介绍,为读者展示Python语言的实际运用场景。

本书内容安排合理,架构清晰,注重理论与实践相结合,适合作为零基础学习 Python开发初学者的教程,也可作为本科院校及大专院校的教材,还可供职业技术学校和各类游戏培训机构使用。

点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

👉Python实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

图片

图片

👉Python书籍和视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

图片

👉Python副业创收路线👈

图片

这些资料都是非常不错的,朋友们如果有需要《Python学习路线&学习资料》,点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

本文转自网络,如有侵权,请联系删除。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值