0

「線」の長方形を作成します。これは、回転する「レーザーサイト」です

public Rectangle getLaserBox() {
    float lOriginX = (leon.getPosition().x + 0.27f);
    float lOriginY = (leon.getPosition().y + 0.7f);
    float lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 5f;
    float lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 5f;
    Rectangle laserBox = new Rectangle(lOriginX, lOriginY, lEndX, lEndY);
    return laserBox;
}

次に、長方形の重なりをチェックし、重なりが検出された場合は「レーザーサイト」スプライトを短くするメソッドがあります。今のところ、render メソッドで laserCol() メソッドを呼び出します (MVC を壊していることはわかっていますが、動作させようとしているだけです)。 LaserWidth は、レーザー スプライトの幅として適用されます。

private float laserWidth;

public void laserCol() {
    Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
    boolean laserIsCol = false;
    for (Tile t : world.getTiles()) {     //pulling in tiles as t, from world method getTiles()
        laserWidth = laserOrigin.dst(t.getPosition().x + 0.1f, t.getPosition().y + 0.7f);
        if (Intersector.overlapRectangles(getLaserBox(), t.getBounds())) {
            laserIsCol = true;
        }
    }
    if (laserIsCol) {
        for (Tile t : world.getTiles()) {     //pulling in tiles as t, from world method getTiles()
            laserWidth = laserOrigin.dst(t.getPosition().x, t.getPosition().y + t.getBounds().y);
        }
    }
    if (!laserIsCol) {
        laserWidth = 8f;
    }
}

しかし、スクリーンショットでわかるように、レーザーは短くなりません。私は他の例を見てきましたが、これを行うためのより良い方法を理解できないようです. ここに画像の説明を入力

コードに「thing」と呼ばれる単一のオブジェクトを追加した後、作成したスプライト バウンディング ボックスをチェックすることにしました。

ここに画像の説明を入力

その後、いくつかのコードを変更し、光線を使用しようとしていますが、ある程度動作するようになりましたが、希望するほど近くはありません。何か提案はありますか?

public Ray getLaserRay() {
    lOriginX = (leon.getPosition().x + 0.27f);
    lOriginY = (leon.getPosition().y + 0.7f);
    lEndX = lOriginX + (float)Math.cos((leonAimLaserSprite.getRotation())/57) * 10f;
    lEndY = lOriginY + (float)Math.sin((leonAimLaserSprite.getRotation())/57) * 10f;
    laserO = new Vector3(lOriginX, lOriginY, 0);
    laserD = new Vector3(lEndX, lEndY, 0);
    Ray laserRay = new Ray(laserO, laserD);
    return laserRay;
}


private float laserWidth;

public void laserCol() {
    Vector2 laserOrigin = new Vector2(leon.getPosition().x + 0.55f, leon.getPosition().y + 0.7f);
    boolean laserIsCol = false;
        if (Intersector.intersectRayBoundsFast(getLaserRay(), thing.getBB())) {
            laserIsCol = true;
        }
    if (laserIsCol) {
            laserWidth = laserOrigin.dst(thing.getPosition().x, thing.getPosition().y);
        }
    if (!laserIsCol) {
        laserWidth = 10f;
    }
}

ここに画像の説明を入力 ここに画像の説明を入力

衝突検出を機能させるために、2 つの線分を使用することになりました。レーザーサイト用に 1 つ、オブジェクト (敵) 用に 1 つ作成し、下部の x ポイントから上部の x ポイントまで延長しました。基本的に同じコードですが、libgdx のセグメント インターセクターを使用しました。

レーザーサイトで弾丸やダメージを発生させる方法を知っている人はいますか?

ここに画像の説明を入力

4

1 に答える 1

2

詳細情報がなくても推測できますが、リスト/配列内のすべてのタイルを使用して幅を計算していることが問題である可能性があると思います。代わりに、レーザーが衝突するタイルを使用して幅を計算する必要があります。

このようなもの:

laserWidth = 8f; //default if no collision is found
for (Tile t : world.getTiles()) {     //pulling in tiles as t, from world method getTiles()
    if (Intersector.overlapRectangles(getLaserBox(), t.getBounds())) {
        laserWidth = laserOrigin.dst(t.getPosition().x, t.getPosition().y + t.getBounds().y);
        break;
    }
}

私はちょうどあなたのコードを再利用したことに注意してください.これが正しいかどうか、または間違った計算があるかどうかはわかりません. コメントで述べたように、計算をデバッグして、どこで問題が発生し始めているかを確認する必要があります。

于 2013-02-14T16:08:09.590 に答える