一旦你加载了你的模块,并编写了你的资源处理函数,你就会想要开始编写一些游戏对象。这种方法相当简单,尽管一开始看起来很复杂。你为游戏中的每种类型的对象编写一个类,然后为这些对象创建这些类的实例。然后可以使用这些类的方法来操作对象,为对象提供一些运动和交互功能。所以在伪代码中,你的游戏将会是这样的:
#!/usr/bin/python
# (在这里加载模块)
# [这里的资源处理功能]
class Ball:
# [这里的球函数(方法)]
# 例如,计算新位置的函数]
# [和一个检查它是否击中侧面的函数]
def main:
# [在这里启动游戏环境]
# [创建新对象作为球类的实例]
ball = Ball()
while 1:
# [检查用户输入]
# [调用球的更新函数]
ball.update()
当然,这是一个非常简单的示例,您需要放入所有代码,而不是那些小括号中的注释。但你应该知道基本的概念。你创建了一个类,你将一个球的所有函数放入其中,包括__init__,它将创建球的所有属性,并更新,它将把球移动到它的新位置,然后将球以这个位置在屏幕上显示。
然后,你可以为所有其他游戏对象创建更多的类,然后创建它们的实例,这样你就可以在main函数和主程序循环中轻松地处理它们。
与此相比,在main函数中初始化球,然后使用许多无类函数来操作set ball对象,您将希望看到为什么使用类是一个优势:它允许您将每个对象的所有代码放在一个地方;
它使使用对象更容易;
它使得添加新对象和操作它们更加灵活。
您可以简单地为每个新球对象创建ball类的新实例,而不是为每个新球对象添加更多代码。
魔法!
一个简单的球类
下面是一个简单的类,其中包含了创建一个球对象所需的函数,如果在主循环中调用了更新函数,这个球对象将在屏幕上移动:
class Ball(pygame.sprite.Sprite):
"""在屏幕上移动的球
返回:球对象
功能:更新calcnewpos
属性:面积、向量"""
def __init__(self, vector):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_png('ball.png')
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.vector = vector
def update(self):
newpos = self.calcnewpos(self.rect,self.vector)
self.rect = newpos
def calcnewpos(self,rect,vector):
(angle,z) = vector
(dx,dy) = (z*math.cos(angle),z*math.sin(angle))
return rect.move(dx,dy)
这里我们有球类,__init__球函数集,更新函数,改变了球的矩形在新的位置,和calcnewpos函数计算出球的新位置根据其当前位置,移动和向量。
稍后我会解释其中的物理原理。
另一件需要注意的事情是文档字符串,这一次稍微长了一点,它解释了类的基础知识。
这些字符串不仅对您自己和查看代码的其他程序员很方便,而且对解析代码和记录代码的工具也很方便。
它们在小程序中不会有太大的区别,但对于大型程序,它们是无价的,所以养成这样的习惯是一个好习惯。
转移1:精灵
为每个对象创建类的另一个原因是精灵。
你在游戏中渲染的每个图像都将是一个精灵对象,所以一开始,每个对象的类都应该继承精灵类。
这是Python类继承的一个非常好的特性。
现在Ball类拥有Sprite类的所有功能,并且任何Ball类的对象实例都将被Pygame注册为Sprite。
而对于不移动的文本和背景,可以将对象移到背景上,Pygame以不同的方式处理精灵对象,当我们查看整个程序代码时你将看到这一点。
基本上,你创建了一个球对象和一个精灵对象,然后你在精灵对象上调用球的更新函数,从而更新精灵。
精灵还提供给你判断两个物体是否发生碰撞的复杂方法。
通常情况下,你可能只是检查主循环,看看它们的矩形是否重叠,但这将涉及许多代码,这将是一种浪费,因为Sprite类提供了两个函数(spritecollide和groupcollide)来为你做这件事。
转移2:矢量物理
除了Ball类的结构之外,这个代码值得注意的是用于计算球的运动的矢量物理。
对于任何涉及角度运动的游戏,除非你熟悉三角函数,否则你不会走得太远,所以我将介绍你需要知道的基本知识,以理解calcnewpos函数。
首先,你会注意到球有一个属性向量,它由角度和z组成。这个角度是用弧度测量的,它会告诉你球运动的方向。
Z是球运动的速度。
通过使用这个向量,我们可以确定球的方向和速度,因此它会在x和y轴上移动多少
上面的图表说明了向量背后的基本数学。
在左手的图表中,你可以看到蓝色的线代表的球的投影运动。
这条线的长度(z)表示它的速度,角度是它移动的方向。
球的运动角度总是从右边的x轴开始,从这条线顺时针测量,如图所示。
从球的角度和速度,我们可以算出它在x轴和y轴上移动了多少。
我们需要这样做是因为Pygame本身不支持向量,我们只能通过沿着两个轴移动它的矩形来移动球。
所以我们需要把角度和速度分解成它在x轴上的运动和在y轴上的运动。
这是一个简单的三角学问题,可以用图中所示的公式来完成。
如果你以前学过初等三角函数,这些对你来说都不是什么新鲜事。
但如果你忘记了,这里有一些有用的公式可以帮助你形象化角度(我发现形象化角度比形象化弧度更容易!)