Позвольте мне подробнее остановиться на ответе Даффимо.
Помните, что метод CCLayer tick
содержит следующие коды?:
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(dt, velocityIterations, positionIterations);
Две переменные int32 сообщают box2D, сколько итераций (то есть проходов) нужно выполнить, чтобы приложить силы, обнаружить столкновения и т. Д. Согласно руководству box2D , увеличение этих значений повышает точность моделирования за счет затрат. производительности, и наоборот для уменьшения этих значений. Поэтому я бы посоветовал вам настроить эти значения, особенно положения позиции, до тех пор, пока вы не будете удовлетворены результатом.
EDIT:
Вот еще одно предложение. Помните еще раз, что метод tick
вызывается с той же скоростью, что и частота кадров в секунду, то есть максимум 60 в секунду? Это означает, что функция b2World::Step
выполняет дискретное моделирование с интервалами 1/60 секунды, поэтому быстро движущемуся телу удается пройти через другое тело, если для этого требуется меньше времени. Таким образом, чтобы решить эту проблему, вам нужно увеличить частоту дискретного моделирования, скажем, до 180 шагов в секунду. Но вопрос в том, как? Cocos2D-iPhone вызывает метод tick
для каждого кадра, а увеличение частоты кадров (если это возможно) приведет к снижению производительности и потере всей вычислительной мощности.
Вот как вы можете сделать это без изменения частоты кадров, вызвав функцию b2World::Step
пару раз в течение одного такта:
int32 velocityIterations = 8;
int32 positionIterations = 1;
uint substeps = 3;
float32 subdt = dt / substeps;
for (uint i = 0; i < substeps; i++) {
world->Step(subdt, velocityIterations, positionIterations);
// do your physics-related stuff inside here but leave any sprites manipulation outside this loop
}