Я делаю простую игру на основе плитки в JavaFX. Плитки 32×32 пикселей, и различные плитки выложены в сетке в изображении листа плитки (который загружен в памяти как объект JavaFXImage
). Я рисую карту на объекте JavaFXCanvas
, и для рисования плитки я использую GraphicsContext.drawImage
метод, указывая исходную область 32×32 в листе плитки Image
и целевую область 32×32 на Canvas
. Это все очень стандартный смотреть.
К сожалению, это приводит к неправильным результатам на моем Mac, из-за экрана Retina. Кажется, что JavaFX делает некоторые преобразования к изображению, чтобы отобразить его в «правильном» разрешении. У меня не обязательно есть проблема с этим; однако при выполнении этого преобразования, это выборка из неправильных пикселей в исходном изображении. Например, если я нарисую первую плитку, которая занимает пиксели в первых 32 строках и столбцах изображения набора плиток, JavaFX на самом деле будет пробовать пиксели в строке и столбцах 33 в любом преобразовании, которое он делает. Так, например, моя первая плитка-океан (и в основном синий), а моя вторая плитка-пустыня (и в основном желтый), но все плитки океана рисуются с желтой полосой на их правой стороне, так как JavaFX пробует от плитки пустыни, чтобы нарисовать океан. (Этот желтый цвет также не является желтым в исходном изображении: он был смешан с синим несколько.)
Я знаю два метода решения этой проблемы:
Отрисовка изображений вручную с помощью
PixelReader
andPixelWriter
(см. здесь ). Это определенно не правильный способ делать вещи!Поместите каждую плитку в свой собственный
Image
объект. Это возможное решение, но немного раздражает, когда есть сотни плиток, чтобы отслеживать.
Итак, мой вопрос: Как правильно это сделать? То есть, если у вас есть растровое изображение, как можно нарисовать некоторую область его на JavaFX GrahpicsContext
так, чтобы только пиксели в этой области влияли на то, что рисуется?
На самом деле ответ, который я дал по ссылке, которую вы процитировали выше, содержит всю информацию, которая вам нужна. Я не хочу повторяться, но лучшее, что вы могли бы сделать, это предоставить свою карту с более высоким разрешением, чтобы у вас были плитки 64×64, которые вы можете нарисовать на холсте 32×32.