2017-07-10 17 views
1

2つの矩形間の衝突を検出することは非常に簡単ですが、2Dゲームでは壁に衝突しないことを確認することは非常に困難です。私はそれを管理しましたが、それはバギーであり、プレイヤーが壁を通過するのを防ぐために、1歩につき約14のif文が必要です。2つの長方形間の衝突を防ぐ簡単な方法は何ですか?

if wall_bottom > entity_top and wall_top < entity_bottom: # is player between y min and max 
    if entity_left >= wall_right - entity.max_velocity: # is the player on the right side of the box (in or out) 
     if (entity_left + entity.x_velocity) < wall_right: # will the player be past the right side 
      if entity.x_velocity < 0: # is the player's velocity heading left (into right side) 
       entity.x = wall_right # x coord changed to edge of wall 
       entity.x_velocity = 0 # velocity reset, wall stops player 
    elif entity_right <= wall_left + entity.max_velocity and \ 
      (entity_right + entity.x_velocity) > wall_left and \ 
      entity.x_velocity > 0: 
     entity.x = wall_left - entity.x_length 
     entity.x_velocity = 0 
if wall_right > entity_left and wall_left < entity_right: # is player between x min and max 
    if entity_top >= wall_bottom - entity.max_velocity and \ 
      (entity_top + entity.y_velocity) < wall_bottom and \ 
      entity.y_velocity < 0: 
     entity.y = wall_bottom 
     entity.y_velocity = 0 
    elif entity_bottom <= wall_top + entity.max_velocity and \ 
      (entity_bottom + entity.y_velocity) > wall_top and \ 
      entity.y_velocity > 0: 
     entity.y = wall_top - entity.y_length 
     entity.y_velocity = 0 

私はすべてのエンティティのエッジを定義し、チェックプレイヤーは将来に一つのフレームを衝突された場合、その後のプレーヤーがオンになっている箱の側に座標を設定します。この解決策は控えめで、多くのバグがありました。私はよりよい解決策を考え出してきましたが、それを行う簡単な方法を見つけることができないようです。私は明白な何かを欠いていますか

+0

チェックアウト:https://gamedev.stackexchange.com/questions/586/what-is-the-fastest-way-to-work-out-2d-bounding-box-intersection –

+0

ありがとうございます。衝突を防ぐために探しています。長方形間の衝突を検出するのは簡単ですが、私はそれを探していません。 –

+0

完全な例[here](https://stackoverflow.com/questions/40966994/pygame-sprite-wall-collision/45017561#45017561)を投稿しました。 – skrx

答えて

0

あなたのコードはあなたのプロジェクトにとって非常に特殊なものなので、私はこのコンセプトを手伝って、あなたのプログラムにそれを適用することができます。

class Player:  

def __init__(self): # The player born in a random place of X 
    self.x = random.randomrange(0, WIDTH)  

def move_x(self): # The player moves left,right, or doesn't move. its random 
    self.x = self.x + random.randomrange(-1, 2) 

    if self.x < 0: 
     self.x = 0 # If the player is going to collide with the left wall 
        # we put him again on the edge 

    elif self.x > WIDTH: # If the player is going to collide with the right 
     self.x = WIDTH # wall, we put him again on the edge 

あなたは条件文が動くの内側にあることがわかります。それを行うには 一つの方法は、移動機能内側の端の位置にプレイヤーの位置を比較することで、あなたはこのような何かを持って言うことができますこの機能を使用すると、移動機能自体が、プレーヤーの位置が壁の位置と決して一致しないか、または他のプレイヤーを含めて避けたい障害があるかどうかをチェックしているため、プレイヤーは決して壁に衝突しません。

+0

これは本質的に私のコードでやっていたことです。サイド、アクセント、ベロシティを追加すると複雑になりますが、プレイヤーの座標を壁の端に合わせて設定しています。 –

+0

もう一度申し訳ありませんが、私は文句が混乱していることを認識しました。私は任意の2つの長方形間の一般的な衝突を探しています。したがって、プレーヤーは画面の中央にある4つの辺を持つボックスと衝突することはできません。画面の端には興味がありません。 –

+0

同じ原則を適用するだけで、ボックスの位置とプレーヤーの位置を比較する必要があります。ボックスが時間の経過とともに変化しても、現在の位置に簡単にアクセスできるオブジェクトであると仮定します。私はこのコード全体をチェックすることはできませんが、それはあなたに役立つようです(https://inventwithpython.com/chapter18.html) –

関連する問題