私は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つの方法を知っている:手動で画像をレンダリング
を、
PixelReader
を使用し、PixelWriter
(here参照)。これは間違いなく正しいことです。各タイルを独自の
Image
オブジェクトに入れます。これは可能な解決策ですが、追跡する数百のタイルがある場合は少し面倒です。
私の質問です:これを行う正しい方法は何ですか?つまり、ビットマップイメージがある場合、JavaFX GrahpicsContext
にその領域を描画して、その領域のピクセルだけが描画されるイメージにどのように影響を与えることができますか?
返信いただきありがとうございます。私はこれがうまくいくと思いますが、実際にこれを行う正しい方法でもありません - もしRetinaのようなディスプレイを発明していて解像度がx2ではなくx3またはx4であるなら同じ問題が現れます。どのディスプレイでも動作するようにする方法があるはずです。 – Winnie
私はあなたが奇跡を待っていることを恐れる。ベクトルタイルを使用しない限り、これを処理する良い方法はありません。メモリが気にならない場合は、常に高解像度のタイルマップを使用して、現在のディスプレイに合わせて縮小することもできます。それはもちろん、あまりにもうまくいくはずです。 – mipa