感谢您的光临。
我遇到了Box2DLights的2个问题。
第一个并不重要,第二个是
我有多个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不再能以某种方式引用被处置对象。问题是如何做得更好。
在我的游戏中添加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屏幕刚冻结,出现一个小窗口,上面写着:
无论如何,PointLight工作得非常完美。老实说,我不知道这是我的错还是错。“Java(TM)SE二进制文件不再起作用”
答案 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();
}