pygame图像透明度混乱 [英] Pygame image transparency confusion
问题描述
我在此处阅读了与此问题相关的前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 classSpriteSheet
. Usepygame.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:
- How can I make an Image with a transparent Backround in Pygame?
- How do I blit a PNG with some transparency onto a surface in Pygame?
Note that chess pieces can also be drawn through a Unicode text.
See Displaying unicode symbols using pygame这篇关于pygame图像透明度混乱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!