Pygame: .set_clip 返回列表中的第一个值,而非请求值

0 投票
1 回答
1009 浏览
提问于 2025-04-17 15:20

我正在尝试为从精灵表中返回的图像制作行走动画。
我使用 .set_clip 来获取精灵表中的一部分。看起来一切都应该正常工作。
但是 .set_clip 返回的却是我提供的列表中的第一个矩形值,而不是我想要的那个。
我的代码

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

1 个回答

2

我正在使用 .set_clip 来返回精灵表的一部分。

不,你不需要这样做。你应该使用 subsurface 来获取精灵表的一部分。


我不知道你认为 set_clip 是做什么的,但它的实际功能可能和你想的不一样:

它是一个矩形,表示在这个表面上可以被修改的像素区域。

SDL 文档 中有更好的解释:

设置一个表面的剪裁矩形。当这个表面作为绘制目标时,只有在剪裁矩形内的区域会被绘制。


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

set_clip 并不会返回任何列表中的矩形值。

当你调用 pygame.Rect(ani_pos[sprite_num]) 时,你是在用列表 ani_pos 中索引为 sprite_num 的值创建一个 Rect,而 sprite_num__init__ 方法被调用时是 0

你在 __init__ 方法中创建的 Surface 存储在 player 字段里,但你实际上并没有改变它。如果你想做某种动画,你应该每 n 帧改变一次它。你把 sprite_num 改成了 2,但这并没有任何作用,因为你之后并没有再使用这个值。

撰写回答