“.subsurface()”,“。contvert_alpha()”和“%”有什么作用?

时间:2015-09-15 02:12:34

标签: python python-2.7 pygame sprite alpha

我正在尝试学习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() 

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

  1. sheet.subsurface()做什么?这四个参数代表什么? (我相信第三和第四是指个别图像的宽度和高度。)
  2. .convert_alpha()做什么?教程说它“保留了透明度”,但我发现它很奇怪,因为我之前已经使用过具有透明背景的图像,而且没有一个需要这样的转换。
  3. %做什么?我已经知道/代表除法,但教程从未解释过%

2 个答案:

答案 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

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的“模/余”运算符。在这种情况下,它用于使counter变量循环重复通过值0到7再返回0。

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

建议搜索:python percent sign