我正在尝试学习Pygame,我正在学习的教程中有一节介绍如何动画sprite。它给了我一张精灵表,其中有8张图片,每张图片尺寸为128x128,而整张纸张尺寸为1024x128。
然后它显示以下代码:
#! /usr/bin/env_python
import pygame, sys
from pygame.local import *
pygame.init()
ZONE = pygame.display.set_mode((400,300))
pygame.display.set_caption("Game Zone")
RED = (255,0,0)
clock = pygame.time.Clock()
counter = 0
sprites = []
sheet = pygame.image.load("spritesheet.gif").convert_alpha()
width = sheet.get_width()
for i in range(int(width/128)):
sprites.append(sheet.subsurface(i*128,0,128,128))
while True:
pygame.display.update()
ZONE.fill(RED)
ZONE.blit(sprites[counter],(10,10))
counter = (counter + 1) % 8
clock.tick(16)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
教程对这些行的作用非常模糊,所以我想知道:
sheet.subsurface()
做什么?这四个参数代表什么? (我相信第三和第四是指个别图像的宽度和高度。).convert_alpha()
做什么?教程说它“保留了透明度”,但我发现它很奇怪,因为我之前已经使用过具有透明背景的图像,而且没有一个需要这样的转换。%
做什么?我已经知道/
代表除法,但教程从未解释过%
。答案 0 :(得分:1)
让我们谈谈地下()。假设您有1,600个图像要加载到程序中。有两种方法可以做到这一点。 (好吧,两个以上,但我在这里指出了一点。)首先,你可以创建1,600个文件,依次将每个文件加载到一个表面,然后启动程序。或者,您可以将它们放在一个文件中,将一个文件加载到单个表面中,然后使用subsurface()。在这种情况下,spritesheet.gif的高度为128像素,并且每128个像素包含一个新图像。
这两种方式基本上做同样的事情,但有一种可能比另一种更方便。特别是,打开和读取文件的性能成本很低,如果您需要连续1600次这样做,那么这个成本可能会很高。
我对儿童表面的理解是它基本上是一个Pygame表面,但是根据父表面定义;如果更改了父Surface,则会以相同的方式更改任何子表面。但是,在所有其他方面,它可以被视为常规表面。
答案 1 :(得分:0)
subsurface
为您提供表示较大曲面的矩形截面的曲面。在这种情况下,你有一个大的表面,上面有很多精灵,而地下是用来从那个表面提取碎片。您还可以创建新曲面并使用blit复制像素,但使用子表面更容易,并且不需要复制像素数据。
https://www.pygame.org/docs/ref/surface.html#pygame.Surface.subsurface
建议搜索:pygame subsurface
convert
和convert_alpha
都用于将曲面转换为屏幕使用的相同像素格式。这可以确保您在将它们连接到屏幕时因转换而不会失去性能。 convert
抛弃任何Alpha通道,而convert_alpha
保留它。您看到的评论指的是使用convert_alpha
代替convert
的选择,而不是选择使用convert_alpha
而不是任何内容。
https://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert
建议搜索:pygame convert_alpha
'%'运算符不是Pygame功能,它只是Python的“模/余”运算符。在这种情况下,它用于使counter
变量循环重复通过值0到7再返回0。
https://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations
建议搜索:python percent sign