2017-01-03 72 views
0

我想添加一個基本的碰撞檢測到一個簡單的平臺遊戲。我有一個班級玩家,當玩家與我想要打印的平臺相撞時(「碰撞」)。我已經使用Platform類創建了所有平臺,並將它們附加到我的方法引用collidelistall(平臺)以檢查衝突的列表中。爲什麼我得到這個錯誤?我的列表包含什麼,如果不是rect對象?我已經發布了相關的代碼段,但是如果需要的話我會發布整個代碼。Pygame:TypeError:參數必須是一個rectstyle對象的序列

感謝。

class Platform(): 
    def __init__(self, platformx, platformy): 
     self.x = platformx 
     self.y = platformy 


    def draw_platform(self): 
     pygame.draw.rect(screen, RED, (self.x, self.y, 40, 20)) 


class Player(): 
    def __init__(self): 
     self.image = pygame.image.load('C:\\Users\\admin\\Desktop\\Player1.png').convert_alpha() 
     self.rect = self.image.get_rect() 

    def display_player(self): 
     return self.image 

    def is_collided_with(self): 
     return self.rect.collidelistall(platforms) 


pygame.init() 
clock = pygame.time.Clock() 
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH) 
pygame.display.set_caption('Rum Islands') 
generate = Player() 
man = generate.display_player() 

platforms = [] 

loop = True 
while loop: 
    for event in pygame.event.get(): 
     if event.type == QUIT \ 
      or (event.type == KEYDOWN and event.key == K_ESCAPE): 
      loop = False 


    if generate.is_collided_with(): #check for collision 
     print("True") 

    screen.fill(WHITE) 

    platform_x = 0 
    platform_y = 0 

    for row in level: 
     for col in row: 
      if col == "P": 
       col = Platform(platform_x, platform_y) 
       col.draw_platform() 
       platforms.append(col) 
      platform_x += 15 
     platform_y += 20 
     platform_x = 0 
+0

使用'print()'看看你有什麼列表。順便說一句:總是把填充錯誤信息(回溯)問題(不僅是信息的一部分,在標題)。還有其他有用的信息 - 即。哪一行出問題。 – furas

回答

1

collidelistall預計對象列表pygame.Rect()。您的班級Platform不是pygame.Rect(),它不僅有xy,而且還有其他參數和方法。

所以儘量

class Platform(pygame.Rect): 

    def __init__(self, x, y): 
     pygame.Rect.__init__(self, x, y, 40, 20) 

    def draw(self, screen): 
     pygame.draw.rect(screen, RED, self) 

BTW:不使用方法不明的變量 - 在你draw_platformscreen。更好地發送它作爲參數或設置在__init__,所以你可以使用self.screen

而且你不必添加任何地方單詞platform - 即。 platformxplatformydraw_platform - 你已經有這個詞作爲類名Platform。如果你將創建新的類,即。 class House(Platform)然後它會看起來很奇怪house.draw_platform(...)

+0

感謝您的回覆。我遇到了另一個問題,它給了我假設的碰撞返回值奇怪。我開始遊戲,玩家沒有觸及任何平臺對象,但是如果我打電話給self.rect.collidelistall(平臺),我會得到數千個衝突。 – Perplexityy

+0

如果您對碰撞沒有做任何處理,那麼它會在下一個循環中找到相同的碰撞 - 而「True」會在一秒內執行數千次。函數'collidelistall'返回與玩家碰撞的元素列表,因此您可以打印它並查看您獲得的內容 - 也許您碰到了您沒有料到的元素。 – furas

相關問題