Как смоделировать гравитацию для одного спрайта в cocos2d без физического движка? - PullRequest
1 голос
/ 23 августа 2011

Я бы хотел смоделировать "гравитацию" для одного спрайта.

Я определил CGPoint, который содержит значения гравитации. И у меня есть тик метод.

//in my init I defined this: gravity = ccp(0.0f, -1.0f);
-(void)tick:(ccTime) dt {
if (enableGravity_) {
    //simulate gravity
    velocity_.x += gravity_.x;
    velocity_.y += gravity_.y;
    self.position = CGPointMake(position_.x + velocity_.x, position_.y + velocity_.y);
}    
if (isAcceleratingEnabled_) { //I move my sprite here
    float angle = self.rotation;
    float vx = cos(angle * M_PI / 180) * acceleratingSpeed_;
    float vy = sin(angle * M_PI / 180) * -acceleratingSpeed_;
    CGPoint direction = ccp(vx, vy);

    [self setPosition:ccpAdd(self.position, direction)];
}

}

EDIT : проблема сейчас в том, что я перемещаю свой спрайт, если "isAccelerationEnabled" - ДА. И это не так гладко, когда я так двигаю спрайт. Если я переместлю свой спрайт вверх и отключу «isAcceleration», он больше не будет двигаться вверх, но сила тяжести мгновенно потянет мой спрайт вниз. Я не знаю, как использовать скорость с этим кодом:

[self setPosition:ccpAdd(self.position, direction)];

Теперь это не совсем гладкое решение для симуляции гравитации.

Это мгновенно применяет силу тяжести к спрайту.

Но я хочу, чтобы спрайт плавно падал. Как реальные объекты упали на землю.

Кстати: я также прикладываю некоторые повышающие силы к спрайту.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Проблема в том, что вы применяете гравитацию как скорость, а не как ускорение. Вам нужно дать вашему спрайту скорость, а затем сделать что-то вроде ...

sprite.velocity = ccp(self.velocity.x+gravity.x, self.velocity.y+gravity.y);
sprite.position = ccp(sprite.position.x+sprite.velocity.x, sprite.position.y+sprite.velocity.y);

Кроме того, если вы когда-либо будете выполнять гравитационное притяжение вниз, это не обязательно должно быть 2D, это может быть просто скаляр, который всегда применяется в отрицательном направлении Y.

0 голосов
/ 25 августа 2011

Теперь, когда вы ввели переменные скорости, элементы управления vx и vy также должны применяться к скорости, а не к положению. Это соответствует приложению постоянной силы к объекту, что вполне реалистично, но может не соответствовать желаемому типу управления.

Другой подход состоит в том, чтобы просто присвоить vx для velocity_.x и vy для velocity_.y в isAccelerationEnabled_ ветви. Это соответствует приложению настолько большой силы, сколько необходимо, когда вы активно контролируете объект. Если это выглядит слишком нереально, вы можете ограничить изменение скорости каким-либо максимальным значением.

...