2016-07-16 19 views
1

私は現在のPython 3、pygameの上のゲームに取り組んでいると、ゲームの基本的な部分の一つは弾丸目標状況でRectsの衝突です。pygameの中Rects間のカラーキー衝突、Pythonの3

これは、colliderect機能を使用して実現するのはかなり簡単ですが、カラーキーと同じ色のピクセルを数えないようにする必要があります。

たとえば、スプライト(文字)の1つが、その底辺が水平で、左上から弾丸が来るような大きな正三角形の形の場合、colliderectはすぐに衝突を検出しますプレーヤーのスプライトの左上のピクセルは透明です。

私は弾丸がカラーキーとは異なる色であるピクセルに達したときにのみ、衝突を検出する関数を作成する必要があります。これは、弾丸が一画素のみであれば十分に簡単です:

if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey(): 

私は箇条書きで画素ごとに上記の文を反復しようとしたが、もちろん、それは大規模な遅れを引き起こしました。異なる、より効率的な方法がありますか?

ありがとうございます!

答えて

1

はcollide_mask機能を見てください:簡単で

http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask

あなたがそれぞれを与える(pygame.mask.from_surface()を使用して)self.mask属性スプライト - あなたはカラーキーを使用して行うことができます、またはピクセルごとのアルファ。

は、この情報がお役に立てば幸い

pygame.sprite.spritecollide(プレイヤー、弾丸、真、pygame.sprite.collide_mask):次に、あなたはそうのようなspritecollide機能のためのコールバックとしてそれを含めます!

0

私は、各矩形の隅に見えたアルゴリズムを作るために管理:最も能率的な方法おそらく

def rectsCollideSimple (rect1, surf1, rect2, surf2): 
    collide = False 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    return collide 

def rectsCollide (rect1, surf1, rect2, surf2): 
    if rectsCollideSimple(rect1, surf1, rect2, surf2) or rectsCollideSimple(rect2, surf2, rect1, surf1): 
     return True 
    else: 
     return False 

ないが、それは私の問題を解決:)