2016-08-17 30 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

不客氣,很高興我可以幫助:) –