2017-01-03 13 views
0

単純なプラットフォームゲームに基本的な衝突検出を追加しようとしています。私はクラスPlayerを持っていて、プレイヤーがプラットフォーム(「Collision」)に衝突したときに衝突します。 Platformクラスを使用してすべてのプラットフォームを作成し、それらのメソッドをリストに追加して、衝突するかどうかを確認するための方法(プラットフォーム)を参照します。なぜこのエラーが発生するのですか? 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()'を使います。 BTW:(メッセージの一部だけでなく、タイトルに)問題のfillエラーメッセージ(トレースバック)を常に入れてください。他の有用な情報があります。どのラインが問題になるか。 – furas

答えて

1

collidelistallはオブジェクトのリストを予期していますpygame.Rect()。あなたのクラスPlatformは、xyだけでなく、他のパラメータと方法を持つpygame.Rect()ではありません。

そうところで

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) 

を試してみてください:は、メソッドにunknow変数を使用しないでください - あなたのdraw_platformscreenのように。引数として送信するか、__init__に設定すると、self.screenを使用できるようになります。

そして、どこにでも単語を追加する必要はありません。platform - つまり、 platformxplatformydraw_platform - あなたはすでにこの単語をクラス名Platformとして持っています。新しいクラスieを作成する場合。 class House(Platform)それは奇妙に見えるでしょうhouse.draw_platform(...)

+0

お返事ありがとうございます。私は別の問題に遭遇しました。それは、想定される衝突のために私に奇妙な戻り値を与えています。私はプレーヤーがプラットフォームオブジェクトのどれにも触れないでゲームを開始しますが、return self.rect.collidelistall(platforms)を呼び出すと何千もの衝突が発生します。 – Perplexityy

+0

もしあなたが何もしていないなら、それは次のループで同じ衝突を見つける。そして、while whileは1秒間に何千回も実行される。関数 'collidelistall'は、プレイヤーと衝突する要素のリストを返します。あなたがそれを印刷して何が得られるかを見ることができます。おそらくあなたが期待しなかった要素と衝突します。 – furas

関連する問題