2

アニメーション付きのファイル (*.png) があります。各ファイル - フレーム。つまり、10 ファイル - 10 フレームです。フルアニメーションを 4 回繰り返します。したがって、画像を20回レンダリングする必要があります。

DiceAnim1=pygame.image.load('Gfx/Dices/dice0042.png').convert_alpha()
DiceAnim2=pygame.image.load('Gfx/Dices/dice0043.png').convert_alpha()
DiceAnim3=pygame.image.load('Gfx/Dices/dice0044.png').convert_alpha()
DiceAnim4=pygame.image.load('Gfx/Dices/dice0045.png').convert_alpha()
DiceAnim5=pygame.image.load('Gfx/Dices/dice0046.png').convert_alpha()
DiceAnim6=pygame.image.load('Gfx/Dices/dice0047.png').convert_alpha()
DiceAnim7=pygame.image.load('Gfx/Dices/dice0048.png').convert_alpha()
DiceAnim8=pygame.image.load('Gfx/Dices/dice0049.png').convert_alpha()
DiceAnim9=pygame.image.load('Gfx/Dices/dice0050.png').convert_alpha()
DiceAnim10=pygame.image.load('Gfx/Dices/dice0051.png').convert_alpha()

最小限のコード長で関数を提案できますか? メイン プログラム ループでの開始:

if event.type == pygame.MOUSEBUTTONDOWN:
    if gameState==7:
        if 165<pointer_coord[0]<424 and 249<pointer_coord[1]<607 : 
            gameState=9
            rolling=1

これは、ユーザーが領域 (x=165、y=249、長さ = 424-165、高さ = 607-249) をクリックすると、ゲームが状態 9 に入るということです。状態 9 - アニメーションを再生するために作成されました。

if gameState==9:
        RollingAnimation(166,253)
        RollingAnimation(210,278)
        RollingAnimation(166,303)
        RollingAnimationControl()

この関数 RollingAnimation は次のとおりです。

def RollingAnimation(tx,ty):
    global diceTikTac
    screen.blit(DiceAnimShadow,[tx,ty])
    if diceTikTac==1: screen.blit(DiceAnim1,[tx,ty])
    if diceTikTac==2: screen.blit(DiceAnim2,[tx,ty])
    if diceTikTac==3: screen.blit(DiceAnim3,[tx,ty])
    if diceTikTac==4: screen.blit(DiceAnim4,[tx,ty])
    if diceTikTac==5: screen.blit(DiceAnim5,[tx,ty])
    if diceTikTac==6: screen.blit(DiceAnim6,[tx,ty])
    if diceTikTac==7: screen.blit(DiceAnim7,[tx,ty])
    if diceTikTac==8: screen.blit(DiceAnim8,[tx,ty])
    if diceTikTac==9: screen.blit(DiceAnim9,[tx,ty])
    if diceTikTac==10: screen.blit(DiceAnim10,[tx,ty])

アニメーションを制御するには、制御関数 RollingAnimationControl を使用します。

def RollingAnimationControl():
    global radiobuttonPos,diceTikTac,round1,gameState
    diceTikTac=diceTikTac+1
    if diceTikTac==11: 
        round1=round1+1
        diceTikTac=1
    if round1>4: # how much need loops animation.
        gameState=11
        diceTikTac=1            
        rolling=0
        round1=0

問題は、この関数を最小化するにはどうすればよいかです。アニメーションがフレーム付きの 100 ファイルを使用する場合、この関数がどのように見えるか想像できますか。

4

2 に答える 2

1

1つの方法は、アニメーションにスプライトシートを使用することです。

アニメーションの読み込み:

def load_anim(start=42, stop=52):
    # loads array of many frames
    files = [ "Gfx/Dices/dice00{}.png".format(i) for i in range(start, stop) ]
    frames = []

    for file in files:
        surf = pygame.image.load(file).convert_alpha()
        frames.append(surf)
    return frames

あなたがどのようにアニメートしているかわかりません。時間ベースの場合、または何ですか?

クリック

if event.type == pygame.MOUSEBUTTONDOWN:
    if gameState==7:
        # I'm assuming this is the rect of a sprite.
        # Otherwise you can still create the Rect
        if dice_sprite.get_rect.collidepoint(event.pos)
            gameState = 9
            rolling = 1
于 2013-01-13T18:42:48.620 に答える
1

アニメーションをロードするために、 for ループを使用して、ロードする必要があるものを処理できます。これは、それらの便利な名前付けによります (うまくいきました)。

frames=[]
for i in range(42, 52):
    frames.append(pygame.image.load('Gfx/Dices/dice00'+str(i)+'.png').convert_alpha())

フレームがすべてリストにあるので、ブリットするのがずっと簡単になります。

for frame in frame:
    screen.blit(frame, ???)

このようにして、長いまたは繰り返しなしでアニメーションをブリットしてロードできます

于 2013-01-13T20:08:01.727 に答える