Box2dLights:处理灯光时出现致命错误+ ConeLight无法正常工作

时间:2016-12-30 18:20:02

标签: java android libgdx box2dlights

感谢您的光临。

我遇到了Box2DLights的2个问题。

第一个并不重要,第二个是

#1:处理灯

我有多个PointLights跟随一个宝石。 所以每个porjectile都有一个ArrayList,里面有它所需的所有PointLights。 当宝石撞击物体时,所有的灯都应该被处理掉。 显然这是一个问题。

if(hit){
      deleted = true;
      for(int i = 0; i<myLight.size();i++){
         myLight.get(i).dispose();
       }
}

这会导致致命执行

  

Java运行时环境检测到致命错误:    pc = 0x00007ffc6fc59f58,pid = 6944,tid = 6676的EXCEPTION_ACCESS_VIOLATION(0xc0000005)   JRE版本:Java(TM)SE运行时环境(8.0_45-b15)(版本1.8.0_45-b15)   Java VM:Java HotSpot(TM)64位服务器VM(25.45-b02混合模式windows-amd64压缩oops)   有问题的框架:   C [ntdll.dll + 0x39f58]   无法编写核心转储。默认情况下,在Windows的客户端版本

上未启用小型转储

我想问题是,ArrayList不再能以某种方式引用被处置对象。问题是如何做得更好。

#2:ConeLight崩溃我的JavaTm(?)

在我的游戏中添加ConeLight时

playerLight = new ConeLight(this,100,Color.WHITE,100,1920f/2f,1080f/2f,0,60);

//used "this" because I called this method in a class that extends RayHandler

按下“播放”时,我的游戏在主菜单中冻结 MainMenu屏幕刚冻结,出现一个小窗口,上面写着:

  

“Java(TM)SE二进制文件不再起作用”

无论如何,PointLight工作得非常完美。老实说,我不知道这是我的错还是错。

2 个答案:

答案 0 :(得分:2)

回答你的问题#1 - 在处理灯光之前你应该从rayHandler中删除它。否则,rayHandler将尝试处理废弃的光线,这似乎是你遇到的崩溃。

myLight.get(i).remove();

而不是

myLight.get(i).dispose();

这里的第二点是,你可能不应该每次都创造和处理灯光。出于性能原因(光的实例化非常繁重),您可以更好地使用池。使用池时,您可以使用remove(false)(false防止丢弃它)和add()方法来执行此操作。

关于问题#2 - 我没有看到ConeLight构造函数参数的任何问题,使用ConeLight的测试也不会重现您的崩溃。因此,问题可能出在您的扩展类中(或不是)。我建议你更频繁地调试和找到问题所在。

答案 1 :(得分:0)

我已经解决了,最后。这是一个非常愚蠢的错误:

因为我真的不需要一个World对象,但RayHandler构造函数确实如此,我创建了一个World,它给了它rayhandler并在之后处理它。愚蠢,我知道。 而不是

    public void create(){
       ....
       World world = new World(new Vector2(0,0),false);
       rayHandler = new RayHandler(world);
       world.dispose;
    }

您需要将world.dispose移动到dispose方法并使world成为一个字段。

public void create(){
       ....
       world = new World(new Vector2(0,0),false);
       rayHandler = new RayHandler(world);

    }
...
public void dispose(){
      ...
      rayHandler.dispose;
      world.dispose();
}