【发布时间】:2017-02-18 07:42:23
【问题描述】:
我使用 Node.js 尤其是 Socket.io 使用 LibGDX 编写多人游戏。 当新玩家连接时,客户端会收到一个名为 getPlayers 的事件:
public void configSocketEvents(){
socket.on("getPlayers", new Emitter.Listener() {
@Override
public void call(Object... args) {
JSONArray objects = (JSONArray) args[0];
try {
for(int i = 0; i < objects.length(); i++){
Player enemy = new Player();
//...
播放器类:
public Player() {
renderer = new ShapeRenderer();
init();
}
现在,当第二个客户端连接时,两个客户端都会输出以下错误:
Exception in thread "EventThread" java.lang.RuntimeException: No OpenGL context found in the current thread.
...
at de.ej.facharbeitsspiel.Game.Player.<init>(Player.java:26)
at de.ej.facharbeitsspiel.Screens.GameScreenMP$1.call(GameScreenMP.java:149)
第 149 行是Player enemy = new Player(); 行,所以很明显存在一个新的ShapeRenderer() 无法加载的问题,因为它不是OpenGL 渲染线程。
知道如何解决这个问题吗?提前谢谢你
【问题讨论】:
-
当然,不要在另一个线程中创建需要在渲染线程中创建的东西。您可能想阅读:en.wikipedia.org/wiki/Separation_of_concerns。您的 Player 类(游戏逻辑)不应该关心 ShapeRenderer(渲染逻辑)。无论如何,请阅读:stackoverflow.com/help/how-to-ask,因为您的问题太宽泛(没有包含足够的细节)而无法回答。
-
但是如果我在套接字事件之外创建一个播放器,一切正常。我的问题中缺少哪些信息?
-
如果您真的想采用这种方法(不推荐),那么这将帮助您包含所需的信息:stackoverflow.com/help/mcve。不过一般来说,如果你想在渲染线程上做点什么,那么使用
Gdx.app.postRunnable。 -
好的,我解决了这个问题。正如您所建议的,我没有在 Player 类中创建一个新的 ShapeRenderer,而是在我的 WorldRenderer 类中创建了一个并使用了这个。非常感谢您的帮助!
标签: android node.js opengl-es socket.io libgdx