0

スプライト シートから返された画像の歩行アニメーションを作成しようとしています。スプライト シートの一部を返すため
に使用しています。.set_clipすべてが機能するように見えます
.set_clip、呼び出したリストの項目ではなく、提供したリストの最初の Rect 値を返しています。
マイコード

import pygame, sys
from pygame.locals import *

xList = (6, 27,48,69)
yList = (24,24,24,24)
wList = (21,21,21,21)
hList = (32,32,32,32)
ani_pos = list(zip(xList, yList, wList, hList))
sprite_num = 0

class Player:

    def __init__(self): 
        playerSheet = pygame.image.load('MainChar1.png').convert() # load sprite sheet
        playerSheet.set_clip(pygame.Rect(ani_pos[sprite_num]))
        self.player = playerSheet.subsurface(playerSheet.get_clip())
        self.x = 320
        self.y = 240
    def draw(self, DISPLAYSURF):
        DISPLAYSURF.blit(self.player, (self.x, self.y))
        self.player.set_colorkey(255, 0, 255)# set sprite background invisible

class Background:

    def __init__(self):
        dirtTile = pygame.image.load('DirtBackground.png').convert()
        dirtTile.set_clip(pygame.Rect(0, 0, 863, 1103))
        self.background = dirtTile.subsurface(dirtTile.get_clip())
        self.x = -111
        self.y = -311      
    def draw(self, DISPLAYSURF):
        DISPLAYSURF.blit(self.background, (self.x, self.y))

pygame.init()
FPS = 30
FPSCLOCK = pygame.time.Clock()

# set up the window
WINDOWWIDTH = 640 # size of windows' width in pixels
WINDOWHEIGHT = 480 # size of windows' height in pixels
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('farm game')
player = Player()
background = Background()
pygame.key.set_repeat(1,0) # (mSec to begin repeat, mSec between repeats)
running = True

while running: # the main game loop

    DISPLAYSURF.fill (255,255,255)
    background.draw(DISPLAYSURF)
    player.draw(DISPLAYSURF)
    pygame.display.flip()
    FPSCLOCK.tick(FPS)

    for event in pygame.event.get(): # event handling loop
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()
            running = False

        elif event.type == KEYDOWN:
            if event.key == K_d:
                background.x -= 4
                sprite_num = 2
4

1 に答える 1

2

スプライト シートの一部を返すために .set_clip を使用しています。

いいえ、あなたはしません。subsurfaceスプライト シートの一部を返すために使用します。


あなたが何をしているのかはわかりませんがset_clip、実際にはそうではないでしょう:

これは、変更可能な Surface 上の唯一のピクセルを表す四角形です。

SDL docsでよりよく説明されています:

サーフェスのクリッピング四角形を設定します。このサーフェスがブリットの宛先である場合、クリップの四角形内の領域のみが描画されます。


しかし、.set_clip は、呼び出したリスト内の項目ではなく、提供したリスト内の最初の Rect 値を返しています。

set_clipどのリストの Rect 値もまったく返しません。

を呼び出すと、リスト内のindexの値でがpygame.Rect(ani_pos[sprite_num])作成され、メソッドが呼び出されたときになります。Rectani_possprite_numsprite_num0__init__

メソッドでSurface作成したものをフィールドに保存しますが、実際に変更することはありません。なんらかのアニメーションを作成したい場合は、フレームごとに変更する必要があります。に変更しますが、その値を二度と使用しないため、何もしません。__init__playernsprite_num2

于 2013-02-09T21:05:53.283 に答える