2017-06-23 18 views
0

古典的なアーケードゲームArkanoidを作ろうとしていますが、ボールとレンガの衝突に問題があります。現在、私はちょうど(ポンのように)古典的な衝突を使用しています:パイゲームのボールと矩形の衝突

def colision(self, objetivo): 
    if self.rect.colliderect(objetivo.rect): 
     self.speed[1] = -self.speed[1] 

def colision2(self, objetivo): 
    if self.rect.colliderect(objetivo.rect): 
     self.speed[0] = -self.speed[0] 

私が持っている問題は、ボールがレンガの異なる部分に当たると、時にはそれが間違った道をバウンスし、「食べる」終わるということですレンガ以上のもの。私はボーダーを追加したので2つの異なるタイプの衝突を使用していますが、それらも一緒にバウンスさせていますが、どのようにしてレンガのどちら側がヒットしたかを認識させる方法を知らないのでcolision1またはcolision2側。

+0

レンガの側面に識別子を追加して、衝突が垂直か水平かを確認してください。あるいは、適切な2D衝突モデルを実装する場合は、衝突の方向を気にする必要はありません。 – xvan

+0

識別子を追加して確認する方法の例を教えてもらえますか?また、私は適切な2Dコリジョンモデルを作ることができますか? –

答えて

0

円ボールを使用していますか?もしそうなら、あなたは衝突を使っている可能性が高いです。ボールがレンガの近くに来ると、バウンディングボックスは表示される場所とは少し違う場所に衝突しています。スプライトとcollide_circleを試してください。

+0

私は円形ボールのイメージを使用しています。しかし、はい、私は衝突を使用しています。事は、私は衝突が円と長方形の間にあるので、どのように衝突円を使用するのかわかりません。私に例を教えてもらえますか? –

+0

私はまず円の代わりに正方形のスプライトを使ってプログラムを実行し、問題の原因となる境界ボックスであることを確認します。確認され、完全なピクセル衝突が必要な場合は、すべてのスプライトのマスクを作成し、sprite.collide_mask()を使用できます。もう一つの選択肢は長方形の衝突を継続することですが、あらゆる衝突時にボールの中心からレンガの角までの距離を測定するためにジオメトリを使用します。これは、ボールがレンガに接触しているか、衝突したバウンディングボックスの角にすぎないかを示します。 – DinosauRuss

関連する問題