2014-07-22 41 views
1

表达:m_bodyCount < m_bodyCapacityBox2D的崩溃(表达式:m_bodyCount <m_bodyCapacity)

即我发现了错误。当我得到这个错误时整个游戏崩溃。现在,事情就是这样:我只在某些方面得到错误,我试图摧毁,更具体地说,是在比赛期间制造的尸体。我的意思是在游戏开始时,我加载关卡并为每个关卡创建所有物体。但是,有些项目是在游戏运行时制作的,例如子弹,大炮和硬币。我可以销毁装入关卡时创建的任何物体,但是当我尝试销毁之后创建的物体时,我会得到上述错误。

下面是一个例子。我生成一个炮弹与我的炮: Cannon.class

if(reloadProgress >= RELOAD_TIME) { 
      CannonBall cannonBall = new CannonBall(); 
      cannonBall.setXDirection(xDirection); 
      cannonBall.setYDirection(yDirection); 
      cannonBall.position.set(cannonBallPos); 
      Box2DHelper.makeFixture(cannonBall, BodyType.KinematicBody, origin, WorldController.b2world, 
        true, false); 
      Level.cannonBalls.add(cannonBall); 
      reloadProgress -= RELOAD_TIME; 
     } else { 
      reloadProgress += deltaTime; 
     } 

凡Box2DHelper.makeFixture()是:

public static void makeFixture(GameObject object, BodyType type, 
      Vector2 origin, World b2world, boolean addUserData, boolean isMonster) { 
     BodyDef bodyDef = new BodyDef(); 
     bodyDef.type = type; 
     bodyDef.position.set(object.position); 
     Body body = b2world.createBody(bodyDef); 
     if(addUserData) 
      body.setUserData(object); 
     object.body = body; 
     PolygonShape polygonShape = new PolygonShape(); 
     origin.x = object.bounds.width/2.0f; 
     origin.y = object.bounds.height/2.0f; 
     polygonShape.setAsBox(object.bounds.width/2.0f, 
       object.bounds.height/2.0f, origin, 0); 
     FixtureDef fixtureDef = new FixtureDef(); 
     fixtureDef.shape = polygonShape; 
     if(isMonster) fixtureDef.filter.groupIndex = Constants.GROUP_MONSTER; 
     body.createFixture(fixtureDef); 
     polygonShape.dispose(); 
    } 

所以,现在我已经创建了我的炮弹,并设置它的身体。现在,10秒后,如果还没有打什么,我毁了它:

CannonBall.class

if (existanceDuration >= CANNON_BALL_EXISTANCE_DURATION) { 
      //Destroy cannon ball 
      CollisionHandler.bodiesToRemoveList.add(this.body); 
     } 

现在,我已经添加了人体进入名单,我必须将其删除: CollisionHandler.class:

public static void removeSpecifiedBodies() { 
     Iterator<Body> i = bodiesToRemoveList.iterator(); 
     while (i.hasNext()) { 
      Body desBod = i.next(); 
      removeObjectFromList(desBod); //This is just to remove the object as well 

      WorldController.b2world.destroyBody(desBod); 

      if (perCharHitAction == true) { 
       performCharacterDeathAction(Level.character); 
       perCharHitAction = false; 
      } 
      i.remove(); 
     } 
     bodiesToRemoveList.clear(); 
    } 

但现在,我需要实际调用此方法。我这样做,我的主要更新方法,b2world.step右后(): WorldController.class:

public void update(float deltaTime) { 
     ... 
     b2world.step(deltaTime, 8, 3); 
     if (CollisionHandler.bodiesToRemoveList.size() > 0) 
      CollisionHandler.removeSpecifiedBodies(); 

现在,就像我前面所说的,当我在破坏的装载人造物体这种方法工作正常级别,但在后来创建的对象上,它不会。

为什么我的游戏在试图摧毁后来在我的游戏中创建的box2d物体后继续崩溃?

编辑:在后面的比赛创造机构当在b2world

private void initPhysics() { 
     if (b2world != null) 
      b2world.dispose(); 
     b2world = new World(new Vector2(0, -9.81f), true); 
     Vector2 origin = new Vector2(); 
     b2world.setContactListener(new CollisionHandler()); 

     // Create Box2D Fixtures 
     for (Grass grass : Level.grasses) 
      Box2DHelper.makeEdgeChain(grass, BodyType.StaticBody, origin, 
        b2world, true); 

     // Bricks 
     for (Brick brick : Level.bricks) 
      // Box2DHelper.makeFixture(brick, BodyType.KinematicBody, origin, 
      // b2world, true); 
      Box2DHelper.makeEdgeChain(brick, BodyType.StaticBody, origin, 
        b2world, true); 

     // Item Boxes 
     for (ItemBox box : Level.itemBoxes) 
      Box2DHelper.makeFixture(box, BodyType.KinematicBody, origin, 
        b2world, true, false); 

     //Enemies 
     for (Goomba goomba : Level.goombas) 
      Box2DHelper.makeFixture(goomba, BodyType.DynamicBody, origin, 
        b2world, true, true); 

     for (Koopa koopa : Level.koopas) 
      Box2DHelper.makeFixture(koopa, BodyType.DynamicBody, origin, 
        b2world, true, true); 

     // Cannons 
     for (Cannon cannon : Level.cannons) 
      Box2DHelper.makeFixture(cannon, BodyType.KinematicBody, origin, 
        b2world, true, true); 


     // Character 
     BodyDef bodyDef = new BodyDef(); 
     bodyDef.type = BodyType.DynamicBody; 
     bodyDef.position.set(Level.character.position); 
     Body body = b2world.createBody(bodyDef); 
     body.setUserData(Level.character); 
     Level.character.body = body; 

     CircleShape polygonShapeHead = new CircleShape(); 
     origin.x = Level.character.circleBoundOrigin.x * 2.0f; 
     origin.y = Level.character.circleBoundOrigin.y * 3.0f; 
     // polygonShapeHead.setAsBox(level.character.circleBoundOrigin.x, 
     // level.character.circleBoundOrigin.y, origin, 0); 
     polygonShapeHead.setPosition(origin); 
     polygonShapeHead.setRadius(Level.character.circleBoundOrigin.x); 
     FixtureDef fixtureDefHead = new FixtureDef(); 
     fixtureDefHead.shape = polygonShapeHead; 
     fixtureDefHead.friction = Level.character.friction.x; 
     body.createFixture(fixtureDefHead); 

     polygonShapeHead.dispose(); 

     PolygonShape polygonShapeBod = new PolygonShape(); 
     origin = Level.character.rectBoundOrigin; 
     polygonShapeBod.setAsBox(Level.character.rectBoundOrigin.x, 
       Level.character.rectBoundOrigin.y, origin, 0); 
     FixtureDef fixtureDefBod = new FixtureDef(); 
     fixtureDefBod.shape = polygonShapeBod; 
     fixtureDefBod.friction = Level.character.friction.x; 
     body.createFixture(fixtureDefBod); 

     polygonShapeBod.dispose(); 
    } 

也许这个问题:我把这个方法的水平加载用于创建对象的身体后,对不对?

+0

我会怀疑加载关卡时产生的物体和后来做出的物体之间做了什么不同的事情?加载关卡时所做的尸体是否都使用完全相同的程序? – iforce2d

+0

对不起,迟到的回应。我很确定我正在以同样的方式制作它们。我只是调用Box2DHandler函数来创建它们。让我添加一个编辑,显示如何在加载关卡时创建主体。 – user2082169

+0

我终于解决了这个问题。我没有将身体添加到ContactListener的销毁列表中,而是向对象添加了一个新的布尔值,并在我想销毁它们时将其设置为true。然后,在对象更新方法中,我将它添加到销毁列表中。这似乎修复了它。我认为这可能是一个问题,要么从对象获取主体,要么将其添加到联系人侦听器中的销毁列表中。 – user2082169

回答

3

我有同样的错误 - 我想通了,它发生如果你多次摧毁同一个身体。

在我的情况下,我把身体放入联系人侦听器的列表中,但是我没有确定它只在列表中出现过一次。

这也解释了为什么你的问题被解决了,一旦你使用了一个布尔标志,这也确保了同一个主体只被销毁一次。

简而言之:如果您尝试一遍又一遍地摧毁同一个身体,则会出现此错误。