Pygame: .set_clip 返回列表中的第一个值,而非请求值
我正在尝试为从精灵表中返回的图像制作行走动画。
我使用 .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
,但这并没有任何作用,因为你之后并没有再使用这个值。