- PVSM.RU - https://www.pvsm.ru -
Написание игры — сложный и интересный процесс, который требует много времени. В данном цикле статей я расскажу, как создать простую 3D игру на Java с использование библиотеки LWJGL.
Для создания своей игры необходимо следующее:
Кому интересно, прошу под кат.
Скачать LWJGL 2.9.3 [2], библиотеку 3D графики, добавить [3] её в свой проект.
Скачать slick-util [4], библиотеку, упрощающую загрузку текстур, добавить её в проект.
Первым делом создадим класс Main в пакете main, поместим в него следующий код:
Если строка с input не подсвечивается красным — значит всё ок (на скрине подсвечивается желтым, т.к. данная библиотека ещё не используется в коде).
Наполним класс Main следующим кодом:
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class Main {
static int width = 800, height = 600;
static DisplayMode mainDisplayMode = new DisplayMode(width, height);
static boolean running = true;
static void update() {
if (Display.wasResized()) {
width = Display.getWidth();
height = Display.getHeight();
}
Display.update();
Display.sync(60);
if (Display.isCloseRequested()) {
running = false;
}
}
public static void main(String[] args) {
try {
Display.setLocation(
(Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2,
Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2);
Display.setResizable(true);
Display.setVSyncEnabled(true);
Display.setDisplayMode(mainDisplayMode);
Display.create();
} catch (LWJGLException ex) {
System.err.println(ex.getStackTrace().toString());
Display.destroy();
System.exit(1);
}
while (running) {
update();
}
Display.destroy();
System.exit(0);
}
}
Итак, что здесь происходит:
Display.setLocation(
(Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2);
Display.setResizable(true);
Display.setVSyncEnabled(true);
Display.setDisplayMode(mainDisplayMode);
Display.create();
В этих строчках:
static void update() {
if (Display.wasResized()) {
width = Display.getWidth();
height = Display.getHeight();
}
Display.update();
Display.sync(60);
if (Display.isCloseRequested()) {
running = false;
}
}
В функции update, которая вызывается в бесконечном цикле:
Заметьте, как происходит окончание работы программы, когда пользователь нажал на крестик, флаг закрытия окна, Display.isCloseRequested(), становится true, а переменная running становится false, и при следующей итерации цикл while(running) не выполнится и произойдёт переход к строчкам Display.destroy(), которая уничтожит дисплей и System.exit(0), вызов которой завершит программу.
Чтобы инициализировать OpenGL в функцию main перед циклом while(running) нужно добавить следующий код:
if (!GLContext.getCapabilities().OpenGL33) {
System.err.println("Ваша видеокарта не поддерживает OpenGL 3.3.");
System.exit(0);
}
Данный код проверяет, что видеокарта поддерживает OpenGL 3.3, если видеокарта не поддерживает данную версию, попробуйте обновить драйвера или переключиться на другую видеокарту (если у Вас их более одной).
Итак, проверка сделана, если всё хорошо, видеокарта поддерживает OpenGL 3.3, то двигаемся дальше. После кода проверки, до цикла добавим следующий код:
glShadeModel(GL_SMOOTH);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glClearColor(1f, 0f, 0f, 1f);
Данный код настроит OpenGL следующим образом:
В цикл while(running), до вызова функции update(), добавим строчку
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Которая будет очищать буфер цвета и буфер глубины при каждом обновлении экрана.
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
import static org.lwjgl.opengl.GL11.GL_SMOOTH;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glShadeModel;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GLContext;
public class Main {
static int width = 800, height = 600;
static DisplayMode mainDisplayMode = new DisplayMode(width, height);
static boolean running = true;
static void update() {
if (Display.wasResized()) {
width = Display.getWidth();
height = Display.getHeight();
}
Display.update();
Display.sync(60);
if (Display.isCloseRequested()) {
running = false;
}
}
public static void main(String[] args) {
try {
Display.setLocation((Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2);
Display.setResizable(true);
Display.setVSyncEnabled(true);
Display.setDisplayMode(mainDisplayMode);
Display.create();
} catch (LWJGLException ex) {
System.err.println(ex.getStackTrace().toString());
Display.destroy();
System.exit(1);
}
if (!GLContext.getCapabilities().OpenGL33) {
System.err.println("Ваша видеокарта не поддерживает OpenGL 3.3.");
System.exit(0);
}
glShadeModel(GL_SMOOTH);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glClearColor(1f, 0f, 0f, 1f);
while (running) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
update();
}
Display.destroy();
System.exit(0);
}
}
На этом я завершаю первую статью по написанию игры на LWJGL, если в опросе будет больше 50% положительных ответов, я продолжу написание цикла статей.
Автор: RigelGL
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/297242
Ссылки в тексте:
[1] Как установить Eclipse: https://vertex-academy.com/tutorials/ru/ustanovka-zapusk-eclipse/
[2] LWJGL 2.9.3: https://sourceforge.net/projects/java-game-lib/files/Official%20Releases/LWJGL%202.9.3/
[3] добавить: http://basehomesite.ucoz.ru/forum/15-22-1
[4] slick-util: http://slick.ninjacave.com/slick-util/
[5] Источник: https://habr.com/post/427979/?utm_source=habrahabr&utm_medium=rss&utm_campaign=427979
Нажмите здесь для печати.