3

私は小さなプログラムを書いて、実装すると小さな正方形が大きな長方形を通過するのを止めました。

関数が呼び出されると、collision()形状が衝突しているかどうかがチェックされます。現在、次のことを行っています。

  • 四角がup形に向かって動いているときは通り抜けません。(そうあるべきように)
  • 正方形が動いているときはdown、形に向かって、通り抜けません。(そうあるべきように)
  • 移動時right、形状の方は通り抜けません。(ただし、キーを 1 回押すと上に移動します)
  • 移動時left、形状の方は通り抜けません。(ただし、キーを 1 回押すと左に移動し、キーを 1 回押すと上に移動します) (写真を参照)

グリッチ

これが私のcollision()機能です:

if     (sprite_Bottom +y_Vel <= plat_Top    ){return false;}
else if(sprite_Top    +y_Vel >= plat_Bottom ){return false;}
else if(sprite_Right  +x_Vel <= plat_Left   ){return false;}
else if(sprite_Left   +x_Vel >= plat_Right  ){return false;}
//If any sides from A aren't touching B
return true;

これが私のmove()機能です:

   if(check_collision(sprite,platform1) || check_collision(sprite,platform2)){ //if colliding...
    if     (downKeyPressed ){ y_Vel += speed; downKeyPressed  = false;} //going down
    else if(upKeyPressed   ){ y_Vel -= speed; upKeyPressed    = false;} //going up
    else if(rightKeyPressed){ x_Vel -= speed; rightKeyPressed = false;} //going right
    else if(leftKeyPressed ){ x_Vel += speed; leftKeyPressed  = false;} //going left
   }
   glTranslatef(sprite.x+x_Vel, sprite.y+y_Vel, 0.0); //moves by translating sqaure

と の衝突がleftrightと同じように機能するようにupdownます。私のコードは各方向に同じロジックを使用しているため、なぜこれを行うのかわかりません...

4

2 に答える 2

0

最初にスプライトの角の衝突を確認する必要があると思います。そして、プラットフォームがスプライトよりも厚い場合、それ以上のチェックは必要ありません。それ以外の場合は、スプライトの各面がプラットフォームと衝突するかどうかを確認してください。

if ((plat_Bottom <= sprite_Bottom + y_Vel && sprite_Bottom  + y_Vel <= plat_Top)
    && (plat_Left <= sprite_Left + x_Vel && sprite_Left + x_Vel <= plat_Right))
    // then the left-bottom corner of the sprite is in the platform
    return true;

else if ... // do similar checking for other corners of the sprite.
else if ... // check whether each side of your sprite collides with the platform

return false;
于 2013-03-25T14:46:42.127 に答える
0

その理由は、衝突を確認した後、速度に速度を追加しているためと思われます。

コリジョン中に古いバージョンの速度をテストしているため、これは問題です。speed次に、スプ​​ライトを衝突させる速度に追加します。衝突後の速度に速度を追加する場合は、速度も衝突アルゴリズムに組み込む必要があります。

関数でこれを試してくださいcollision()

int xDelta = x_Vel + speed;
int yDelta = y_Vel + speed;

if     (sprite_Bottom +yDelta <= plat_Top    ){return false;}
else if(sprite_Top    +yDelta >= plat_Bottom ){return false;}
else if(sprite_Right  +xDelta <= plat_Left   ){return false;}
else if(sprite_Left   +xDelta >= plat_Right  ){return false;}

//If any sides from A aren't touching B
return true;
于 2013-03-25T14:54:00.147 に答える