LWJGL 2 代码与 LWJGL 3 代码不兼容?
LWJGL 2 Code Not Compatible with LWJGL 3 Code?
我对使用外部 Java 库还很陌生,我开始使用基于 LWJGL 构建的 Slick2D。我写了一个简单的 StateBasedGame,它只在屏幕上打印三个选项。尽管某些(jar?)文件不存在(请参见下文以供参考),但它给了我一个错误。
这让我想起了一个事实,我遇到的大多数教程都是在一两年前制作的,当时 LWJGL 3 还没有出来或者还不稳定。这意味着他们都在使用 LWJGL 2。问题是,我尝试使用 LWJGL 3 的很多代码不能与最初用 LWJGL 2 编写的代码一起工作。这是为什么?如果我想学习 SLick2D,切换回 LWJGL 2 是个好主意吗?请帮助,因为我编写的简单程序甚至无法编译。
这是我的代码不起作用(至少在 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.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.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)
您的库路径中缺少 lwjgl64。 IE。你缺少本地部分。要么你没有把它放在你的 java.library 中,要么它在类路径和你的工作目录中丢失了。我相信它是 windows 的 .dll 和 linux 的 .so,因此请确保为您的项目正确包含 lwjgl,但是您应该没问题,请阅读此处:LWJGL3 Migration Guide
LWJGL 3 是对库的完全重写,因此 LWJGL 2 中的大部分代码自然无法使用它。 Slick2D 仍然在引擎盖下使用 LWJGL 2,这使得它与 LWJGL 3 不兼容。
您遇到的错误是因为 Slick2D 调用了 LWJGL 2 显示功能,它试图加载 lwjgl64.dll
本机文件。但是,在 LWJGL 3 中,本机库已重命名(lwjgl32
和 lwjgl
而不是 lwjgl
和 lwjgl64
),因此无法找到它。即使这样做,同时加载两个版本的 dll 和 jar(Slick2D 的 LWJGL 2 和您的代码的 LWJGL 3)也很可能无法正常工作。
如果你想使用 Slick2D,你必须使用 LWJGL 2。但是,LWJGL 3 已经相当稳定,并且附带了一些帮助程序库,你可以使用它来执行加载图像文件等常见任务,所以我建议你在至少看一下它(它提供了一些不错的功能,例如 multi-window 支持)。
我对使用外部 Java 库还很陌生,我开始使用基于 LWJGL 构建的 Slick2D。我写了一个简单的 StateBasedGame,它只在屏幕上打印三个选项。尽管某些(jar?)文件不存在(请参见下文以供参考),但它给了我一个错误。
这让我想起了一个事实,我遇到的大多数教程都是在一两年前制作的,当时 LWJGL 3 还没有出来或者还不稳定。这意味着他们都在使用 LWJGL 2。问题是,我尝试使用 LWJGL 3 的很多代码不能与最初用 LWJGL 2 编写的代码一起工作。这是为什么?如果我想学习 SLick2D,切换回 LWJGL 2 是个好主意吗?请帮助,因为我编写的简单程序甚至无法编译。
这是我的代码不起作用(至少在 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.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.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)
您的库路径中缺少 lwjgl64。 IE。你缺少本地部分。要么你没有把它放在你的 java.library 中,要么它在类路径和你的工作目录中丢失了。我相信它是 windows 的 .dll 和 linux 的 .so,因此请确保为您的项目正确包含 lwjgl,但是您应该没问题,请阅读此处:LWJGL3 Migration Guide
LWJGL 3 是对库的完全重写,因此 LWJGL 2 中的大部分代码自然无法使用它。 Slick2D 仍然在引擎盖下使用 LWJGL 2,这使得它与 LWJGL 3 不兼容。
您遇到的错误是因为 Slick2D 调用了 LWJGL 2 显示功能,它试图加载 lwjgl64.dll
本机文件。但是,在 LWJGL 3 中,本机库已重命名(lwjgl32
和 lwjgl
而不是 lwjgl
和 lwjgl64
),因此无法找到它。即使这样做,同时加载两个版本的 dll 和 jar(Slick2D 的 LWJGL 2 和您的代码的 LWJGL 3)也很可能无法正常工作。
如果你想使用 Slick2D,你必须使用 LWJGL 2。但是,LWJGL 3 已经相当稳定,并且附带了一些帮助程序库,你可以使用它来执行加载图像文件等常见任务,所以我建议你在至少看一下它(它提供了一些不错的功能,例如 multi-window 支持)。