2014-12-08 2 views
0

В настоящее время у меня есть JFrame, который всегда установлен на полноэкранный режим, JPanel с разрешением, которое можно изменить, и BufferedImage, который нарисован на JPanel и является фиксированным разрешением моей игры. Я чувствую, что это очень неэффективно, так как может быть как три разных разрешения: полноэкранный режим, используемый для JFrame, являющийся разрешением экрана, пользовательское разрешение для JPanel, установленное пользователем, и разрешение игры могут отличаться от того, где я буду изменять размер дважды перед рисованием.Кадр Java для отображения в полноэкранном режиме?

Как современные игры, такие как Battlefield, позволяют вам изменять разрешение, они всегда полноэкранные, и они не просто изменяют размер в окне, когда изменяются, поскольку у меня есть двойной экран с одним телевизором, и на самом деле это меня изменило разрешение из-за изменения разрешения игры, хотя мой телевизор может принимать максимум 1920 x 1080, но он по-прежнему полноэкранный? Все, что мне нужно - это рисовать пиксели, мне даже не нужно добавлять кнопки из качания или что-то в этом роде, я сделаю это сам. Моя игра всегда должна быть полноэкранной. Я делаю свою игру, и мне очень нравится использовать JFrame и JPanel, но я действительно хочу переключиться на что-то еще, если это более эффективно. Как вы думаете, что я могу сделать?

ответ

0

Rendering к BufferedImage из фиксированных размера несколько побеждает se, если вы явно не указали хотите масштабирование (например, потому что вы не можете сделать полный res достаточно быстро).

Все, что вам нужно сделать, это изменить размер заднего буфера при изменении размера кадра (и визуализации в нем в соответствии с его текущим размером, конечно).

Вы можете легко обнаружить изменения, используя либо WindowListener, прикрепленный к JFrame, либо ComponentListener, прикрепленный к содержащейся панели. Для гибкости я лично предпочел бы ComponentListener на панели, потому что это позволяет вам использовать одну и ту же панель и прослушиватель для оконного или полноэкранного режима. Будьте осторожны, хотя слушатель будет вызываться в потоке отправки событий Swing, поэтому в зависимости от архитектуры потоковой передачи вашей игры вам может понадобиться некоторая синхронизация потоков для безопасного обмена информацией.

0

Как игры, подобные битве, делают это с 3D-координатами мира, которые не зависят от разрешения экрана с использованием OpenGL или DirectX. Разработчики подают мировые координаты в механизм рендеринга, который затем преобразует в координаты экрана. Это делается с учетом текущего разрешения экрана. Вы заметите, что размер HUD изменится в зависимости от вашего выбора разрешения. Это связано с тем, что HUD обычно представляет собой двумерную конструкцию, привязанную непосредственно к координатам экрана. Если вы хотите сделать 3D-материал, я бы порекомендовал LWJGL. Ваш единственный вариант с Swing - изучить использование AffineTransform для масштабирования вашего дисплея. Однако это неэффективно по сравнению с 3D и может быть медленнее, чем вы хотели бы.

+0

Я говорю только о том, как они создали полноэкранное окно для игры, а не на самом деле игрового контента и частей рендеринга. Просто, как они настроили фрейм, я знаю, что они используют какой-то язык Microsoft C, но как бы это было на Java – Monad

+0

Не так уж и отличается от того, что вам нужно делать на Java. Вы обнаруживаете доступные режимы отображения и позволяете пользователю выбирать. Затем они прикрепляют 3D-контекст к поверхности и отправляются в город. – markbernard

Смежные вопросы