Я написал несколько игр, используя JPanel
. Обычно я использую JPanel
, как будто я использую Canvas
, то есть я рисую прямо на нем, переопределяя метод paint()
. Причина, по которой я использую JPanel
, заключается в том, что я могу определить размер игрового мира, а затем использовать setPreferredSize()
, чтобы установить размер панели. Затем я добавляю панель к JScrollPane
. Так что это позаботится о панорамировании и т. Д.
Скажем, я пишу 2D-игру. Вот как я использую JPanel. У меня есть логическая карта (2D-массив), которая содержит мою игровую карту. Скажем, каждое местоположение 32x32 пикселей. Итак, вы начинаете рисовать землю и то, что находится на этой земле в этом месте. например, при x = 1, y = 2, который является местоположением экрана x = 32, y = 64, сначала вы рисуете землю, а затем рисуете то, что на земле. Таким образом, грубый контур цикла рендеринга будет выглядеть примерно так:
for (int y = 0; y < map.length; y++)
for (int x = 0; x < map[y].length; x++) {
drawGround(map[y][x])
for very element on on map[y][x] - render them
}
Вы устанавливаете MouseListener
слушателя для JPanel, поэтому каждый щелчок мышью вы переводите обратно на карту, например. щелчок мыши x = 54, y = 72 будет соответствовать x = 1, y = 2. Вычисление немного сложнее, если у вас есть изометрическая проекция.
Здесь вы должны быть осторожны, так как каждый раз, когда вы прокручиваете панель через панель прокрутки, вызывается paint()
. Так что хорошо сделать вашу игровую доску на BufferedImage
, а затем в методе paint()
просто нарисуйте BufferedImage
, иначе это будет слишком медленно.