特にプレイヤーが壁の後ろにいる場合に、オブジェクトをレンダリングする順序を決定する際に特有の問題が発生します。しっかりと説明しようと思いますので、たくさんの情報を用意してください。
私は物事を前から後ろにレンダリングします (ここで推奨されているように: 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() はかなり近づいてきましたが、まだ完全ではありません。私が試したすべての方法で発生する問題のケースは次のようになります。
実際には後ろに、前にレンダリング
またはこれ:
実際には前に、後ろにレンダリングされます。
アイデアはありますか?