2014-01-23 89 views
-1

檢索壘球的篩選數據我用壘球在我的項目&想改變它的對groupIndex而它與某種類型的障礙物相撞....對我有下面的代碼使用EXC_BAD_ACCESS錯誤而cocos2dx

void HelloWorld::collide() 
{ 

    for (int i=0; i<13; i++) { 

     b2Body *body=(b2Body *)node->bodies->objectAtIndex(i); 
     b2Fixture *fixture=body->GetFixtureList(); 


     b2Filter filterdata=fixture->GetFilterData(); 
     filterdata.groupIndex=-8; 
     fixture->SetFilterData(filterdata); 
     } 
     b2Fixture *fixture=node->innerCircleBody->GetFixtureList(); 
     b2Filter filterdata=fixture->GetFilterData(); 
     filterdata.groupIndex=-8; 
     fixture->SetFilterData(filterdata); 


     world->SetGravity(b2Vec2(0, 0)); 

} 

,但在b2Filter filterdata獲取EXC_BAD_ACCESS = fixture-> GetFilterData();

不知道發生了什麼事錯在這個....

+0

13號從哪裏來?循環使用「主體」列表中的項目數量會更安全。 – iforce2d

+0

在我的情況下,我已經取代(int i = 0; i <13; i ++); to(int i = 0; i bodies-> count(); i ++);仍然有相同的錯誤... –

+0

你是否在這段時間摧毀任何身體或固定裝置?使用調試器查看所涉及的物體和夾具的值,您可以判斷它們是否無效。 – iforce2d

回答

0

並不是每一個身體有固定裝置(形狀)。在訪問它之前檢查燈具是不是NULL。

此外,由於filterData是returned by reference,所以不需要再次設置它。替換此:

b2Filter filterdata=fixture->GetFilterData(); 
filterdata.groupIndex=-8; 
fixture->SetFilterData(filterdata); 

與此,它會很好地工作:

b2Filter filterdata=fixture->GetFilterData(); 
filterdata.groupIndex=-8; 

GetFilterData不會複製b2Filter,它通過引用返回的過濾器,它實際上是同一個對象,你可以修改它直接不用重新分配。

+0

我在這裏遵循這個http://www.uchidacoonga.com/2012/04/soft-body-physics-with-box2d-and-cocos2d-part-44/,同時創建softbody每個身體得到夾具在for循環.. .still當我檢查如果夾具條件,然後它給EXC_BAD在夾具 - > SetFilterData(filterdata); –

+0

查看我的更新回答。該錯誤可能是因爲您將過濾器數據設置爲完全相同的對象。 – LearnCocos2D

+0

我改變了行,因爲你的答案,但這次我得到EXC_BAD在b2Filter filterdata = fixture-> GetFilterData(); –