5

私は最初のJavaゲームを書いていますが、これまでのところ:

WSAD で歩き回れる四角形を作成しました。彼は常にマウスが指している方向を向いています。また、クリックすると、マウスが指している場所に弾丸が発射されます (弾丸はその方向に回転します)。私はあなたの周りを追いかける敵も作りました.彼らはあなたのキャラクターに向かって回転します. 私が抱えている問題は、私が書いた衝突検出が、回転する前のオブジェクト (キャラクター、敵、弾丸) の衝突のみを検出することです (.intersects() を使用)。これは、描画時に体の一部が重なることを意味します。

私は周りを見回してきましたが、自分の状況に理解できる、または適用できる解決策が見つかりませんでした。これまで、各オブジェクトの Graphics2D グリッドを回転させてきたので、実際には回転しているのではなく、引き出されているだけです。実際に形状を回転させてから .intersects() のようなものを使用する方法はありますか?

ヘルプや提案をいただければ幸いです。

x軸上を移動して衝突するかどうかを確認するために使用するものは次のとおりです。

public boolean detectCollisionX(int id, double xMove, double rectXco, double rectYco, int width, int height)
{
    boolean valid=true;
    //create the shape of the object that is moving.
    Rectangle enemyRectangleX=new Rectangle((int)(rectXco+xMove)-enemySpacing,(int)rectYco-enemySpacing,width+enemySpacing*2,height+enemySpacing*2);
    if (rectXco+xMove<0 || rectXco+xMove>(areaWidth-width))
    {
        valid=false;
    }
    if(enemyNumber>0)
    {
        for (int x=0; x<=enemyNumber; x++)
        {
            if (x!=id)
            {
                //enemies and other collidable objects will be stored in collisionObjects[x] as rectangles.
                if (enemyRectangleX.intersects(collisionObjects[x])==true)
                {
                    valid=false;
                }
            }
        }
    }
    return valid;
}
4

1 に答える 1

5

オブジェクトのタイプがAreaの場合は、おそらくAffineTransformクラスを使用してさまざまなオブジェクトを回転させることができます。

2つのオブジェクトaとbがあると仮定すると、次のようにそれらを回転させることができます。

  AffineTransform af = new AffineTransform();
  af.rotate(Math.PI/4, ax, ay);//rotate 45 degrees around ax, ay

  AffineTransform bf = new AffineTransform();
  bf.rotate(Math.PI/4, bx, by);//rotate 45 degrees around bx, by

  ra = a.createTransformedArea(af);//ra is the rotated a, a is unchanged
  rb = b.createTransformedArea(bf);//rb is the rotated b, b is unchanged

  if(ra.intersects(rb)){
    //true if intersected after rotation
  }

そして、それがあなたが望むものである場合に備えて、あなたは元のオブジェクトを持っています。AffineTransformを使用すると、変換を組み合わせたり、変換を逆にしたりするのが簡単になります。

于 2011-05-08T05:04:48.597 に答える