2016-02-11 5 views
0

Я очень новичок в использовании внешних Java-библиотек, и я начинаю с Slick2D, который построен на LWJGL. Я написал простой StateBasedGame, который просто печатает три параметра на экране. Это дает мне ошибку, хотя некоторые файлы (jar?) Не присутствуют (см. Ниже для справки).Код LWJGL 2 не совместим с кодом LWJGL 3?

Это напоминает мне о том, что большинство учебных пособий, с которыми я столкнулся, были сделаны один или два года назад, когда LWJGL 3 не вышел или еще не был стабильным. Это означает, что все они используют LWJGL 2. Проблема в том, что многие из кода, которые я пытаюсь использовать LWJGL 3, не работают с кодом, который был первоначально написан в LWJGL 2. Почему это? Было бы неплохо вернуться к LWJGL 2, если я захочу узнать SLick2D? Пожалуйста, помогите, потому что простые программы, которые я пишу, даже не компилируются.

Вот мой код, который не работает (по крайней мере, в LWJGL 3):

import org.newdawn.slick.AppGameContainer; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.StateBasedGame; 

public class Game extends StateBasedGame { 

    Menu menu; 

    public Game(String title) { 
     super(title); 
     menu = new Menu(0); 
    } 

    public static void main(String[] args) { 
     try { 
      AppGameContainer agc = new AppGameContainer(new Game("Text Based")); 
      agc.setDisplayMode(600, 600, false); 
      agc.start(); 
     } catch (SlickException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void initStatesList(GameContainer container) throws SlickException { 
     System.out.println("InitStates"); 
     addState(new Menu(0)); 
     getState(menu.getID()).init(container, this); 
     enterState(menu.getID()); 
    } 
} 


import org.newdawn.slick.Color; 
import org.newdawn.slick.GameContainer; 
import org.newdawn.slick.Graphics; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.state.BasicGameState; 
import org.newdawn.slick.state.StateBasedGame; 

public class Menu extends BasicGameState { 

    private int ID; 
    private int menu; 

    public Menu(int id) { 
     this.ID = id; 
    } 

    @Override 
    public void init(GameContainer container, StateBasedGame sbg) throws SlickException { 
    } 

    @Override 
    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { 
     g.setColor(Color.white); 
     g.drawString("Higher or Lower", 50, 10); 

     g.drawString("1. Play Game", 50, 100); 
     g.drawString("2. High Scores", 50, 120); 
     g.drawString("3. Quit", 50, 140); 

    } 

    @Override 
    public void update(GameContainer arg0, StateBasedGame arg1, int arg2) throws SlickException { 

    } 

    @Override 
    public int getID() { 
     return ID; 
    } 

} 

Здесь ошибка:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl64 in java.library.path 
    at java.lang.ClassLoader.loadLibrary(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at org.lwjgl.Sys$1.run(Sys.java:72) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.lwjgl.Sys.doLoadLibrary(Sys.java:66) 
    at org.lwjgl.Sys.loadLibrary(Sys.java:87) 
    at org.lwjgl.Sys.<clinit>(Sys.java:117) 
    at org.lwjgl.opengl.Display.<clinit>(Display.java:135) 
    at org.newdawn.slick.AppGameContainer$1.run(AppGameContainer.java:39) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.newdawn.slick.AppGameContainer.<clinit>(AppGameContainer.java:36) 
    at Game.main(Game.java:17) 

ответ

1

LWJGL 3 - это полная переработка библиотеки, поэтому, естественно, большинство кода из LWJGL 2 не будут работать с ним. Slick2D по-прежнему использует LWJGL 2 под капотом, что делает его несовместимым с LWJGL 3.

Ошибка, которую вы получаете, потому что Slick2D вызывает функцию отображения LWJGL 2, которая пытается загрузить собственный файл lwjgl64.dll. Однако в LWJGL 3 родные библиотеки были переименованы (lwjgl32 и lwjgl вместо lwjgl и lwjgl64), поэтому он не может его найти. Даже если бы это произошло, загрузка DLL и банок обеих версий в одно и то же время (LWJGL 2 от Slick2D и LWJGL 3 по вашему коду), скорее всего, не сработает.

Если вы хотите использовать Slick2D, вы должны использовать LWJGL 2. Однако LWJGL 3 уже довольно стабилен и поставляется с некоторыми вспомогательными библиотеками, которые вы можете использовать для выполнения общих задач, таких как загрузка файлов изображений, поэтому я советую вам хотя бы взгляните на него (он предлагает некоторые приятные функции, такие как поддержка нескольких окон).

+0

Хорошо, спасибо! Это устранило много проблем для меня, потому что я не мог найти файл lwjgl64.dll, пока я мог найти файл lwjgl32.dll. Я рад, что ты сказал мне это сейчас, потому что для меня это не имело никакого смысла. – Eames

0

вы упускаете lwjgl64 с вашего пути к библиотеке. И.Е. ваши отсутствующие родные части. Либо вы не поместили его в свою java.library, либо он отсутствует в пути к классам и в вашем рабочем каталоге. Я считаю, что это DLL для Windows и .so для linux, поэтому убедитесь, что вы правильно включили lwjgl для своего проекта, и вы должны быть в порядке, но читайте здесь: LWJGL3 Migration Guide

+0

Я не могу найти файл lwjgl64. Единственное, что я нашел в Интернете до сих пор, - это установить «Месторасположение нативной библиотеки» в папку «Windows», которая была в загруженном файле. Это не сработало, хотя ... – Eames

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