2011-06-12 74 views
0

我有一個球,當它與精靈發生碰撞時觸發一個動作。隨後的動作完成後,重置它的位置與重置Sprite - Box2d(Cocos2d)

-(void)removeBall 
{ 
    [self stopAllActions]; 
    _ballBody->SetTransform(b2Vec2(10, 2), 0); 
} 

不過,[自stopAllActions]不會停止行動。我怎樣才能停止這一行動? 有什麼建議嗎?

感謝

+0

你在stopAllActions中執行了什麼? – NIKHIL 2011-06-13 07:39:15

回答

0

我使用

-(void)update:(ccTime)delta 
{ 

} 

以不斷檢查球體是否與其他球體碰撞並使用加速度計移動球體。所以,要重置球體的位置,我只需更換場景,即調用「dealloc」,然後再次啓動場景。

[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]]; 
+0

這不是你想要的方式 – NIKHIL 2011-06-14 06:24:36

3

==>你可以做我在下面

做的方式==>銷燬身體對象,並創建新的復位位置是你想要設置 這肯定會工作

 _world->DestroyBody(_body); 
    b2BodyDef _playerBodyDef; 
    _playerBodyDef.type=b2_dynamicBody; 
    _playerBodyDef.position.Set(160/PTM_RATIO,240/PTM_RATIO); 
    _playerBodyDef.userData=_ball; 
    _body=_world->CreateBody(&_playerBodyDef); 
    //create the shape for the rounded stick 
    b2CircleShape PlayerShape; 
    PlayerShape.m_radius = 15.0/PTM_RATIO; 

    //fixtureDef specifying the shape to circle 
    b2FixtureDef _playerShapeDef; 
    _playerShapeDef.shape = &PlayerShape; 
    _playerShapeDef.density = 1.0f; 
    _playerShapeDef.friction = 0.5f; 
    _playerShapeDef.restitution = 1.0f; 
    _playerShapeDef.filter.groupIndex =k_largeGroup; 
    _body->CreateFixture(&_playerShapeDef); 

好運

+0

哦,好的,謝謝,所以我基本上只是完全刪除球體,然後再添加它?我必須去上班,但當我回來時我會測試它。 – Jonathan 2011-06-13 11:01:37

+0

它沒有工作。這是因爲我正在「更新」方法中運行該操作(我在身體與另一個主體發生碰撞之後運行該操作)。所以,我剛剛替換了場景([[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]]「 – Jonathan 2011-06-13 20:35:22

+0

」您需要查看您的代碼並將一個方法放入刻度計時器方法中,然後調用該方法,以便可以再次銷燬該對象你也可以重置位置 – NIKHIL 2011-06-14 06:22:01

2

StopAllActions是Cocos2D,而不是Box2D。我所做的重用身體,精靈,粒子等被設置爲可見= NO和body-> SetActive(false)。

這是停用對象:

CCSprite *sprite = [projectiles objectAtIndex:i]; 

// Just to continue a loop if the sprite is not visible   
if(sprite.visible == NO) continue; 

sprite.visible = NO; 

b2Body *body = projectileBodyTracker[i]; 
body->SetActive(false); 

這是重新激活的對象:

CCSprite *sprite = [projectiles objectAtIndex:i]; 

sprite.position = moveToPosition; 

b2Body *body = projectileBodyTracker[i]; 
body->SetTransform(moveToPositionVector, rotation); 
body->SetActive(true); 

我已經寫了額外的代碼了我的頭頂,所以我不能完全確定它是正確的(語法上),但這是我做到這一點的方式。

+0

我使用cocos2d來運行所需的操作,我需要重置精靈,使其可見= no不是不足icient – Jonathan 2011-06-14 19:40:19

+0

簡化:Cocos2D與Box2D兼容,但Box2D與Cocos2D不完全兼容。如果你用Cocos2D移動精靈,你正在打破物理模擬。如果您只想使用Box2D進行碰撞檢測(並且根本不模擬任何物理),那麼您將您的身體設置爲傳感器,並使用您的聯繫人偵聽器告訴您何時發生了碰撞。 – 2011-06-15 00:21:01

+0

我爲我的遊戲使用了Box2d,但我也在使用和動作來爲精靈製作動畫時,它會「脫落」平臺。然後,我需要它重置。 – Jonathan 2011-06-15 00:28:36