Pygame 官方文档 - Tutorials - 游戏制作指南(Making Games Tutorial)- 游戏对象的类(Game object classes)

游戏制作指南(Making Games Tutorial)

点我回总目录

4.游戏对象的类(Game object classes)

       一旦你加载了模块,并编写了资源处理函数,你就会想要编写一些游戏对象。 这样做的方式相当简单,虽然起初看起来很复杂。 您为游戏中的每种类型的对象编写一个类,然后为这些对象创建这些类的实例。 然后,您可以使用这些类的方法来操作对象,为对象提供一些动作和交互功能。 所以你的游戏用伪代码的形式看起来像下面这样:

#!/usr/bin/python

# [在这里加载模块]

# [在这里放置资源处理函数]

class Ball:
    # [把球的函数(方法)放在这]
    # [e.g. 一个计算新位置的函数]
    # [和一个检查它碰撞边界的函数]

def main:
    # [在这初始化游戏环境]

    # [创建新对象作为球类的实例]
    ball = Ball()

    while 1:
        # [检查用户输入]

        # [调用球的update函数]
        ball.update()

       当然,这是一个非常简单的示例,您需要输入所有代码,而不是那些带有小括号的注释。但你应该得到基本的想法。你创建了一个类,你可以在其中放置一个球的所有函数,包括__init__,这将创建所有球的属性,而更新,这会将球移动到新的位置,然后在这个位置把球blit到屏幕上。
       然后,您可以为所有其他游戏对象创建更多类,然后创建它们的实例,以便您可以在主函数和主程序循环中轻松处理它们。将这个方式与在主函数中创建球,然后使用许多无类函数来操作设置球对象进行对比,您将希望看到为什么使用类是一个优点:它允许您为每个对象的所有代码放置在一个地方;它使得使用对象更容易;它使添加新对象和操作它们更加灵活。您可以简单地为每个新的球对象创建Ball类的新实例,而不是为每个新的球对象添加更多代码。神奇!

4.1.一个简单的球类(A simple ball class)

       这是一个简单的类,其中包含创建球对象所需的函数,如果在主循环中调用update(更新)函数,则会在屏幕上移动:

class Ball(pygame.sprite.Sprite):
    """一个将在屏幕上移动的球
    Returns: ball对象
    Functions: update, calcnewpos
    Attributes: area, vector"""

    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)

       这里我们有Ball类,有一个设置球的__init__函数,一个将球的矩形更改为新位置的update函数,以及一个根据当前位置计算球的新位置的calcnewpos函数,以及它正在移动的vector(矢量)。 我马上解释一下物理学。 另外需要注意的是文档字符串,这次稍微长一点,并解释了类的基础知识。 这些字符串不仅对您自己和查看代码的其他程序员很方便,而且对于解析代码和记录代码的工具也很方便。 他们不会在小程序中产生太大的影响,但是对于大型程序来说它们是非常宝贵的,所以这是一个很好的习惯。

4.1.1.部分1:精灵(Diversion 1: Sprites)

       为每个对象创建类的另一个原因是sprite。您在游戏中渲染的每个图像都将是一个精灵对象,因此首先,每个对象的类应该继承Sprite类。这是Python的一个非常好的特性 —— 类继承(class inheritance)。现在Ball类具有Sprite类附带的所有函数,而Ball类的任何对象实例都将被Pygame登记为sprite。然而,对于不移动的文本和背景,可以将对象blit到背景上,Pygame以不同的方式处理sprite对象,当我们查看整个程序的代码时,您将看到它们。
       基本上,你创建一个球对象和该球的精灵对象,然后你在精灵对象上调用球的更新函数,从而更新精灵。精灵还为您提供了确定两个物体是否发生碰撞的复杂方法。通常你可能只是检查主循环以查看它们的矩形是否重叠,但这将涉及大量代码,这将是一种浪费,因为Sprite类提供了两个函数(spritecollide和groupcollide)来为你做这件事。

4.1.2.部分2:矢量物理(Diversion 2: Vector physics)

       除了Ball类的结构之外,关于这个代码的值得注意的是矢量物理,用于计算球的运动。 任何涉及角度运动的游戏,除非你对三角函数感到舒适,否则你不会进行的太深入,所以我将介绍你需要知道的基础知识来理解calcnewpos函数。
       首先,你会注意到球有一个属性vector,它由angle和z组成。 angle以弧度为单位测量,并为您提供球的移动方向。 Z是球移动的速度。 因此,通过使用此向量,我们可以确定球的方向和速度,从而确定它在x和y轴上的移动量:

       上图说明了向量背后的基本数学。在左侧图中,您可以看到球的投影运动由蓝线表示。该线的长度(z)表示其速度,角度是其移动的方向。球的运动角度将始终取自右侧的x轴,并从该线顺时针测量,如图所示。
       从球的角度和速度,我们可以计算出它沿x和y轴移动了多少。我们需要这样做,因为Pygame本身不支持矢量,我们只能通过沿两个轴移动矩形来移动球。所以我们需要将角度和速度分解为x轴(dx)和y轴(dy)的运动。这是一个简单的三角函数问题,可以使用图中所示的公式来完成。
       如果您之前学过基本三角学,那么这一切都不应该对你新奇。但是,如果你是健忘的,这里有一些有用的公式要记住,这将帮助你想象角度(我发现更容易想象的是角度制而不是弧度制!)

 
上一篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 正式开干(Kicking things off)
下一篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 用户可控制的对象(User-controllable objects)
以上内容,自己翻译,可能有误,可参考:Tutorials - 游戏制作指南(Making Games Tutorial)- 游戏对象的类(Game object classes)

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/88906843