Эффективным подходом без явного использования какого-либо физического движка является ручное изменение скорости и положения вашего спрайта в цикле обновления. По сути, это интегрирование по Эйлеру.
// define your gravity value
#define GRAVITY -0.1
// define a velocity variable in the header of your Game class/CCSprite Subclass (neater)
float velocity_y;
-(void) update: (ccTime) dt
{
// Step the y-velocity by your acceleration value (gravity value in this case)
velocity_y += GRAVITY *dt; // drop the dt if you don't want to use it
// Step the position values and update the sprite position accordingly
sprite.position.y += velocity_y* dt; // same here
}
В приведенном выше фрагменте кода я определил переменную Velocity_y, чтобы отслеживать текущую скорость моего спрайта по оси Y. Не забудьте инициализировать это значение равным 0 в вашем методе инициализации.
Далее идет суть Эйлера. На каждом временном шаге:
- Увеличьте свою скорость на свое ускорение (которое является вашей гравитацией), умноженное на dt, чтобы найти новую скорость.
- Переместите свою позицию на новое вычисленное значение скорости, умноженное на dt, чтобы найти новую позицию.
Вы можете поэкспериментировать, работает ли использование дельта-времени для вашей игры или нет (см. отличный комментарий LearnCocos2D о минусах его использования). Хотя умножение на дельта-время позволяет вашему движению объекта более точно учитывать различную частоту кадров, как указал LearnCocos2d, было бы разумно избегать его использования в игре в реальном времени, где системные прерывания (новая почта, низкий заряд батареи, всплывающая реклама) -out) может произойти, что впоследствии приведет к тому, что симуляция игры перескочит вперед в попытке наверстать упущенное.
Поэтому, если вы опускаете dt, не забудьте соответствующим образом настроить (уменьшить) значение GRAVITY, чтобы сохранить правильное ощущение, поскольку это значение больше не умножается на значение дельта-времени (которое составляет ~ 1/60).
Дополнительный совет: чтобы применить импульс для перемещения спрайта (скажем, с помощью свайпа), вы можете напрямую влиять на скорости, изменяя значения Velocity_x (если они у вас есть) и Velocity_y.
Я использовал этот подход в своих играх, и он работает очень хорошо. Надеюсь, поможет.
person
Ken Toh
schedule
14.07.2012