Pygame / Python仅用于循环blrite精灵列表中的最后一个元素

时间:2014-08-23 14:33:18

标签: python pygame

这是我的主要问题和对我所拥有的内容的简要说明: 我有一个名为Cat的类,以及一个名为Cats的列表。在一些随机条件之后,我想要将新的一个添加到屏幕的随机部分。

现在就是这样,如果我将屏幕画成白色,然后我使用for循环来对每个元素进行blit,for循环只会在提交屏幕后将最后一个元素搞定。

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()

这里是猫班

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 :(得分:0)

您创建了一个类属性catRect,它对每个cat对象都是相同的。在init函数中,移动catRect使topleft位于新位置。

要解决此问题,请制作另一个将从第一类复制的矩形。

另一个提示 - 如果您已经有一个存储位置 - 矩形,请创建新的变量来存储位置。考虑到这两点,这里是相关的代码:

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)