Сбросить спрайт - Box2d (Cocos2d) - PullRequest
0 голосов
/ 13 июня 2011

У меня есть шар, который запускает действие, когда сталкивается со спрайтом. Затем после завершения действия оно сбрасывает свою позицию с

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

Но [self stopAllActions] не останавливает действие. Как я могу остановить действие? Есть идеи?

Спасибо

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

==> Вы можете сделать так, как я сделал ниже

==> Уничтожить объект body, создать новое и сбросить положение, в котором вы хотите установить это точно будет работать

     _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);

Удачи

2 голосов
/ 14 июня 2011

StopAllActions - это Cocos2D, а не Box2D.То, что я делаю для повторного использования тел, спрайтов, частиц и т. Д., Устанавливается видимым = НЕТ и 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 голосов
/ 14 июня 2011

Я использую

-(void)update:(ccTime)delta
{

}

для постоянной проверки, столкнулась ли ballBody с другим телом, и с помощью акселерометра для перемещения ballBody.Итак, чтобы сбросить положение ballBody, я просто заменяю сцену, которая вызывает "dealloc", а затем снова запускает сцену.

[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]];
...