2016-12-31 18 views
0

私はJavaFXでシンプルなタイルベースのゲームを作っています。タイルは32×32ピクセルで、さまざまなタイルはタイルシートイメージのグリッドに配置されます(JavaFX Imageオブジェクトとしてメモリにロードされます)。私はJavaFX Canvasオブジェクト上にマップを描画しています。GraphicsContext.drawImageメソッドを使用して、タイルシートImageのソース32x32領域とCanvasの宛先32x32領域を指定してタイルを描画しています。これはすべて標準的な見た目です。Retina(および同様の)ディスプレイを考慮して、JavaFX Canvas上のタイルセットから適切に描画する方法は?

Retina画面のため、残念ながら私のMacでは誤った結果が表示されます。 JavaFXは、イメージを「正しい」解像度で表示するために、イメージにいくつかの変換を行っているようです。私は必ずしもこれに問題はない。しかし、この変換を行う際には、ソース画像の間違ったピクセルからサンプリングしています。たとえば、タイルセットイメージの最初の32行と縦列のピクセルを占める最初のタイルを描画すると、JavaFXは実際にどのような変換を行っても行と列33のピクセルをサンプリングします。たとえば、私の最初のタイルは海洋(そして主に青色)で、2番目のタイルは砂漠(そしてほとんど黄色)ですが、JavaFXは砂漠のタイルから海を描く。 (この黄色は、ソース画像で黄色ではない:それはやや青とブレンドされています。)

私はこの問題に対処するには、2つの方法を知っている:手動で画像をレンダリング

  1. を、PixelReaderを使用し、 PixelWriterhere参照)。これは間違いなく正しいことです。

  2. 各タイルを独自のImageオブジェクトに入れます。これは可能な解決策ですが、追跡する数百のタイルがある場合は少し面倒です。

私の質問です:これを行う正しい方法は何ですか?つまり、ビットマップイメージがある場合、JavaFX GrahpicsContextにその領域を描画して、その領域のピクセルだけが描画されるイメージにどのように影響を与えることができますか?

答えて

0

実際に上記のリンクで私が答えましたが、必要なすべての情報が含まれています。私は自分自身を繰り返したくはありませんが、おそらくできることは、32x32のキャンバス領域に描画できる64x64のタイルを持つように、マップを高解像度で提供することです。

+0

返信いただきありがとうございます。私はこれがうまくいくと思いますが、実際にこれを行う正しい方法でもありません - もしRetinaのようなディスプレイを発明していて解像度がx2ではなくx3またはx4であるなら同じ問題が現れます。どのディスプレイでも動作するようにする方法があるはずです。 – Winnie

+0

私はあなたが奇跡を待っていることを恐れる。ベクトルタイルを使用しない限り、これを処理する良い方法はありません。メモリが気にならない場合は、常に高解像度のタイルマップを使用して、現在のディスプレイに合わせて縮小することもできます。それはもちろん、あまりにもうまくいくはずです。 – mipa

関連する問題