В игре, которую я пытаюсь сделать, у меня есть спрайт с мячом, который отскакивает благодаря box2d. Вот как выглядит мой текущий код:
-(id)init
{
ball = [CCSprite spriteWithFile:@"ball.png"];
ball.position = ccp(150, winSize.height * 0.78);
[self addChild:ball];
ball.tag = 2;
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(150/PTM_RATIO, 450/PTM_RATIO);
ballBodyDef.userData = ball;
_body = _world->CreateBody(&ballBodyDef);
b2CircleShape circle;
circle.m_radius = 26.0/PTM_RATIO;
b2FixtureDef ballShapeDef;
ballShapeDef.shape = &circle;
ballShapeDef.density = 0.5f;
ballShapeDef.friction = 1.0f;
ballShapeDef.restitution = 1.0f;
_ballFixture = _body->CreateFixture(&ballShapeDef);
b2Vec2 force = b2Vec2(160, 375);
_body->ApplyLinearImpulse(force, ballBodyDef.position);}
- (void)update:(ccTime) dt {
if(_isPaused == FALSE)
{
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *)b->GetUserData();
if(sprite.tag == 2)
{
sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}}
Отскакивание само по себе работает нормально, моя проблема в том, что есть случаи, когда мяч подпрыгивал бы по прямой линии, так сказать, вертикально или горизонтально, чего я стараюсь избегать. Таким образом, мой вопрос, как я могу заставить мой шариковый спрайт подпрыгивать под углом, а не по прямой линии, чтобы он не застрял, подпрыгивая бесконечно в одном и том же направлении?
Вы можете применить крошечную силу или изменение гравитации к телу или миру, «случайно» или через равные промежутки времени.
Других решений пока нет …