オブジェクトに衝突を与える必要があるゲームを作成していますが、多くの高速で小さなオブジェクトがあり、通常の衝突アルゴリズム (形状の交差など) が機能しません。交差点。
そのため、オブジェクトの最後の位置を保存することに基づいて、独自の衝突アルゴリズムの構築を開始しました (既に存在している可能性がありますが、どこにも表示されませんでした)。
次の画像をご覧ください。
このアイデアは、画像のフレーム 1 と 2 で示されています。基本的に、最後の長方形の左側と新しい長方形の右側の間に壁があるかどうかを確認することで、衝突をチェックしている間ゾーンをスキップすることはなく、壁をスキップするリスクはありません (そう思った)。
これはアルゴリズムのコードです:
private void bounce(GameElement b, Terrain t)
{
Rectangle tR = t.getRectangle();
int tRleft = tR.x;
int tRright = tR.x+tR.width;
int tRup = tR.y;
int tRdown = tR.y+tR.height;
Rectangle bRnow = b.getRectangle();
int bRnowLeft = bRnow.x;
int bRnowRight = bRnow.x+bRnow.width;
int bRnowUp = bRnow.y;
int bRnowDown = bRnow.y+bRnow.height;
Rectangle bRlast = b.getRectangleLast();
int bRlastLeft = bRlast.x;
int bRlastRight = bRlast.x+bRlast.width;
int bRlastUp = bRlast.y;
int bRlastDown = bRlast.y+bRlast.height;
boolean leftRight = false, rightLeft=false, upDown=false, downUp=false;
boolean betweenX = false, betweenY = false;
if(bRnow.x>bRlast.x)leftRight=true;
if(bRnow.x<bRlast.x)rightLeft=true;
if(bRnow.y>bRlast.y)upDown=true;
if(bRnow.y<bRlast.y)downUp=true;
if(bRlastRight>tRleft && bRlastLeft<tRright) betweenX = true;
if(bRlastDown>tRup && bRlastUp<tRdown) betweenY=true;
if(leftRight)
if((tRleft>bRnowLeft || tRleft>bRlastLeft) && tRleft<bRnowRight && betweenY)
{
b.setX(tR.x-bRnow.width - 1);
}
if(rightLeft)
if((tRright<bRnowRight || tRright<bRlastRight) && tRright>bRnowLeft && betweenY)
{
b.setX(tR.x+tR.width + 1);
}
if(upDown)
if((tRup>bRnowUp || tRup>bRlastUp) && tRup<bRnowDown && betweenX)
{
b.setY(tR.y-bRnow.height - 1);
}
if(downUp)
if((tRdown<bRnowDown || tRdown<bRlastDown) && tRdown>bRnowUp && betweenX)
{
b.setY(tR.y+tR.height + 1);
}
}
実際には組織化されていないため、バウンスと呼ばれます。より一般化され、実用的になるように、アルゴリズムを構造化する方法を考える必要があります (それについても助けていただければ幸いです)。
FASTオブジェクトはまだ対角線を通過するため、衝突を行うこの方法には、画像3に見られる現時点で1つのバグがあります(円を描いて申し訳ありません。正方形である必要があります):/一方、壁への直接ヒットはかなりきれいです.
このアルゴリズムを改善、最適化、整理するにはどうすればよいですか? それとも、より良いアルゴリズムがあり、無駄に考えすぎているだけですか? 私はあなたの助けに感謝します。