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 文档中有更好的解释:

设置曲面的剪切矩形。当这个表面是 blit 的目标时,只有剪辑矩形内的区域将被绘制到。


但是 .set_clip 返回我提供的列表中的第一个 Rect 值,而不是我调用的列表中的项目。

set_clip根本不返回任何列表的任何 Rect 值。

当您调用 时pygame.Rect(ani_pos[sprite_num]),您正在Rect使用列表中的值创建一个ani_posindex sprite_num,并且sprite_num是调用0__init__方法的时间。

您将Surface您创建的内容存储__init__在字段中的方法中player,但您从未真正更改它。如果你想创建某种动画,你应该每n帧都改变它。您更改sprite_num2,但这不会做任何事情,因为您再也不会使用该值。

于 2013-02-09T21:05:53.283 回答