pygame图像透明度混乱 [英] Pygame image transparency confusion

查看:137
本文介绍了pygame图像透明度混乱的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在此处阅读了与此问题相关的前20条帖子,在Google上阅读了许多示例,并尝试使用 .convert() .convert_alpha()两者均未尝试使用.png,.gif和Google上的前5种不同图片.请有人帮我弄清楚如何使作品具有透明背景.这是所有代码:

  import pygamepygame.init()打印("1")screen_size =(600,600)蓝色=(100,225,225)屏幕= pygame.display.set_mode(screen_size)pygame.display.set_caption(国际象棋")SpriteSheet类:def __init __(自己,文件名):加载"工作表.尝试:self.sheet = pygame.image.load(filename).convert.alpha()除了pygame.error如e:print(f无法加载Spritesheet图片:{filename}")提高SystemExit(e)def image_at(self,矩形,colorkey =无):"从特定的矩形加载特定的图像.#从x,y,x +偏移量,y +偏移量加载图像.rect = pygame.Rect(矩形)图片= pygame.Surface(rect.size)image.blit(self.sheet,(0,0),rect)如果colorkey不是None:如果colorkey == -1:colorkey = image.get_at((0,0))image.set_colorkey(colorkey,pygame.RLEACCEL)返回图片def images_at(self,rects,colorkey = None):"加载一整堆图像,并将它们作为列表返回.返回[rects中的rect的[self.image_at(rect,colorkey)]]def load_strip(self,rect,image_count,colorkey = None):"加载整个图像带,并将其作为列表返回.tups = [(rect [0] + rect [2] * x,rect [1],rect [2],rect [3])对于x在范围内(image_count)]返回self.images_at(tups,colorkey)打印("2")类游戏:def __init __():self.playing =错误self.move = 0self.player_turn = 1self.quit =错误def退出(自己):self.quit = True打印("3")类件:def __init __():self.sprite =无self.spacial = [0,0,0]self.temporal = [0,0]self.position = [self.spacial,self.temporal]self.color ="self.type ="打印("4")Chess_image = SpriteSheet('ChessPiecesArray.png')颜色= [白色",黑色"]类型= ["K","Q","B","N","R","P"]rect_piece =(0,0,133,133)打印("5")ChessSet类:def __init __():self.set = []def create_set():对于我在范围(2)中:对于范围(6)中的j:this_piece = Piece()this_piece.color = colors [i]this_piece.type =类型[j]rect_set =(133 * j,133 * i,133 *(j + 1),133 *(i + 1))this_piece.sprite = SpriteSheet.image_at(chess_image,rect_set)self.set.append(this_piece)打印("6")棋= Game()set_one = ChessSet()set_one.create_set()打印("7")虽然不是chess.quit:对于pygame.event.get()中的事件:如果event.type == pygame.KEYDOWN:如果event.key == pygame.K_q:Chess.quit()screen.fill(蓝色)screen.blit(set_one.set [0] .sprite,(10,10))pygame.display.flip() 

以下是我花时间尝试的一些图片:

这是我的错误消息在我的代码与建议的更改的屏幕快照

解决方案

如果将透明的 Surface 复制到另一个 Surface ,则目标 Surface 必须分别为每个像素alpha提供透明度.

在创建新曲面时可以启用其他功能.设置

,并修改类 SpriteSheet 的方法 image_at .使用 pygame.SRCALPHA :

  SpriteSheet类:#[...]def image_at(self,矩形,colorkey =无):"从特定的矩形加载特定的图像.#从x,y,x +偏移量,y +偏移量加载图像.rect = pygame.Rect(矩形)图片= pygame.Surface(rect.size,pygame.SRCALPHA)#< ----image.blit(self.sheet,(0,0),rect)如果colorkey不是None:如果colorkey == -1:colorkey = image.get_at((0,0))image.set_colorkey(colorkey,pygame.RLEACCEL)返回图片 

或使用 convert_alpha() :

  SpriteSheet类:#[...]def image_at(self,矩形,colorkey =无):"从特定的矩形加载特定的图像.#从x,y,x +偏移量,y +偏移量加载图像.rect = pygame.Rect(矩形)图片= pygame.Surface(rect.size).convert_alpha()#< ----image.fill((0,0,0,0))#< ---image.blit(self.sheet,(0,0),rect)如果colorkey不是None:如果colorkey == -1:colorkey = image.get_at((0,0))image.set_colorkey(colorkey,pygame.RLEACCEL)返回图片 

另请参阅:

  • 如何我可以在Pygame中使用透明Backround制作图像吗?
  • 使用pygame显示unicode符号

    I have read the top 20 posts relating to this issue here, read many examples on Google, tried using .convert(), .convert_alpha(), tried with neither, tried with .png, .gif, tried with the top 5 different images on google. Please someone help me figure out how to make the pieces show with a transparent background. Here is ALL the code:

    import pygame
    pygame.init()
    print("1")
    screen_size = (600, 600)
    blue = (100, 225, 225)
    screen = pygame.display.set_mode(screen_size)
    pygame.display.set_caption("Chess")
    
    
    class SpriteSheet:
    
        def __init__(self, filename):
            """Load the sheet."""
            try:
                self.sheet = pygame.image.load(filename).convert.alpha()
            except pygame.error as e:
                print(f"Unable to load spritesheet image: {filename}")
                raise SystemExit(e)
    
    
        def image_at(self, rectangle, colorkey = None):
            """Load a specific image from a specific rectangle."""
            # Loads image from x, y, x+offset, y+offset.
            rect = pygame.Rect(rectangle)
            image = pygame.Surface(rect.size)
            image.blit(self.sheet, (0, 0), rect)
            if colorkey is not None:
                if colorkey == -1:
                    colorkey = image.get_at((0,0))
                image.set_colorkey(colorkey, pygame.RLEACCEL)
            return image
    
        def images_at(self, rects, colorkey = None):
            """Load a whole bunch of images and return them as a list."""
            return [self.image_at(rect, colorkey) for rect in rects]
    
        def load_strip(self, rect, image_count, colorkey = None):
            """Load a whole strip of images, and return them as a list."""
            tups = [(rect[0]+rect[2]*x, rect[1], rect[2], rect[3])
                    for x in range(image_count)]
            return self.images_at(tups, colorkey)
    print("2")
    
    class Game:
        def __init__(self):
            self.playing = False
            self.move = 0
            self.player_turn = 1
            self.quit = False
    
        def quit(self):
            self.quit = True
    
    print("3")
    class Piece:
        def __init__(self):
            self.sprite = None
            self.spacial = [0, 0, 0]
            self.temporal = [0, 0]
            self.position = [self.spacial, self.temporal]
            self.color = ""
            self.type = ""
    
    print("4")
    chess_image = SpriteSheet('ChessPiecesArray.png')
    colors = ["White", "Black"]
    types = ["K", "Q", "B", "N", "R", "P"]
    rect_piece = (0, 0, 133, 133)
    
    print("5")
    
    
    class ChessSet:
        def __init__(self):
            self.set = []
    
        def create_set(self):
            for i in range(2):
                for j in range(6):
                    this_piece = Piece()
                    this_piece.color = colors[i]
                    this_piece.type = types[j]
                    rect_set = (133*j, 133*i, 133*(j+1), 133*(i+1))
                    this_piece.sprite = SpriteSheet.image_at(chess_image, rect_set)
                    self.set.append(this_piece)
    
    print("6")
    chess = Game()
    set_one = ChessSet()
    set_one.create_set()
    
    print("7")
    while not chess.quit:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    chess.quit()
        screen.fill(blue)
        screen.blit(set_one.set[0].sprite, (10, 10))
    
        pygame.display.flip()
    

    Here are a few images I spent time trying:

    EDIT: Here is the screenshot of my error message over my code with the suggested change

    解决方案

    If you copy a transparent Surface to another Surface the target Surface has to provide transparency respectively per pixel alpha.

    You can enable additional functions when creating a new surface. Set the SRCALPHA flag to create a surface with an image format that includes a per-pixel alpha. The initial value of the pixels is (0, 0, 0, 0):

    my_surface = pygame.Surface((width, height), pygame.SRCALPHA)
    

    Use the following image

    and adapt the method image_at of the class SpriteSheet. Use pygame.SRCALPHA:

    class SpriteSheet:
        # [...]
    
        def image_at(self, rectangle, colorkey = None):
            """Load a specific image from a specific rectangle."""
            # Loads image from x, y, x+offset, y+offset.
            rect = pygame.Rect(rectangle)
            
            image = pygame.Surface(rect.size, pygame.SRCALPHA) # <----
            
            image.blit(self.sheet, (0, 0), rect)
            if colorkey is not None:
                if colorkey == -1:
                    colorkey = image.get_at((0,0))
                image.set_colorkey(colorkey, pygame.RLEACCEL)
            return image
    

    Or use convert_alpha():

    class SpriteSheet:
        # [...]
    
        def image_at(self, rectangle, colorkey = None):
            """Load a specific image from a specific rectangle."""
            # Loads image from x, y, x+offset, y+offset.
            rect = pygame.Rect(rectangle)
            
            image = pygame.Surface(rect.size).convert_alpha() # <----
            image.fill((0, 0, 0, 0))                          # <---
            
            image.blit(self.sheet, (0, 0), rect)
            if colorkey is not None:
                if colorkey == -1:
                    colorkey = image.get_at((0,0))
                image.set_colorkey(colorkey, pygame.RLEACCEL)
            return image
    

    See also:


    Note that chess pieces can also be drawn through a Unicode text.
    See Displaying unicode symbols using pygame

    这篇关于pygame图像透明度混乱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆