Как правильно рисовать из плитки, установленной на полотне JavaFX, принимая во внимание Retina (и подобные) дисплеи?

Я делаю простую игру на основе плитки в JavaFX. Плитки 32×32 пикселей, и различные плитки выложены в сетке в изображении листа плитки (который загружен в памяти как объект JavaFXImage). Я рисую карту на объекте JavaFXCanvas, и для рисования плитки я использую GraphicsContext.drawImageметод, указывая исходную область 32×32 в листе плитки Imageи целевую область 32×32 на Canvas. Это все очень стандартный смотреть.

К сожалению, это приводит к неправильным результатам на моем Mac, из-за экрана Retina. Кажется, что JavaFX делает некоторые преобразования к изображению, чтобы отобразить его в «правильном» разрешении. У меня не обязательно есть проблема с этим; однако при выполнении этого преобразования, это выборка из неправильных пикселей в исходном изображении. Например, если я нарисую первую плитку, которая занимает пиксели в первых 32 строках и столбцах изображения набора плиток, JavaFX на самом деле будет пробовать пиксели в строке и столбцах 33 в любом преобразовании, которое он делает. Так, например, моя первая плитка-океан (и в основном синий), а моя вторая плитка-пустыня (и в основном желтый), но все плитки океана рисуются с желтой полосой на их правой стороне, так как JavaFX пробует от плитки пустыни, чтобы нарисовать океан. (Этот желтый цвет также не является желтым в исходном изображении: он был смешан с синим несколько.)

Я знаю два метода решения этой проблемы:

  1. Отрисовка изображений вручную с помощью PixelReaderand PixelWriter(см. здесь ). Это определенно не правильный способ делать вещи!

  2. Поместите каждую плитку в свой собственный Imageобъект. Это возможное решение, но немного раздражает, когда есть сотни плиток, чтобы отслеживать.

Итак, мой вопрос: Как правильно это сделать? То есть, если у вас есть растровое изображение, как можно нарисовать некоторую область его на JavaFX GrahpicsContextтак, чтобы только пиксели в этой области влияли на то, что рисуется?

1 ответ

  1. На самом деле ответ, который я дал по ссылке, которую вы процитировали выше, содержит всю информацию, которая вам нужна. Я не хочу повторяться, но лучшее, что вы могли бы сделать, это предоставить свою карту с более высоким разрешением, чтобы у вас были плитки 64×64, которые вы можете нарисовать на холсте 32×32.