2016-08-17 29 views
0

我有一个奇怪的逻辑错误,我正在尝试排序,但是我打了一面墙,似乎无法找到我的方式。也许这里的集体思想可以帮助!检测到libgdx传感器发生碰撞,但条件代码未被触发

那么究竟发生了什么:我在Box2D中创建了一张光盘,并在box2D中创建了一个传感器盒。如果光盘与传感器碰撞,逻辑很简单。你赢了!问题是,我可以检测到球和传感器之间的碰撞,但是条件是,您赢得的代码不会触发。这是我正在使用的代码。

//instantiating the disc, ground, start platform, and win sensor 
    disc = createCircleBody("Circle", 20, camera.viewportWidth/2, 450, 0); 
    disc.setUserData("disc"); 

    floor = createGround(tmpFloor); 
    floor.setUserData("floor"); 

    platform = createPlatform(initPlatform); 
    platform.setUserData("platform"); 

    winSensor = createWinSensor(tmpWinSensor); 
    winSensor.setUserData("winSensor"); 

    //... Code omitted for clarity ... 

    world.setContactListener(new ContactListener() { 

     @Override 
     public void beginContact(Contact contact) { 

      Body fixtureA = contact.getFixtureA().getBody(); 
      Body fixtureB = contact.getFixtureB().getBody(); 

      // if the disc and the floor collide. 
      if((fixtureA.getUserData() == disc.getUserData() && fixtureB.getUserData() == floor.getUserData()) || (fixtureA.getUserData() == floor.getUserData() && fixtureB.getUserData() == disc.getUserData())) { 
       newDisc.add(tmpDisc); 
       newDisc.add(tmpPlatform); 
       bodiesForDeletion.add(disc); // destroy the current disk 
      } 

      // if contact is detected between disc and WinSensor 
      if (fixtureA.getUserData() == winSensor.getUserData() && fixtureB == disc.getUserData()) { 

       Gdx.app.log("WIN_CONDITION", "You won!"); // This line won't fire. 

       //TODO: Create alert Box to notify user that they have won the game! 
      } 

      Gdx.app.log("beginContact", "between " + contact.getFixtureA().getBody().getUserData() + " and " + contact.getFixtureB().getBody().getUserData() + "."); 
     } 

     @Override 
     public void endContact(Contact contact) { 

      Body fixtureA = contact.getFixtureA().getBody(); 
      Body fixtureB = contact.getFixtureB().getBody(); 

      Gdx.app.log("endContact", "between " + contact.getFixtureA().getBody().getUserData() + " and " + contact.getFixtureB().getBody().getUserData() + "."); 
     } 

     @Override 
     public void postSolve(Contact arg0, ContactImpulse arg1) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void preSolve(Contact arg0, Manifold arg1) { 
      // TODO Auto-generated method stub 
     } 
    }); 

第一次碰撞检测按预期工作。碟片与地面盒碰撞,被删除,在世界之外创建启动平台和新碟片。我无法弄清楚为什么这段代码没有被解雇。

回答

0

好像在你的if语句

if (fixtureA.getUserData() == winSensor.getUserData() && fixtureB == disc.getUserData()) {

你缺少你的fixtureB.getUserData()

+0

我不能告诉你我盯着那行代码多久了。这很简单,我看着它!谢谢你抓住我的错误。我想我只需要第二组眼睛哈哈。 –

+0

不客气,很高兴我可以帮助:) –