Pygame/Python for循环仅在精灵列表中绘制最后一个元素

0 投票
1 回答
719 浏览
提问于 2025-04-18 18:17

这是我主要的问题,以及我所拥有的简要说明:我有一个叫做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)

撰写回答