2010-09-12 28 views
1

我有一個簡單的程序,將背景圖像送到顯示區域,然後將精靈放在左上角。精靈使用colorkey透明度,但是當我精靈精靈時,應該是透明的區域是黑色的,而不是。 colorkey使用的顏色是綠色,所以colorkey至少在做某事。當使用Pygame中的colorkey透明度對精靈進行blitting時,應該透明的區域是黑色的

這裏是我的主模塊,其中有大部分的顯示代碼:

import pygame 
from pygame.locals import * 

import sprites 

try: 
    import psyco 
    psyco.full() 
except: 
    print "psyco failed to import" 

class PatchCon(object): # main game class 
    def __init__(self): 
     pygame.init() 
     self.screen = pygame.display.set_mode((832, 768)) 
     pygame.display.set_caption('PatchCon') 
     self.setBackground() 
     self.sprites = pygame.sprite.RenderPlain((sprites.Actor("Reimu"))) 

    def refresh(self): 
     self.sprites.update() 
     self.screen.blit(self.background, (0,0)) 
     self.sprites.draw(self.screen) 
     pygame.display.update() 

    def setBackground(self): 
     self.background = pygame.Surface(self.screen.get_size()) 
     backgrounds = sprites.loadImage('patchconbackgrounds.png') 
     self.background.blit(backgrounds[0], (0,0), sprites.bgcoords[3]) 
     self.background = self.background.convert() 

    def mainLoop(self): 
     while True: 
      for event in pygame.event.get(): 
       if event.type == QUIT: return 
      self.refresh() 



if __name__ == '__main__': 
    game = PatchCon() 
    game.mainLoop() 

我的其他模塊, 'sprites.py',與加載圖像優惠和構建精靈對象:

import os 
import pygame 
from pygame.locals import * 


# there are four different backgrounds compiled into one big image. 
bgcoords = ((0,0,832,768), 
      (0,769,832,1537), 
      (833,0,1664,768), 
      (833,769,1664,1537)) 

# the top left pixels of characters' sprites in the sprite sheet 
charCoords = { "Reimu" : (1, 10), 
       "Marisa" : (334, 10)} 


def loadImage(name, colorkey=None): 
    fullname = os.path.join('images', name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error, message: 
     print 'Cannot load image:', fullname 
     raise SystemExit, message 
    image = image.convert_alpha() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 



class SpriteDict(object): 
    """SpriteDict has a list that holds all of the different images 
    the sprites have. It's in charge of finding character's sprites on a big 
    sprite sheet and loading them into that list.""" 
    def __init__(self): 
     self.spritesheet = loadImage("patchconsprites.png", pygame.Color('#007888'))[0] 
     # more code here 

    def choose(self, dir, step, color): 
     """This function returns an image from the sprite list.""" 



class Actor(pygame.sprite.Sprite): 
    def __init__(self, name): 
     pygame.sprite.Sprite.__init__(self) 
     self.sprites = SpriteDict(name) 
     self.image = self.sprites.choose('N', 0, 1) 
     self.rect = self.image.get_rect() 

我發現的所有教程都讓我相信這段代碼是正確的。任何人看到我做錯了什麼?


編輯:圍繞相關問題的搜索,我發現image.convert()不保留阿爾法像素,因此在另一個問題的建議,我把它改爲image.convert_alpha()。但是,現在,不是黑色區域,我只是得到了colorkey的顏色。我對顏色值進行了三重檢查,我確信它是正確的。還有什麼我可能會失蹤?

回答

1

嗯,我解決了我的問題。它涉及改變SpriteDict膽量,使其沒有叫loadImage(),而是處理加載圖像和應用的透明度在構造函數本身,就像這樣:

class SpriteDict(object): 
    def __init__(self, name): 
     self.spriteSize = (35, 35) 
     # change this old line: 
     #self.spritesheet = loadImage("patchconsprites.png", (0,120,136,0))[0] 
     # to this: 
     self.spritesheet = pygame.image.load("./images/patchconsprites.png") 
     self.sprites = [] 
     start = charCoords[name] 
     char = list(start) 
     image = pygame.Surface((35,35)) 
     for y in range(5): 
      char[0] = start[0] 
      for x in range(9): 
       rect = (char[0], char[1], char[0]+self.spriteSize[0], char[1]+self.spriteSize[1]) 
       image.blit(self.spritesheet, (0,0), rect) 
       # and put the transparency code here: 
       image = image.convert() 
       colorkey = image.get_at((0,0)) 
       image.set_colorkey(colorkey, RLEACCEL) 
       # end new code 
       self.sprites.append(image) 
       char[0] += self.spriteSize[0]+2 
      char[1] += self.spriteSize[1]+2 

它使我的代碼了很多混亂,和可能會慢一點,但它有效。如果有人能告訴我爲什麼它必須以這種方式工作,並且可能如何使它不那麼難看,那很棒。

0

您對loadImage的調用通過(隱含)None作爲colorkey參數。當colorkey爲None時,您的loadImage函數不會設置任何colorkey。

+0

在'SpriteDict'的構造函數中,我調用了loadImage,我忘記了顯示。它將colorkey指定爲'#007888'。對於那個很抱歉。 – Max 2010-09-12 19:24:23

1

現在在問題中發佈的代碼的問題可能是您正在混合convert_alpha(),這會導致alpha通道的精靈以及alpha 255的顏色.SDL中的colorkey檢查只是一個整數比較,所以即使你沒有指定一個alpha通道,你只會匹配0x007888FF,而不是例如0x007888FE或0x00788800。

如果你有一個帶alpha通道的精靈,那麼沒有理由使用一個colorkey。只需使用精靈的alpha通道來製作你想要的透明部分。

+0

精靈沒有alpha通道。我有convert_alpha()在試圖看看它是否會解決問題。本來我經常轉換()在那裏。 – Max 2010-09-16 18:45:25

0

下面是我在pygame例子中找到的一段圖片加載代碼。您可以將此到您的主Python文件處理同樣的工作作爲你的腳本,而無需將其導入:

import os, sys #required to use this block 
... 
-snip- 
... 
def load_image(name, colorkey=None): 
    fullname = os.path.join('name for images folder here', name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error, message: 
     print 'Cannot load image:', name 
     raise SystemExit, message 
    image = image.convert() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 

一些注意事項:

裝入一個圓形物體,其直徑觸及矩形的尺寸將導致的問題。您可以通過使圖像尺寸大於圓圈來解決這個問題。加載PNG時發生這種情況,但我不知道加載其他擴展格式時會發生什麼。

這個塊是非常靈活的;你可以在任何腳本中複製粘貼它,它會起作用。當你想加載圖像時,請致電load_image('image.bmp', -1)。一個-1的colorkey將告訴函數將像素定位在精靈的0,0處,然後用它作爲色鍵。

相關問題