“.subsurface()”、“.convert_alpha()”和“%”是做什么的?

What do ".subsurface()", ".convert_alpha()", and "%" do?

我正在努力学习 Pygame,我正在学习的教程中有一个部分解释了如何制作精灵动画。它给了我一个 sprite sheet,其中有 8 个图像,每个图像尺寸为 128x128,而整个 sheet 尺寸为 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() 

教程对这些行的作用非常模糊,所以我想知道:

  1. sheet.subsurface() 是做什么的?这四个参数代表什么? (我相信第三和第四是指个别图像的宽度和高度。)
  2. .convert_alpha() 是做什么的?教程说它 "preserves transparency," 但我觉得很奇怪,因为我之前已经使用过透明背景的图像并且 none 需要这种转换的图像。
  3. % 是做什么的?我已经知道 / 代表除法,但是教程没有解释 %.

让我们谈谈 subsurface()。假设您有 1,600 张图像要加载到程序中。有两种方法可以做到这一点。 (好吧,不止两个,但我在这里强调一下。)首先,您可以创建 1,600 个文件,依次将每个文件加载到表面中,然后启动程序。或者,您可以将它们放在一个文件中,将该文件加载到单个表面中,然后使用 subsurface()。在本例中,spritesheet.gif 为 128 像素高,并且每 128 像素包含一个新图像。

这两种方式基本上做同样的事情,但一种可能比另一种更方便。特别是,打开和读取文件的性能成本很小,如果您需要连续执行此操作 1,600 次,那么该成本可能会很大。

我对子表面的理解是,它基本上是一个 Pygame 表面,但根据父表面定义;如果您更改了父表面,则任何子表面都将以相同的方式更改。但是,在所有其他方面,它都可以视为规则表面。

subsurface 为您提供一个表示较大曲面的矩形截面的曲面。在这种情况下,您有一个大表面,上面有很多精灵,而次表面用于从该表面提取碎片。您也可以创建新表面并使用 blit 复制像素,但使用次表面更容易一些,并且不需要复制像素数据。

https://www.pygame.org/docs/ref/surface.html#pygame.Surface.subsurface

建议搜索:pygame subsurface

convertconvert_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 的 "modulo/remainder" 运算符。在这种情况下,它用于使 counter 变量在值 0 到 7 之间重复循环,然后再次返回到 0。

https://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations

建议搜索:python percent sign