2017-12-31 131 views
1

私は、衝突がSFMLでどのように動作するかを確認するためのテストを続けました。コードが示すように、マリオは彼が床オブジェクトに触れたときに彼の位置を変更し、床の上にテレポートしますSFMLでの適切な衝突(C++)

if (floor.getGlobalBounds().intersects(SuperMario.getGlobalBounds())) // Floor 
    { 
     SuperMario.setPosition(SuperMario.getPosition().x, floor.getPosition().y - SuperMario.getOrigin().y); 
     IsTouching = true; 
    } 

:私は、このコードのスニペットを作ってきました。

ただし、これには以下のような副作用があります。 2nd image

enter image description here

「グリーンボックス」は、私が先に述べた床オブジェクトであることに注意してください。また、画像1の単語「左」を無視して、「右」を意味します。

もちろん、この動作は意図されています(つまりバグではありません)が、望ましくありません。

私の質問です。どうすればこの "副作用"を排除できますか?つまり、私は自分のコードを変更することができます。そのため、Marioはフロアの上を移動しません。私はマリオがボックスに止められて、テレポートされないようにしたい。

UPDATE:だから今、私はこの持っている:

for (unsigned int i = 0; i <= solidObjects.size() - 1; i++) 
    { 
     if (solidObjects[i].getGlobalBounds().intersects(SuperMario.getGlobalBounds())) 
     { 
      if (SuperMario.getPosition().x - solidObjects[i].getPosition().x < SuperMario.getPosition().y - solidObjects[i].getPosition().y) 
      { 
       SuperMario.setPosition(solidObjects[i].getPosition().x - SuperMario.getOrigin().x, SuperMario.getPosition().y); 
       IsTouching = false; 
      } 
      else if (SuperMario.getPosition().y - solidObjects[i].getPosition().y < SuperMario.getPosition().x - solidObjects[i].getPosition().x) 
      { 
       SuperMario.setPosition(SuperMario.getPosition().x, solidObjects[i].getPosition().y - SuperMario.getOrigin().y); 
       IsTouching = true; 
      } 
      else if (SuperMario.getPosition().x - solidObjects[i].getTextureRect().width < SuperMario.getPosition().y - solidObjects[i].getPosition().y) 
      { 
       SuperMario.setPosition(solidObjects[i].getTextureRect().width + SuperMario.getOrigin().x, SuperMario.getPosition().y); 
       IsTouching = false; 
      } 
     } 
     else 
     { 
      IsTouching = false; 
     } 
    } 

をしかし、一つの問題があります。マリオがフロアの両側に触れると、彼は右に動かすことができないということを意味する。

私が十分明確でない場合は、追加する内容や具体的な内容を明記してください。

+1

避けたい行動は、どのようなものですか?テレポーテーション?箱に止めたいですか? – Mario

+0

はい!私はそれがほしいと思う! –

+1

x/yの位置と幅/高さを比較することで、Marioを床の矩形の外に出すには最小限の動きが必要な方向を見つけ出すことができます。それがあなたがマリオを動かそうとする方向です。 – super

答えて

2

これは、プレイヤーが歩いて歩くことができる領域ではなく、ソリッド領域を定義するのが一般的だから、本当に変です。あなたは、地面に接着させるのではなく、結局あなたのプレイヤーがジャンプすることを望みます。

残りの部分は非常に簡単です:すべての固体のオブジェクトを反復

  • とプレーヤーと固体四角形の重複するかどうかを決定します。
  • もしそうなら、どの距離がより小さいか(xまたはy)を決定します。これにより、プレーヤーを移動する軸を決定することができます。
  • プレイヤーがソリッドエリアから離れる方向、つまりプレーヤーを押す方向を決定します。
  • プレーヤーを計算された方向に押して、チェックを繰り返します。

地図の複雑さにもよりますが、これはかなり複雑になる可能性が高いため、比較の回数を減らすためにソート/空間化が必要になることがよくあります。

+0

@ToadTheMushroomCoder上の関数を定義した方法では、彼は糊付けする必要がありますが、これはジャンプの実装方法によって異なる場合があります。 – Mario

+0

私は最後の質問があります。ソリッドオブジェクトを正確に反復するにはどうすればよいですか? –

+1

@ToadTheMushroomCoderあなたは 'std :: vector'のようないくつかのコンテナにそれらを持っています。 – Mario