6

私が構築しているプロジェクトに pygame と python を使用しており、ゲームが最初に開いたときのスプラッシュスクリーンを構築しています。スプラッシュスクリーンに表示したい .png があり、黒からフェードインおよびフェードアウトすることにしました。これを行うための最良の方法は、画像を設定されたアルファでブリットすることでした。このコードを作成しましたが、実行が非常に遅く (プログラムが 30 秒間ハングします)、アルファが得られません。画像のみを画面に表示します。私は何を間違っていますか?

screen = pygame.display.set_mode([1066,600])

#Drawable surface
background = pygame.Surface(screen.get_size())

#Used for converting color maps
background = background.convert()

#Splashscreen

#image fades in
for i in range (225):
    background.fill((0,0,0))
    image = pygame.image.load("logo.png")
    image.set_alpha(i)
    logoimage = screen.blit(image,(0,0))
    pygame.display.flip()

pygame.time.delay(2000)

#image fades out

#goes on to display main menu
4

3 に答える 3

11

あなたが抱えている可能性のある別の問題(サルが言ったことに加えて)はsurface.convert()、画像をアルファを変更できる形式に変換する必要があるかもしれないということです。次のいずれかを実行できます。

image = pygame.image.load("logo.png")
image = image.convert()

また

image = pygame.image.load("logo.png").convert()

surface.convert_alpha()ほとんど同じことを行うべきですが、通常は機能しないことがわかりました。このテストコードを試して確認してください。

import pygame, sys
pygame.init()
window=pygame.display.set_mode((1500, 800))
background=pygame.Surface((window.get_rect().width, window.get_rect().height))
background.fill((0, 0, 0))
image=pygame.image.load('InsertImageHere.png')
image=image.convert()
image2=pygame.image.load('InsertImage2Here.png')
image2=image2.convert_alpha()
rect=image.get_rect()
rect2=image2.get_rect()
rect2.left=rect.width+1
i=1
while True:
    for event in pygame.event.get():
        if event.type==12:
            pygame.quit()
            sys.exit()
    image.set_alpha(i)
    image2.set_alpha(i)
    window.fill((255, 255, 255))
    window.blit(background, background.get_rect())
    window.blit(image, rect)
    window.blit(image2, rect2)
    pygame.time.delay(20)
    i+=1
    if i==255:
        i=1
    pygame.display.update()

私のテストでは、画像 1 は適切にフェードインしましたが、画像 2 はずっと暗いままでした。自分で試してみてください。お使いのコンピューターの動作が異なる場合があります。

うまくいく場合surface.convert_alpha()は、それを使用する必要があります。そうでない場合は、前に言ったことを実行してください。これで問題が解決するはずです。

pygame.time.delay(20)以前のように 2000 ではなく、私が使用したことにも注意してください。アルファを 1 ずつ増やしている場合、2000 は少し長すぎます。

于 2012-09-04T20:54:26.147 に答える
5

[1] 繰り返しごとに画像をロードしたくありません。新しいサーフェスの作成は時間がかかるためです。[2] ループは 225 回描画され、最後の反復の後、2000 ミリ秒待機します。

あなたがしたい:

image = pygame.image.load("logo.png")

for i in range (225):
    background.fill((0,0,0))    
    image.set_alpha(i)
    screen.blit(image,(0,0))
    pygame.display.flip()
    pygame.time.delay(20)

フェードインとフェードアウトを行うには、プレイヤーがボタンをクリック/ヒットするまでループし続ける必要があります。このような:

import pygame
from pygame.locals import *

# ...

def title_loop():
    # title screen main loop    
    image = pygame.image.load("logo.png")
    done = False
    alpha = 0
    alpha_vel = 1

    # fade alpha in-out while waiting    
    while not done:        
        # get key input
        for event in pygame.event.get():
            if event.type == QUIT:
                done = true
            if event.type == KEYDOWN:
                if event.key = K_ESCAPE:
                    done = true

        # draw
        if alpha >= 255 or alpha <= 0:
            alpha_vel *= -1
        alpha += alpha_vel

        background.fill((0,0,0))
        image.set_alpha(i)
        screen.blit(image,(0,0))
        pygame.display.flip()

        pygame.time.delay(20)
于 2012-09-04T02:12:32.917 に答える
2

PygameNerd の例は近いですが、実際には機能しません。

image.convert() は適切にフェードしますが、アルファ チャネルはサポートしていません。黒以外の背景で試してみると表示されます。image.convert_alpha() はフェードしませんが、アルファ チャネルは適切に機能します。

pygame がそのままではこれをサポートしていないことに驚いていますが、とにかく。ここに答えがあります: http://www.nerdparadise.com/tech/python/pygame/blitopacity/

少し複雑ですが、うまく機能します。透明な背景とフェードを 1 つのパッケージにまとめました。

于 2013-02-07T15:09:16.483 に答える