1

私は現在、C++とSFML1.6を使用して暇なときにゲームをコーディングしているところです。衝突検出を入れる時間になると、プログラムが、使用している静止スプライトのサイズに応じてオブジェクトが左上に移動したかのように衝突を検出するという厄介なバグに遭遇しました。これを、通常はそのサイズの約半分でテストします。コードにバグが何であるかを見つけることができないようですが、おそらくあなたは見つけることができます。よろしくお願いします。私のコードは以下のとおりです。

#include <SFML/Graphics.hpp>
#include <math.h>

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2);
bool collide_point(sf::Vector2f point, sf::Sprite object);
void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& sationary);

void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& stationary)
{
//Handle Collision NOTE: Results in infinate loop if started on colliding object
for(;collide_rec(movable, stationary);)
{
if((movable_data.move.spd.x<0)||(movable_data.move.left==true||movable_data.direction==LEFT )) movable.Move( 1, 0);
if((movable_data.move.spd.x>0)||(movable_data.move.right==true||movable_data.direction==RIGHT)) movable.Move(-1, 0);
if((movable_data.move.spd.y<0)||(movable_data.move.up   ==true||movable_data.direction==UP   )) movable.Move(0,  1);
if((movable_data.move.spd.y>0)||(movable_data.move.down ==true||movable_data.direction==DOWN )) movable.Move(0, -1);
  }
}

bool collide_point(sf::Vector2f point, sf::Sprite object)
{

}

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2)
{
  bool hit=true;
  sf::Vector2f tl_1, br_1, tl_2, br_2;//Top-Left Coner, Botom Right Corner

  //Assign the corners proporly
  tl_1= object_1.GetPosition();
  tl_2= object_2.GetPosition();

   br_1= (object_1.GetPosition()+object_1.GetSize());
   br_2= (object_2.GetPosition()+object_2.GetSize());

  if((tl_1.x<tl_2.x)&&(br_1.x<tl_2.x) || (tl_1.x<br_2.x)&&(br_1.x<br_2.x)) //if both points are to the left or right on the x demtion
  hit=false;

  if((tl_1.y<tl_2.y)&&(br_1.y<tl_2.y) || (tl_1.y<br_2.y)&&(br_1.y<br_2.y)) //if both points are to the left or right on the y demtion
  hit=false;

  return hit;
}
4

1 に答える 1

0

これに対する答えがまだ必要かどうかはわかりませんが、私は助けてみたほうがいいかもしれません。

確認したいことがいくつかあります。-object_1.getPosition()とobject_2の位置がオブジェクトの左上隅であるかどうか。-オブジェクトが正方形でない場合、計算するには右下隅にわずかに異なる方程式が必要になります。(x、y)座標の場合は(Pos.x + Width、Pos.y + Height)になります。

それを確信したら、ヒット検出アルゴリズムで私が気付いたことがいくつかあります。

1)

if((tl_1.x<tl_2.x)&&(br_1.x<tl_2.x) || (tl_1.x<br_2.x)&&(br_1.x<br_2.x))

この状態の2番目の部分:

(tl_1.x < br_2.x)&&(br_1.x < br_2.x))

あるべきだと思われる

(tl_1.x > br_2.x)&&(br_1.x > br_2.x))

2)

同じく:

(tl_1.y < tl_2.y)&&(br_1.y < tl_2.y) 

あるべきだと思われる

(tl_1.y > tl_2.y)&&(br_1.y > tl_2.y)

3)

最後に、条件にはある程度の冗長性がありますが、これは不要です。

topLeft1、BottomRight1、topLeft2、BottomRight2を取得したら、次のように衝突を簡単にチェックできます。

原点(0、0)が左下にあるデカルト座標系を想定しています。

  • Xステージ衝突:

    if(topLeft1.x> BottomRight2.x || BottomRight1.x <TopLeft2.x)

//box1の左側>box2の右側の場合または//box1の右側<box2の左側の場合-ボックスX軸上で衝突しません。

  • Yステージ衝突:

    if(topLeft1.y <BottomRight2.y || BottomRight1.y> TopLeft2.y)

//box1の上面<box2の底面の場合または// box1の底面>box2の上面の場合-ボックスはY軸上で衝突しません。

これにより、8つの条件から4つの条件に減少します。お役に立てば幸いです。

于 2012-10-30T04:37:43.967 に答える