0

谢谢你过来。

我遇到了 Box2DLights 的 2 个问题。

第一个问题并不重要,但是第二个,

#1:处理灯光

我有多个 PointLights 跟随一个 porjectile。因此,每个 porjectile 都有一个 ArrayList,其中包含它需要的所有 PointLights。当 porjectile 击中一个物体时,所有的 Lights 都应该被处理掉。显然这是个问题。

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

这会导致致命的异常

Java 运行时环境检测到一个致命错误:EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffc6fc59f58, pid=6944, tid=6676 JRE 版本:Java(TM) SE Runtime Environment (8.0_45-b15) (build 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

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

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

然而,PointLight 可以完美运行。老实说,我不知道这是我的错还是错误。

4

2 回答 2

2

回答您的问题 #1 - 在处理灯光之前,您应该将其从 rayHandler 中移除。否则, rayHandler 将尝试处理已处理的光,这似乎是您遇到的崩溃。

myLight.get(i).remove();

代替

myLight.get(i).dispose();

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

关于问题 #2 - 我没有看到 ConeLight 构造函数参数有任何问题,而且 ConeLight 的测试也不会重现您的崩溃。因此,问题可能出在您的扩展类中(或不在)。建议您更准确地调试定位问题所在。

于 2016-12-31T19:29:55.440 回答
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 方法并使世界成为一个字段。

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

    }
...
public void dispose(){
      ...
      rayHandler.dispose;
      world.dispose();
}
于 2017-01-15T13:59:45.370 回答