Pygame中的透明精灵

时间:2012-10-24 22:55:28

标签: python pygame

我正在研究一些使用Pygame的Python代码,尝试在背景上显示一个小精灵(一个球)。我有那部分工作,但是我试图让球精灵的背景变得透明,所以它不会出现在黑色方块内的球状物中。"精灵,但显示黑色像素没有blitting到显示表面。

这是我的代码:

# For sys.exit()
import sys

# Pygame imports
import pygame
from pygame.locals import *

# Initialize all the Pygame Modules
pygame.init()

# Build a screen (640 x 480, 32-bit color)
screen = pygame.display.set_mode((640,480)) 

# Create and Convert image files
# Use JPG files for lots of color, and use conver()
# Use PNG files for transparency, and use convert_alpha()
background = pygame.image.load("bg.jpg").convert()
ball = pygame.image.load("ball.png").convert_alpha()
ball.set_colorkey(-1, RLEACCEL) # Use the upper-left pixel color as transparent

# The main loop
while True:

    # 1 - Process all input events
    for event in pygame.event.get():

        # Make sure to exit if the user clicks the X box
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    # 2 - Blit images to screen (main display window)
    screen.blit(background, (0,0))
    x,y = pygame.mouse.get_pos()
    x = x - ball.get_width()/2
    y = y - ball.get_height()/2
    screen.blit(ball, (x,y))

    # 3 - Update the main screen (redraw)
    pygame.display.update()

我一定是犯了一个明显的错误,但我无法弄清楚。调用ball.set_colorkey(-1,RLEACCEL)应该拾取球精灵左上角的颜色(恰好是黑色)并将其用作像素颜色"而不是blit"。我错过了一步吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

有每像素alpha,colorkey alpha和per-surface alpha。你要求使用colorkey。

当您致电convert_alpha()时,它会为每像素alpha创建一个新表面。

来自set_colorkey

  

如果将Surface格式化为使用每像素alpha值,则将忽略colorkey。

所以:使用.convert()加载图像因为您想使用颜色键。然后拨打set_colorkey

  

另外,我在文档中没有看到将“-1”作为第一个参数传递给set_colorkey。

这可能来自一个教程,它有一个load_image函数来获取topleft像素的颜色值。

答案 1 :(得分:0)

您的图片是如何创建的? 如果你的“ball.png”文件是透明背景上的球,而不是黑色方块上的球,那么用于blitting的Pygame透明度应该有效。 也就是说,来自Pygame的表面文档“set_colorkey”:

“如果将Surface格式化为使用每像素alpha值,则将忽略colorkey。可以将colorkey与完整的Surface alpha值混合使用。”

因此,colorkey的想法是当你的图像没有每像素alpha时使用它 - 而你只是确保当你调用“convert alpha”时它 。另外,我在文档中没有看到将“-1”作为第一个参数传递给set_colorkey。

简而言之:我的建议是使用适当的透明图像开始 - 并忘记“convert”,“convert_alpha”,“set_colorkey”等等。如果你有一些理由不使用PNG文件中的每像素alpha,那么以正确的方式检查这个答案(甚至出于一个原因,当blitting到屏幕时不想要每个像素alpha): PyGame: Applying transparency to an image with alpha?