私は 2D ゲームを作成していますが、空想的なものではなく、オブジェクト (以降エンティティと呼びます) が互いに衝突し、地形と衝突する必要があります。さて、衝突を検出することは問題ではありません。問題は、エンティティが地形と衝突するときです。
私は単純な .png を持っています。ゲームをロードすると、この画像のすべてのピクセルを調べて、すべての黒いピクセルをリストに追加します。これらは衝突可能なピクセルです。
Entity-class からの衝突コード:
int ceiling = Integer.MAX_VALUE;
int floor = 0;
int rightPoint = 0;
int leftPoint = Integer.MAX_VALUE;
for(Point p : main.terrain.points)
if(getHypoRect().contains(p))
{
if(p.x > rightPoint && right)
rightPoint = p.x;
if(p.x < leftPoint && left)
leftPoint = p.x;
if(p.y < ceiling && up)
ceiling = p.y;
if(p.y > floor && down)
floor = p.y;
}
if(rightPoint != 0)
xCoord = rightPoint - sprite.getImage().getWidth();
else if(right)
xCoord+=speed;
if(leftPoint != Integer.MAX_VALUE)
xCoord = leftPoint;
else if(left)
xCoord-=speed;
if(ceiling != Integer.MAX_VALUE)
yCoord = ceiling;
else if(up)
yCoord-=speed;
if(floor != 0)
yCoord = floor - sprite.getImage().getHeight();
else if(down)
yCoord+=speed;
for ループでは、地形内のすべてのポイント (黒いピクセル) を調べてから、エンティティのコリジョン ボックスにそれらが含まれているかどうかを確認します (このメソッドでは速度が追加されるか、「仮想的に」追加されるため、奇妙な名前が付けられています)。ここで、ポイントの x 値が「rightpoint」よりも大きく、エンティティが右に歩いている場合は上書きされます。leftPoint (「左端」の点)、天井、床についても同じことが起こります。次に、これらのポイントのいずれかが変更されているかどうかを確認します。変更されている場合は、地形と衝突したことを意味するため、それらを跳ね返します。たとえば、エンティティが右に歩いていて、地形に衝突したとします。rightPoint は「一番右」で書かれています。
一度に一方向にしか進まない場合、これは完全に機能しますが、複数の入力を考慮すると「奇妙な」ことが起こります。
例: エンティティは、床に平らに、右側の棚に向かって歩きます。エンティティが棚の途中にあるとき、下に行きたいので、右と下の両方が押されます。私のコードが行うことは、入力をチェックすることです、エンティティを配置したい場所に置き、地形に当たった場合は跳ね返すので、右を押してエンティティを棚の端に跳ね返すことがわかります。
これはすべて、地形衝突がどのように機能するかについての私自身の考えです。衝突が発生したかどうかを確認する方法を除いて、オンラインで何も見つけることができませんでしたが、これをカバーするものはありません. 私のソリューションが機能する理由、または地形衝突をどのように行うべきかへのポインタはありますか?