代码之家  ›  专栏  ›  技术社区  ›  enricogp

“.suburface()”、“.convert_alpha()”和“%”做什么?

  •  1
  • enricogp  · 技术社区  · 9 年前

    我正在尝试学习Pygame,我接下来的教程中有一节解释如何为精灵设置动画。它给了我一个精灵表,其中有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 回复  |  直到 9 年前
        1
  •  1
  •   Weeble    9 年前

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

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

    建议搜索: pygame subsurface

    convert convert_alpha 两者都用于将表面转换为屏幕所使用的相同像素格式。这确保了当您将它们快速推送到屏幕时,不会因为转换而损失性能。 转换 丢弃任何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

        2
  •  1
  •   user3757614    9 年前

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

    这两种方法基本上做相同的事情,但其中一种可能比另一种更方便。特别是,打开和读取文件的性能成本很小,如果您需要连续执行1600次,那么这一成本可能很高。

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