2012-02-28 22 views
0

C++ & SDLの2つの矩形間の衝突をどのようにして計算しますか?プレーヤがこの矩形を通過できないようにするにはどうすればよいですか?私はプレーヤーを停止することを知っていますplayeryvel = 0、プレーヤーのYの速度を0にするので、彼らはそれを通過することはできません。私の問題は、これは、すべての垂直移動を停止するとき、私はそのrectを通して移動を停止することです。SDLとC++での衝突

EDIT:現在のコードでは、check_collision(SDL_Rect、SDL_Rect)という名前の関数が使用されています。だから私の使用法のコードと実際の関数。

​​
+4

この質問は少し曖昧です。今持っていることを示すコードスニペットを追加すると役立ちます。 –

+0

投稿は自分のコードで更新されました。 –

答えて

2

プレーヤを衝突のポイントから、フレームごとに押し込むだけです。あなたはブーリアンテスト(衝突するかどうか)は必要ありません。衝突が発生した場合、プレーヤーの位置を調整する必要があります。

  1. プレーヤーの位置(位置+速度=時間)を更新します。
  2. コリジョンが発生した場合、コリジョンが発生しないようにコリジョンポイントからプレイヤーを離します。

これは、壁などに沿って「スライド」することができるため、実際にはうまくいくことがあります。これを行うには、接触点、交差点の深さ、および交差点の方向あなたは離れて移動するには、プレーヤーを押す必要があります)。

もちろん、プレイヤーの移動距離を計算する必要がありますが、2Dでは非常に簡単です。

2つの矩形の重なりを計算する必要があります。次に、プレイヤーの四角形を最も重なっている方向(xまたはy方向)に押します(等しい場合を除いて、x方向またはy方向のみ)。

+0

衝突が発生した場合はどうすればうまくいくのですか?それは私の問題です:( –

+0

@JackWilsdon:あなたはすでに重なり方の長方形を検出する関数を持っています。もし2軸の長方形が重なっているかどうかを調べる方法に問題があるなら、あなたがもっと先進的なことをしているのなら、[chris heckerの物理学の記事](http://chrishecker.com/Rigid_body_dynamics#Physics_Articles)も読むことができます。 – SigTerm

+0

私の機能は機能しません。 –

1

あなたは事実の後にあなたの衝突を捕まえているようです。ほとんどの場合、プレーヤーを四角形に移動しているので、その後の衝突チェックは常にtrueを返します。これを修正するにはいくつかの方法がありますが、最も簡単なのは、の前にの前に衝突が発生することです。

プレイヤーが落ちていて、各フレームのプレイヤーの位置を更新したとします。移動する前に、プレーヤーの位置が変更された場合、新しい位置が矩形と交差するかどうかを確認する必要があります。新しい位置が四角形と交差する場合は、矩形の端に接して交差させないように、移動距離(ステップ)を変更する必要があります。

+0

この問題はライブコントロールであるため、ユーザーがどのキーを押すかわからないため、前に確認できませんでした。私はすべての可能な結果についてそれを予測することができますが、より簡単な方法が必要です。 –

+0

コントロールの仕方は関係ありません。プレーヤーの位置を更新する 'Move'関数がある場合は、位置を変更する前に衝突をチェックし、必要に応じて調整します。アイデアは、ポジションを更新する前に衝突をチェックし、プレーヤが長方形に入るのを防ぐことです。 –

1

移動機能で照合のチェックを追加します。新しい位置を(移動されたかのように)照合関数に渡します。衝突が発生すると、move funcにfalseが返され、移動がなければtrueが返されます。

+0

私はそれを試してみる、それは良いと思う。ありがとう! –

+0

動作しませんが、まだ衝突しても閉じません。私のコード:http://pastebin.com/4phmPLm3。奇妙なタブで申し訳ありません、それは間違ってコピーされました。 –

+0

hmmこのコードではあまり見かけませんが、cMap.check_collision(cMap.wall.at(i)、cDisplay.getPlayer(playerx + x、playery)))あなたは正しい方向に行きたいですか? – fex

1

Lazyfooコードが使用されています。私はあなたと同じ問題を抱えていましたが、私はそれを解決しました。ここで私はそれをやった。

hero.move(true); // hero is moved in some direction 
if (check_collision(hero.rect(),box.rect())) // check for collision after movement 
{ 
    hero.move(false); // if collision happend , move hero back 
} 

SDL_flip(screen); 

ヒーローがブロックで停止したように見えますが、実際には衝突が発生した場合は前進し、後退します。その後、彼は表示されます。 真と偽の引数は、ヒーローを前方(x + = speed)または後方(x - = speed)に移動する必要があるかどうかを関数に伝えるために使用されます。 私の衝突コードからいくつかのコードが必要な場合は、尋ねてください。

関連する問題