メインゲームスプライトとさまざまなプラットフォームの間にAABBを使用して、単純な衝突検出ルーチンを実装しました(以下のコードを参照してください)。それは素晴らしい働きをしますが、私は今、私のキャラクターを倒すために重力を導入しています、そしてそれは私のCDルーチンでいくつかの問題を示しています。
問題の核心は、私のCDルーチンがスプライトを他のスプライトにほとんど浸透していない軸に沿って戻すことです。したがって、XよりY軸の方が大きい場合は、X軸に沿って移動します。
しかし、今私の(ヒーロー)スプライトはフレームあたり30ピクセルの速度で落ちています(それは1504の高画面です-「通常の」重力をシミュレートしたいので、これだけ速く落ちる必要があります。 )これらの問題が発生しています。私は何が起こっているのか(そして私がそれを引き起こしていると考えていること-よくわかりません)をいくつかの写真で示します(写真の下のコード)。
この問題を回避する方法についていくつかの提案をいただければ幸いです。
明確にするために、上の右の図で、位置が「誤って」修正されていると言うと、少し誤解を招く可能性があります。コード自体は、それがどのように書かれているのか、つまり別の言い方をすると、アルゴリズム自体が正しく機能します。期待どおりに動作する場合はアルゴリズム自体ですが、この問題の発生を防ぐために動作を変更する必要があります。画像内のコメントを明確にしてください。
私のコード
public boolean heroWithPlatforms(){
//Set Hero center for this frame
heroCenterX = hero.xScreen+(hero.quadWidth/2);
heroCenterY = hero.yScreen+(hero.quadHeight/2);
//Iterate through all platforms to check for collisions
for(x=0;x<platformCoords.length;x+=2){
//Set platform Center for this iteration
platformCenterX = platformCoords[x]+(platforms.quadWidth/2);
platformCenterY = platformCoords[x+1]+(platforms.quadHeight/2);
// the Dif variables are the difference (absolute value)
// of the center of the two sprites being compared (one for X axis difference
//and on for the Y axis difference)
difX = Math.abs(heroCenterX-platformCenterX);
difY = Math.abs(heroCenterY-platformCenterY);
//If 1
//Check the difference between the 2 centers and compare it to the vector (the sum of
//the two sprite's widths/2. If it is smaller, then the sprites are pverlapping along
//the X axis and we can now proceed to check the Y axis
if (difX<vecXPlatform){
//If 2
//Same as above but for the Y axis, if this is also true, then we have a collision
if(difY<vecYPlatform){
//we now know sprites are colliding, so we now need to know exactly by how much
//penX will hold the value equal to the amount one sprite (hero, in this case)
//has overlapped with the other sprite (the platform)
penX = vecXPlatform-difX;
penY = vecYPlatform-difY;
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite
//back on the X Axis
if (penX < penY){hero.xScreen-=penX*(heroCenterX-platformCenterX>=0 ? -1 : 1);}
//Sprite has penetrated into the other, mostly in the X asis, so move sprite
//back on the Y Axis
else if (penY < penX) {hero.yScreen-=penY*(heroCenterY-platformCenterY>=0 ? -1 : 1);}
return true;
}//Close 'If' 2
} //Close 'If' 1
}
//Otherwise, no collision
return false;
}
//One sprite has penetrated into the other, mostly in the Y axis, so move sprite //back on the X Axis