2

特にプレイヤーが壁の後ろにいる場合に、オブジェクトをレンダリングする順序を決定する際に特有の問題が発生します。しっかりと説明しようと思いますので、たくさんの情報を用意してください。

私は物事を前から後ろにレンダリングします (ここで推奨されているように: Drawing Isometric game worlds )。これは、ほとんどの場合、十分に単純です。単純なコンパレーターを使用して、後ろにあるものを判別します。

private Comparator<Entity> spriteSorter = new Comparator<Entity>(){
    public int compare(Entity e1, Entity e2){
        if(e1.getPhysics().getY() > e2.getPhysics().getY()) return 1;
        if(e1.getPhysics().getY() < e2.getPhysics().getY())return -1;
        return 0;
    }
};

これは、エンティティのヒットボックスを使用してレンダリング順序を決定し、長方形のヒットボックスを持つエンティティに対して問題なく機能します (ほとんどすべてのキャラクターがそうであるように)。実際の描画呼び出しは次のようになります。

ArrayList<Entity> spriteList = new ArrayList<>();
    spriteList.add(player);

    for(int i = 0; i < walls.size(); i++){
        spriteList.add(walls.get(i));
    }

    Collections.sort(spriteList, spriteSorter);
        for(int i = 0; i < spriteList.size(); i++){
        spriteList.get(i).render(g);
    }

ただし、ここで問題が発生します。私のすべてのキャラクターは Rectangle のインスタンスを使用し、それらの順序付けはまったく問題なく機能しますが、私の壁 (アイソメトリック ゲームの性質により) は長方形を使用できないため、Polygon を使用します。サイズに適合します。写真を参照してください:これは、プレイヤーと壁の当たり判定がどのように見えるかです。

Polygon を使用する必要があるのは、長方形を使用すると、次のように壁の近くに愚かな通行不能スペースができるためです。 バカ。

残念ながら、ポリゴンの性質上、プレイヤーが壁の前にいるか後ろにいるかをすぐに確認できるテストはありません。ライン 3 はテストとして有力な候補のようですが、壁の両側に 2 つの三角形があり、壁のplayer.getPhysics.getY() > wall.getPhysics.getY()前と後ろの両方にいる可能性がある場合に、テストに合格し、彼を前にマークします。

グル

では、彼が対角線の後ろにいるときを教えてくれるテストをどのように考案すればよいでしょうか? Java の Shapes と Polygons の性質により、私はかなり制限されているようですが、それを行う方法があると確信しています。私はポイントでたくさん遊んで、getCenterY() はかなり近づいてきましたが、まだ完全ではありません。私が試したすべての方法で発生する問題のケースは次のようになります。

実際には後ろに、前にレンダリング実際には後ろに、前にレンダリング

またはこれ:

実際は前、後ろにレンダリング実際には前に、後ろにレンダリングされます。

アイデアはありますか?

4

2 に答える 2

2

キャラクターが (x, y) にあり、壁に (a, b) から (c, d) に向かう中心線があるとします。次に、行列式の符号を使用できます

| x a c |
| y b d | = ab + ad + cy - ay - cb - xd
| 1 1 1 |

これらの 3 点によって形成される三角形が時計回りか反時計回りかを決定します。キャラクターの代わりにカメラの同様の行列式を計算し、結果を掛けることができます。積がの場合、カメラとキャラクターが壁の同じ側にあり、キャラクター壁の後ろに描きたいとします。積がマイナスの場合、カメラとキャラクターが反対側にあり、キャラクターを壁のに描きたいとします。

この簡略化では、壁が回転した長方形ではなく、線または線分であると想定していますが、プレーヤーが実際に壁の内側を移動できない限り、カメラが壁の短辺に正面から向いていない限り、違いは問題になりません。したがって、大まかな順序付けを行うために、結局、壁に大きな長方形のバウンディング ボックスが必要であり、プレイヤーがこの (まだ通過可能な) バウンディング ボックス内にいる場合にのみ上記を使用する必要があります。

于 2013-02-04T15:46:01.197 に答える