【发布时间】:2017-02-01 17:50:55
【问题描述】:
导入火箭精灵(例如)并将其设置为图像与导入火箭精灵并将其设置为 pygame 中的精灵有什么区别?
【问题讨论】:
标签: python python-3.x pygame sprite
导入火箭精灵(例如)并将其设置为图像与导入火箭精灵并将其设置为 pygame 中的精灵有什么区别?
【问题讨论】:
标签: python python-3.x pygame sprite
我认为您只是对术语感到困惑:
图像只是像素的集合。您正在使用“sprite”来引用磁盘上的图像,但这只是一个图像文件。要使用您的火箭示例,您可以像这样加载图像:
rocket_img = pygame.image.load('rocket.png').convert_alpha()
然后你可以在任何你想要的地方绘制这个图像:
screen.blit(rocket_img, (x, y))
Pygame 中的精灵是一个对象,具有一整套内置功能。 Sprites 具有图像作为它们的属性之一,但还有更多。另外,您可以将精灵分组在一起,以使它们更容易更新或绘制。精灵具有内置的碰撞功能。您可以添加自己的属性来跟踪位置、速度、动画等。
一个简单的精灵:
class Rocket(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('rocket.png').convert_alpha()
self.rect = self.image.get_rect()
def update(self):
self.rect.x += 1
这将是一个火箭精灵,您可以使用它来实例化
rocket = Rocket()
你可以使用绘制
screen.blit(rocket.image, rocket.rect)
它会慢慢向右移动(如果你在游戏循环中调用 update():
rocket.update()
我建议查看 Sprite 文档 - 您可以对组进行更多操作,以便轻松处理大量 sprite。
【讨论】:
convert_alpha() 必须做什么?你确定它的使用目的吗?
convert_alpha() 应在您拥有具有像素透明度的图像时使用。如果您使用convert(),则会失去透明度。有关详细信息,请参阅文档:pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha
在 Pygame 中,“图像”通常仅指图像文件:将它们导入和导出到磁盘。 “Surface”对象是一个保存像素的 Python 对象,可用于标记其他表面、进行变换(缩放/旋转)、生成其他表面等等。
主屏幕本身是一个 Surface 子类 - 因此,当您使用从磁盘映像读取的数据标记 Surface 时,使用 blit 方法图像会显示在屏幕上。
另一方面,Sprite 是游戏中对象的基类,它们甚至不依赖于附加的像素数据。一些 Pygame API 期望 Sprite 对象具有 rect 属性,该属性表示它将在 Surface 上渲染的位置 - 和 image 属性。如果要使用它,sprite.image 属性应该包含一个表面对象 - 通常从磁盘读取(但可以以编程方式绘制)。
使用精灵图像属性的主要调用是Group.draw()方法。
但是可以创建一个与交互式游戏完全不同的游戏 - 一个 MMO 游戏的服务器端,屏幕上没有任何内容,例如,使用 Sprite 和 Group 类,而无需使用精灵上的image 属性。
值得一读: https://www.pygame.org/docs/ref/sprite.html
相反,您可以绕过 Sprites 和 Groups 提供的所有辅助逻辑,并创建一个只有 Surface 对象的游戏 - 表示从磁盘读取的图像。您负责跟踪它们的时间和绘制时间,而不使用精灵组中的 elpe 方法。
【讨论】: