python 3d图表_Python绘制六种可视化图表详解,三维图最炫酷!

之前“IoT前哨站”上发了一些用Python开发文本游戏的文章。不管对于Python爱好者还是对于游戏爱好者来说,都非常适合打基础。

这次我们迈入图形时代,来看看国外开发者 Rik Cross 制作的一款迷你跑步游戏。

私信小编01 获取数十套PDF 以及此项目源码!

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

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

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

安装:

pip install pgzero

需求:

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

代码下载地址:

素材(地址同上):

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的值)。这样可以确定玩家的速度变化。

ACCELERATION = 0.005

DECELERATION = 0.0008

这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。

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

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

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

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

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

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

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

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

SCALE = 75

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

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

附注:如果要试玩这个游戏,记得在 Python 文件前面加 pgzrun 命令。

你可能感兴趣的:(python,3d图表)