2009-08-08 71 views
4

我剛開始與pygame的工作,我試圖做一個半透明的精靈,而精靈的源文件是從磁盤加載的非透明位圖文件。我不想編輯源圖像,如果我可以幫助它。我相信有一種方法可以用pygame代碼來做到這一點,但Google對我毫無幫助。如何使半透明的精靈在pygame的

回答

2

我可能還沒有在我原來的問題清楚,但我想我想通了我自己。我正在尋找的是Surface的set_alpha()方法,所以我所要做的就是確保半透明圖像在它們自己的表面上。

這裏是我的精簡代碼的例子:

import pygame, os.path 
from pygame.locals import * 

class TranslucentSprite(pygame.sprite.Sprite): 
    def __init__(self): 
    pygame.sprite.Sprite.__init__(self, TranslucentSprite.container) 
    self.image = pygame.image.load(os.path.join('data', 'image.bmp')) 
    self.image = self.image.convert() 
    self.image.set_colorkey(-1, RLEACCEL) 
    self.rect = self.image.get_rect() 
    self.rect.center = (320,240) 

def main(): 
    pygame.init() 
    screen = pygame.display.set_mode((640,480)) 
    background = pygame.Surface(screen.get_size()) 
    background = background.convert() 
    background.fill((250,250,250)) 
    clock = pygame.time.Clock() 
    transgroups = pygame.sprite.Group() 
    TranslucentSprite.container = transgroups 

    """Here's the Translucency Code""" 
    transsurface = pygame.display.set_mode(screen.get_size()) 
    transsurface = transsurface.convert(screen) 
    transsurface.fill((255,0,255)) 
    transsurface.set_colorkey((255,0,255)) 
    transsurface.set_alpha(50) 

    TranslucentSprite() 
    while 1: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
     return 
     elif event.type == KEYDOWN and event.key == K_ESCAPE: 
     return 
    transgroups.draw(transsurface) 
    screen.blit(background,(0,0)) 
    screen.blit(transsurface,(0,0)) 
    pygame.display.flip() 

if __name__ == '__main__' : main() 

這是最好的技術?這似乎是最簡單直接的。

3

加載圖像後,你將需要啓用的Surface alpha通道。將看起來有點像這樣:

background = pygame.Display.set_mode() 
myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background) 

這將加載圖像,並立即將其轉換爲適合於alpha混合到顯示錶面上的像素格式。如果您需要以其他格式的屏幕緩衝區溢出,您可以使用其他表面。

您可以設置每個像素的阿爾法足夠簡單,假設你有一個函數,它接受一個3元組RGB顏色值,並返回RGBA顏色+阿爾法的一些期望4tuple,你可以改變每個像素的表面:

def set_alphas(color): 
    if color == (255,255,0): # magenta means clear 
     return (0,0,0,0) 
    if color == (0,255,255): # cyan means shadow 
     return (0,0,0,128) 
    r,g,b = color 
    return (r,g,b,255) # otherwise use the solid color from the image. 

for row in range(myimage.get_height()): 
    for col in range(myimage,get_width()): 
     myimage.set_at((row, col), set_alphas(myimage.get_at((row, col))[:3])) 

還有其他的,更有效的方式來做到這一點,但是這給你的想法,我希望。

1

則可以考慮使用PNG圖像在那裏你可以做你直接要在圖像中任何形式的透明度。

2

如果你的圖像有一個純色背景,你希望它變成透明的,你可以將它設置爲color_key的值,pygame會使圖片在曝光時變透明。

如:

color = image.get_at((0,0)) #we get the color of the upper-left corner pixel 
image.set_colorkey(color)