Pygame/Python for循环仅在精灵列表中绘制最后一个元素
这是我主要的问题,以及我所拥有的简要说明:我有一个叫做Cat的类,还有一个叫做Cats的列表。经过一些随机条件后,我想在屏幕的随机位置添加一个新的猫。
现在问题来了,如果我先把屏幕涂成白色,然后用一个循环把每个元素都画上去,这个循环最后只会显示最后一个元素,而之前的元素就会被覆盖掉。
screen = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT),0,32)
catsprite = pygame.image.load('catcit.png')
Cats = []
while True:
screen.fill(WHITE)
if Catspawnlimit == 0:
if random.randint(0,50) < 10: #deciding whether a new cat is created
newCat = Cat()
Cats.append(newCat) #Adding newCat to the Cats list
Catspawnlimit = 0
Catspawnlimit += 1
for kitty in Cats:
screen.blit(kitty.surface, kitty.catRect)
pygame.display.update()
这是Cat类的代码。
class Cat(object):
sizeX = 50
sizeY = 100
catRect = catsprite.get_rect()
surface = pygame.transform.scale(catsprite, (sizeX, sizeY))
def __init__(self):
self.posX = random.randint(0,WINDOWWIDTH/2 - self.sizeX)
self.posY = random.randint(0, WINDOWHEIGHT-self.sizeY)
self.catRect.topleft= (self.posX,self.posY)
谢谢。
1 个回答
0
你创建了一个类属性叫做catRect,这个属性对每个猫对象都是一样的。在你的初始化函数里,你把catRect移动到新的位置,让它的左上角在新的坐标上。
要解决这个问题,可以再创建一个新的矩形,它会从类的那个矩形复制过来。
还有一个小建议 - 如果你已经有地方存储位置,比如矩形,就再创建新的变量来存储位置。考虑到这两点,下面是相关的代码:
def __init__(self):
posX = random.randint(0,WINDOWWIDTH/2 - self.sizeX)
posY = random.randint(0, WINDOWHEIGHT-self.sizeY)
self.rect = self.catRect.copy()
self.rect.topleft = (posX,posY)
别忘了把你的绘制代码改成使用rect
,而不是catRect
。
for kitty in Cats:
screen.blit(kitty.surface, kitty.rect)