pygame游戏对象类

本文介绍了在pygame中利用类来创建游戏对象,如球类,包含初始化、更新等功能,便于管理和操作游戏元素。通过继承pygame的Sprite类,实现精灵对象,利用向量物理进行动态计算,并探讨了三角函数在计算运动方向和速度中的应用。
摘要由CSDN通过智能技术生成

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

#!/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轴上的运动。
这是一个简单的三角学问题,可以用图中所示的公式来完成。
如果你以前学过初等三角函数,这些对你来说都不是什么新鲜事。
但如果你忘记了,这里有一些有用的公式可以帮助你形象化角度(我发现形象化角度比形象化弧度更容易!)
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值