Escrevendo um jogo no LWJGL

Criando um jogo no LWJGL # 1


Escrever um jogo é um processo complexo e interessante que leva muito tempo. Nesta série de artigos, mostrarei como criar um jogo Java 3D simples usando a biblioteca LWJGL.


Para criar seu jogo, você precisa do seguinte:


  • Capacidade de escrever código em Java (um mínimo necessário: entender a operação de condições, loops, strings, matrizes, funções, classes)
  • Ambiente de Desenvolvimento (usarei o Eclipse)
  • Biblioteca LWJGL
  • Placa de vídeo compatível com a versão OpengGL não inferior a 3,3
  • Tempo livre
  • Idéia

Quem se importa, por favor, debaixo do gato.

Etapa 1, Preparação


Como instalar o eclipse .

Faça o download do LWJGL 2.9.3 , uma biblioteca de gráficos 3D, adicione -o ao seu projeto.

Baixe o slick-util , uma biblioteca que simplifica o carregamento de texturas, adicione-a ao projeto.

Etapa dois, verifique


Primeiro, crie a classe Main no pacote principal e insira o seguinte código:



Se a linha com entrada não estiver destacada em vermelho, tudo estará correto (destacado em amarelo na tela, porque esta biblioteca ainda não está sendo usada no código).

Etapa três, exibição


Preencha a classe Main com o seguinte código:

Código inicial
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); } } 


Então, o que está acontecendo aqui:

 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(); 

Nestas linhas:

  1. define a posição de exibição (no centro da tela)
  2. permitido redimensioná-lo
  3. sincronização vertical ativada
  4. defina DisplayMode que armazena tamanhos de tela e alguns outros parâmetros
  5. na última linha, a exibição é criada e exibida na tela.

 static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } 

Na função de atualização, chamada em um loop infinito:

  1. Janela Verificar redimensionamento
  2. Atualização de exibição
  3. Na linha Display.sync (60), o display é sincronizado com 60 hertz (se você tiver uma frequência diferente de atualizações da tela, por exemplo, 59, 76, 120, 144, etc., defina sua frequência).
  4. Janela Fechar Verificação

Observe como o programa termina quando o usuário clica na cruz, o sinalizador de fechamento da janela, Display.isCloseRequested () se torna verdadeiro, e a variável em execução se torna falsa, e a próxima iteração que o loop while (running) não será executado e haverá uma transição para as linhas de Display .destroy (), que destrói a exibição e System.exit (0), cuja chamada termina o programa.

Etapa quatro, OpenGL


Para inicializar o OpenGL na função principal antes do loop while (em execução), você precisa adicionar o seguinte código:

 if (!GLContext.getCapabilities().OpenGL33) { System.err.println("    OpenGL 3.3."); System.exit(0); } 

Este código verifica se a placa de vídeo suporta o OpenGL 3.3. Se a placa de vídeo não suportar esta versão, tente atualizar o driver ou mudar para outra placa de vídeo (se você tiver mais de uma).

Portanto, a verificação está concluída. Se tudo estiver bem, a placa de vídeo suporta o OpenGL 3.3, seguimos em frente. Após o código de verificação, antes do loop, adicione o seguinte código:

 glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); 

Este código irá configurar o OpenGL da seguinte maneira:

  1. Ativar iluminação suave em shaders
  2. Ativar texturas
  3. Ativa a verificação de profundidade (para que os objetos próximos se sobreponham aos distantes)
  4. Definir cor de limpeza

No loop while (running), antes de chamar a função update (), adicione a linha

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

O que limpará o buffer de cores e o buffer de profundidade sempre que a tela for atualizada.

Código final


Clique para ver
 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); } } 


Isso conclui o primeiro artigo sobre como escrever um jogo no LWJGL. Se a pesquisa contiver mais de 50% de respostas positivas, continuarei escrevendo uma série de artigos.

Source: https://habr.com/ru/post/pt427979/


All Articles