2012-01-11 24 views
1

私の目標は、ボールスプライトが 'g_ball'スプライトのいずれかに当たったときに私のプログラムが衝突を検出できるようにすることです。コードはapperently衝突を検出し、私はそれをテストする "印刷"ステートメントを持って...しかし、スプライトのいずれかが触れているにもかかわらず、それは常に "進捗状況"を印刷しています。ここでは、コードです:あなたは何の衝突のために設定されたオフセットがないためスプライトが文字通り衝突していなくてもプログラムが衝突を検出しました 'pygame.sprite.collide_rect'

while 1: 
    screen.blit(background, (0,0)) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 


     if event.type == KEYDOWN: 
      if event.key == K_a: 
       m_x = -4 
       s+=1 
      elif event.key == K_d: 
       m_x = +4 
       s2+=1 
     if event.type == KEYUP: 
      if event.key == K_a: 
       m_x = 0 
      elif event.key == K_d: 
       m_x = 0 

    x+= m_x 
    y+= m_y  

    ball = pygame.sprite.Sprite() 
    ball.image = pygame.image.load('red_ball.png').convert() 
    ball.rect = ball.image.get_rect() 
    ball.image.set_colorkey((white)) 
    screen.blit(ball.image,(x,y)) 
    if x > 640: 
     x = 0 
    if x < 0: 
     x = 640 


    g_ball = pygame.sprite.Sprite() 
    g_ball.image = pygame.image.load('green_ball.png').convert() 
    g_ball.rect = g_ball.image.get_rect() 
    g_ball.image.set_colorkey(white) 
    screen.blit(g_ball.image,(50,t)) 
    t+=5 
    if t > 521: 
     t = 0 
    collision = pygame.sprite.collide_rect(ball, g_ball) 
    if collision == True: 
     print ('PROGRESS!!!') 

答えて

0

それはだ、あなただけのscreen.blitにオフセットを渡しました。

あなたの固定されたコードは、これを次のようになります。

... 
ball.rect = ball.image.get_rect() 
ball.rect.topleft = (x, y) 
... 
g_ball.rect = g_ball.image.get_rect() 
g_ball.rect.topleft = (50, t) 
... 
0

nightcrackerは正しいです。あなたはこのループでできることを理解していますか(できるだけ早く実行するはずです)? 2つの新しいボールを作成し、hdからイメージをロードし、それらを(0,0)に配置して、与えられた位置のスクリーンに手動で印刷します。この最後の部分はどこかに表示することを意味しますが、実際の位置は表示しません(ball.rect = ball.image.get_rect()で実際の位置を設定しています)。彼らは実際に(0,0)にあり、常に衝突しています。

あなたが画面にブリットする方法は良くありません。レンダラーを使用してください。とにかく、最初にいくつかのチュートリアルを試し、表面が何で、スプライトが何であるかを学ぶべきです。メインループの中に何を入れているのか注意してください(なぜ新しいボールを作成するのですか?起動時に一度作成することができます)、コードがきれいになり、FPSが増加します

関連する問題