表达式:IsLocked() == false,引用 World 时崩溃?
Expression: IsLocked() == false, crashing when World is referenced?
错误
AL lib: (EE) alc_cleanup: 1 device not closed
Assertion failed!
Program: C:\Program Files\Java\jre1.8.0_25\bin\javaw.exe
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/b2World.cpp, Line 109
Expression: IsLocked() == false
下面一行是错误发生前的最后一行:
Body body = world.createBody(bodyDef);
我不明白这是怎么引起问题的。 world
和 bodyDef
不是 null
。
我的程序的结构是我有一个 GameStateRegular
class,在它的 init
方法中,它添加了两个新的 VirusEntity
对象,如下所示:
VirusEntity virus0 = new VirusEntity(world, mother, new Vector2(0, 0));
VirusEntity virus1 = new VirusEntity(world, mother, new Vector2(100, 100));
viruses.add(virus0);
viruses.add(virus1);
这很好用。我有一个 VirusEntity
设置来执行以下代码,当它以 MotherCellEntity
开始 Contact
时执行以下代码:
private void setContactListener() {
world.setContactListener(new ContactAdapter() {
@Override
public void beginContact(Contact contact) {
Body bodyA = contact.getFixtureA().getBody();
Body bodyB = contact.getFixtureB().getBody();
if (bodyA == mother.getBody()) work(bodyA, bodyB);
else if (bodyB == mother.getBody()) work(bodyB, bodyA);
}
private void work(Body motherCellBody, Body virusBody) {
VirusEntity virus = null;
for (VirusEntity v : viruses) {
if (v.getBody() == virusBody) virus = v;
}
virus.remove();
VirusEntity newVirus = new VirusEntity(world, mother, virus.getSpawnPosition());
viruses.add(newVirus);
}
});
}
我正在引用相同的 World
对象,并且将相同的 MotherCellEntity
对象引用到正在创建的新 VirusEntity
,但我仍然无法确定这里发生了什么。
完整 GameStateRegular
class: http://pastebin.com/mFpmp28T
完整 VirusEntity
class: http://pastebin.com/HjSGS4ER
在此先感谢大家的帮助。我对这个话题非常含糊,因为我真的不明白发生了什么。我试图对此做一些背景研究,但没有成功。
我是如何成功的
我所做的是在 GameStateRegular
class:
中的 update
方法中
@Override
public void update() {
world.step(1, 1, 1);
mother.update();
for (int i = 0; i < viruses.size(); i++) {
VirusEntity e = viruses.get(i);
if (e.isRemoved()) {
viruses.remove(e);
e.dispose();
// --v--
VirusEntity newVirus = new VirusEntity(world, mother, e.getSpawnPosition());
viruses.add(newVirus);
// --^--
} else e.update();
}
}
此外,对于我的 ContactAdapter
:
private void setContactListener() {
world.setContactListener(new ContactAdapter() {
@Override
public void preSolve(Contact contact, Manifold manifold) {
Body bodyA = contact.getFixtureA().getBody();
Body bodyB = contact.getFixtureB().getBody();
if (bodyA == mother.getBody()) virusInvolved(bodyA, bodyB);
else if (bodyB == mother.getBody()) virusInvolved(bodyB, bodyA);
}
private void virusInvolved(Body motherCellBody, Body virusBody) {
VirusEntity virus = null;
for (VirusEntity v : viruses) {
if (v.getBody() == virusBody) virus = v;
}
if (virus != null) {
virus.setMovementAllowed(false);
virus.remove();
}
}
});
}
错误
AL lib: (EE) alc_cleanup: 1 device not closed
Assertion failed!
Program: C:\Program Files\Java\jre1.8.0_25\bin\javaw.exe
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/b2World.cpp, Line 109
Expression: IsLocked() == false
下面一行是错误发生前的最后一行:
Body body = world.createBody(bodyDef);
我不明白这是怎么引起问题的。 world
和 bodyDef
不是 null
。
我的程序的结构是我有一个 GameStateRegular
class,在它的 init
方法中,它添加了两个新的 VirusEntity
对象,如下所示:
VirusEntity virus0 = new VirusEntity(world, mother, new Vector2(0, 0));
VirusEntity virus1 = new VirusEntity(world, mother, new Vector2(100, 100));
viruses.add(virus0);
viruses.add(virus1);
这很好用。我有一个 VirusEntity
设置来执行以下代码,当它以 MotherCellEntity
开始 Contact
时执行以下代码:
private void setContactListener() {
world.setContactListener(new ContactAdapter() {
@Override
public void beginContact(Contact contact) {
Body bodyA = contact.getFixtureA().getBody();
Body bodyB = contact.getFixtureB().getBody();
if (bodyA == mother.getBody()) work(bodyA, bodyB);
else if (bodyB == mother.getBody()) work(bodyB, bodyA);
}
private void work(Body motherCellBody, Body virusBody) {
VirusEntity virus = null;
for (VirusEntity v : viruses) {
if (v.getBody() == virusBody) virus = v;
}
virus.remove();
VirusEntity newVirus = new VirusEntity(world, mother, virus.getSpawnPosition());
viruses.add(newVirus);
}
});
}
我正在引用相同的 World
对象,并且将相同的 MotherCellEntity
对象引用到正在创建的新 VirusEntity
,但我仍然无法确定这里发生了什么。
完整 GameStateRegular
class: http://pastebin.com/mFpmp28T
完整 VirusEntity
class: http://pastebin.com/HjSGS4ER
在此先感谢大家的帮助。我对这个话题非常含糊,因为我真的不明白发生了什么。我试图对此做一些背景研究,但没有成功。
我是如何成功的
我所做的是在 GameStateRegular
class:
update
方法中
@Override
public void update() {
world.step(1, 1, 1);
mother.update();
for (int i = 0; i < viruses.size(); i++) {
VirusEntity e = viruses.get(i);
if (e.isRemoved()) {
viruses.remove(e);
e.dispose();
// --v--
VirusEntity newVirus = new VirusEntity(world, mother, e.getSpawnPosition());
viruses.add(newVirus);
// --^--
} else e.update();
}
}
此外,对于我的 ContactAdapter
:
private void setContactListener() {
world.setContactListener(new ContactAdapter() {
@Override
public void preSolve(Contact contact, Manifold manifold) {
Body bodyA = contact.getFixtureA().getBody();
Body bodyB = contact.getFixtureB().getBody();
if (bodyA == mother.getBody()) virusInvolved(bodyA, bodyB);
else if (bodyB == mother.getBody()) virusInvolved(bodyB, bodyA);
}
private void virusInvolved(Body motherCellBody, Body virusBody) {
VirusEntity virus = null;
for (VirusEntity v : viruses) {
if (v.getBody() == virusBody) virus = v;
}
if (virus != null) {
virus.setMovementAllowed(false);
virus.remove();
}
}
});
}