簡體   English   中英

Pygame / Python For循環僅使精靈列表中的最后一個元素

[英]Pygame/Python For loop only blitting last element inside sprite list

這是我的主要問題,並簡要說明了我所擁有的東西:我有一個名為Cat的類,以及一個名為Cats的列表。 經過一些隨機條件后,我希望將一個新條件添加到屏幕的隨機部分。

現在,事情發生了,如果我將屏幕塗成白色,然后使用for循環對每個元素進行blit,則for循環只會在提交屏幕后對最后一個元素進行blit。

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)

謝謝。

您創建一個類屬性catRect,每個貓對象都相同。 在init函數中,將catRect移動到新位置的左上角。

要解決此問題,請制作另一個將從類1復制的矩形。

另一個技巧-如果已經有存儲變量的地方,請創建新變量以存儲位置-矩形。 考慮到這兩個,這里是相關的代碼:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM