применяя гравитацию нуля только к одному спрайту в мире - PullRequest
0 голосов
/ 02 июля 2011

У меня есть мир в cocos2d с box2d, который имеет гравитацию.Теперь, чтобы добавить тело для каждого спрайта, я вызываю функцию и отправляю ей спрайт.

sprite1, должен двигаться в соответствии с гравитацией, но sprite2 должен быть статичным, без гравитации, до тех пор, пока sprite1ударить его, тогда мировые силы должны воздействовать на него.

как мне установить только спрайт1 / гравитацию тела равным нулю, пока другой спрайт не ударит его?

моя проблема в том, что все спрайты используютта же функция для тела:

- (void)addBoxBodyForSprite:(CCSprite *)sprite {

    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    spriteBodyDef.position.Set(sprite.position.x/PTM_RATIO,sprite.position.y/PTM_RATIO);
    spriteBodyDef.userData = sprite;
    spriteBody = world->CreateBody(&spriteBodyDef);

    b2PolygonShape spriteShape;
    spriteShape.SetAsBox(sprite.contentSize.width/PTM_RATIO/2,sprite.contentSize.height/PTM_RATIO/2);
    b2FixtureDef spriteShapeDef;
    spriteShapeDef.shape = &spriteShape;
    spriteShapeDef.density = 10.0;
    spriteShapeDef.isSensor = true;
    spriteBody->CreateFixture(&spriteShapeDef);

}

Я хочу применить гравитацию в начале только для sprite1, НО я хочу также создать тело для sprite2, потому что позже это будет зависеть от мира.

Итак, после создания 2 тел при запуске, как я могу остановить падение только sprite2?
Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Я обычно использую SetActive () чаще всего, но для ваших нужд я думаю, что SetAwake () - это то, что вам нужно.

b2Body.h

/// You can disable sleeping on this body. If you disable sleeping, the
/// body will be woken.
void SetSleepingAllowed(bool flag);

/// Is this body allowed to sleep
bool IsSleepingAllowed() const;

/// Set the sleep state of the body. A sleeping body has very
/// low CPU cost.
/// @param flag set to true to put body to sleep, false to wake it.
void SetAwake(bool flag);

/// Get the sleeping state of this body.
/// @return true if the body is sleeping.
bool IsAwake() const;

/// Set the active state of the body. An inactive body is not
/// simulated and cannot be collided with or woken up.
/// If you pass a flag of true, all fixtures will be added to the
/// broad-phase.
/// If you pass a flag of false, all fixtures will be removed from
/// the broad-phase and all contacts will be destroyed.
/// Fixtures and joints are otherwise unaffected. You may continue
/// to create/destroy fixtures and joints on inactive bodies.
/// Fixtures on an inactive body are implicitly inactive and will
/// not participate in collisions, ray-casts, or queries.
/// Joints connected to an inactive body are implicitly inactive.
/// An inactive body is still owned by a b2World object and remains
/// in the body list.
void SetActive(bool flag);

/// Get the active state of the body.
bool IsActive() const;

Это должно быть все, что вам нужно.

1 голос
/ 02 июля 2011

Вы можете попробовать добавить в пространство только тот спрайт, на который вы хотите воздействовать миром, а затем добавить тот, на который вы хотите, чтобы мир влиял.

Таким образом, в этом случае добавьте Sprite1 в ваше пространство, но не Sprite2, позже вы можете добавить Sprite2, чтобы на него влияло пространство.

...