2016-04-25 127 views
2

我一直在编码我libgdx应用程序(仅适用于台式机)的同时,并通过部分决定清理代码部分iv'e得到了一个问题后,我似乎无法来解决自己..libgdx尚未初始化

例外:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.UnsatisfiedLinkError: com.badlogic.gdx.physics.box2d.PolygonShape.newPolygonShape()J 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:131) 
Caused by: java.lang.UnsatisfiedLinkError: com.badlogic.gdx.physics.box2d.PolygonShape.newPolygonShape()J 
    at com.badlogic.gdx.physics.box2d.PolygonShape.newPolygonShape(Native Method) 
    at com.badlogic.gdx.physics.box2d.PolygonShape.<init>(PolygonShape.java:29) 
    at com.mygdx.game.handler.BodyEditorLoader.<init>(BodyEditorLoader.java:41) 
    at com.mygdx.game.util.GameUtils.init(GameUtils.java:23) 
    at com.mygdx.game.DungeonLife.create(DungeonLife.java:168) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:147) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124) 

google搜索了一会儿后,我想通是在this线程 在

提到我的错误的另一个问题可能是你会过早实例化一个SpriteBatch(或其他内部使用SpriteBatch的东西)(在堆栈跟踪中看起来有点像这样)。

但作为答案提到

相反,建立在你的游戏的创建/显示方法,这样的事情。

我似乎无法理解当libgdx初始化并准备使用,并在那里把我GameUtils.init()方法,以确保libgdx初始化

我的代码如下:(我有取出的e-相关方法)

应用类

package com.mygdx.game; 

import box2dLight.RayHandler; 
import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.maps.MapProperties; 
import com.badlogic.gdx.maps.tiled.TiledMap; 
import com.badlogic.gdx.maps.tiled.TmxMapLoader; 
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.*; 
import com.mygdx.game.entity.MobEntity; 
import com.mygdx.game.entity.PhysicalEntity; 
import com.mygdx.game.entity.Player; 
import com.mygdx.game.entity.Weapon; 
import com.mygdx.game.handler.*; 
import com.mygdx.game.util.CollisionConstants; 
import com.mygdx.game.util.GameUtils; 
import com.mygdx.game.util.TileObjectUtil; 
import com.mygdx.game.util.WorldConstants; 
import com.mygdx.game.valtype.WeaponDefinition; 

public class DungeonLife extends ApplicationAdapter implements WorldConstants { 

    OrthographicCamera camera; 

    float width , height; 

    Texture texture; 
    TextureRegion[] enttex; 

    //TEMP 
    MobEntity demo; 

    Player thePlayer; 
    PlayerInputProcessor playerInputProcessor; 

    ScreenUI ui; 

    int mapWidth , mapHeight; 

    //======================================== 
    GameMap gameMap; 
    //======================================== 


    @Override 
    public void create() { 

     texture = new Texture("maps/img/tileset_entity.png"); 

     enttex = new TextureRegion[(int) ((texture.getWidth()*texture.getHeight())/(BLOCK*BLOCK))]; 

     enttex[0] = new TextureRegion(texture , 0 , 0 , (int)BLOCK , (int)BLOCK); 
     enttex[1] = new TextureRegion(texture , (int)BLOCK , 0 , (int)BLOCK , (int)BLOCK); 

     width = Gdx.graphics.getWidth()/5; 
     height = Gdx.graphics.getHeight()/5; 
     camera = new OrthographicCamera(width,height); 
     camera.position.set(width/2, height/2, 0); 

     camera.update(); 

     GameUtils.init(); // <------this guy 

     //init(); 


    } ... 

个GameUtils

package com.mygdx.game.util; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
import com.badlogic.gdx.maps.tiled.TiledMap; 
import com.badlogic.gdx.maps.tiled.TmxMapLoader; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.World; 
import com.mygdx.game.entity.PhysicalEntity; 
import com.mygdx.game.handler.*; 

import java.util.PriorityQueue; 

public class GameUtils { 

    public static void init(){ 

     weapon_bodyEditorLoader = new BodyEditorLoader(Gdx.files.internal("textures/weapons/dungeonlife_weapons.json")); 
     resourceManager = new ResourceManager(); 
     resourceManager.addRes("friendlyhealth" , new Texture("textures/ui/friendlyhealth.png")); 
     resourceManager.addRes("enemyhealth" , new Texture("textures/ui/enemyhealth.png")); 
     tmxMapLoader = new TmxMapLoader(); 
     gameContactListender = new GameContactListender(); 


    } 


    //GLOBAL 
    public static BodyEditorLoader weapon_bodyEditorLoader; 
    public static GameContactListender gameContactListender; 
    public static ResourceManager resourceManager; 
    public static TmxMapLoader tmxMapLoader; 


    //CURRENTS ============================ 

    public static GameMap CURRENT_GAMEMAP; 

} 

桌面快速启动(平时)

package com.mygdx.game.desktop; 

import com.badlogic.gdx.backends.lwjgl.LwjglApplication; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; 
import com.mygdx.game.DungeonLife; 
import com.mygdx.game.util.GameUtils; 

public class DesktopLauncher { 
    public static void main (String[] arg) { 
     LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); 
     config.useGL30 = false; 
     config.width=640; 
     config.height=360; 
     DungeonLife dungeonLife = new DungeonLife(); 
     new LwjglApplication(dungeonLife, config); 
    } 
} 

帮助是大大appriciated! :D

+0

似乎在调用gameUtils.init()之前生成一个新的box2d世界可以解决问题,原因是某种原因 – kw7

回答

1

正如我已经写在其他链接的答案,请确保您的项目设置正确。 Box2D是一个扩展,需要自己的本地库才能运行。

看来这是Box2D本地人尚未加载的特定问题。当LibGDX正在初始化时,它们不会自动加载,但您必须亲自触发它(请参阅wiki)。

您发布的代码看起来是正确的,但在您可以使用与Box2D相关的任何内容之前,您必须致电Box2D.init()。另外,创建一个World对象也是一样,但不是最好的方法。