Вы даете всем своим шарам одну и ту же координату Y в линии
Ball.position = ccp(Ball.position.x, FullScreenDisplacement);
Как таковые, поскольку они также имеют одинаковую x-координату, они по определению будут находиться в том же месте (как вы описываете).
Кроме того, мне кажется, что ваша математика для принятия решения о смещении:
FullScreenDisplacement = ((NumberOfCollisions - 3) * -60) + (NumberOfCollisions * 60)
= (-60 * NumberOfCollisions) + 180 + (60 * numberOfCollisions)
= 180
Как видите, после некоторого упрощения ваше количество столкновений фактически уменьшается. Я думаю, что вы на самом деле хотите, чтобы сместить исходную y-координату каждого шара на ту же величину, на которую вы сместили свою печать (при условии, что она была смещена правильно). Я предполагаю, что ваши шары имеют высоту 60 пикселей (отсюда и коэффициент 60):
for (CCSprite *Ball in BallHasCollidedArray_)
{
if (NumberOfCollisions > 3)
{
FullScreenDisplacement = (NumberOfCollisions - 3) * -60;
Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);
}
}
Если это так, есть подозрение, что ваша печать, вероятно, также не в правильном положении, учитывая код, который вы опубликовали для этого. Если это так, то применяется тот же подход.
Наконец, вы заметите, что FullScreenDisplacement
является инвариантом цикла - его значение не изменяется ни в одной точке цикла. Таким образом, гораздо эффективнее рассчитать его только один раз, вне цикла. То же самое относится и к тесту if
.
if (NumberOfCollisions > 3)
{
FullScreenDisplacement = (NumberOfCollisions - 3) * -60;
for (CCSprite *Ball in BallHasCollidedArray_)
{
Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);
}
}
Кроме того, я не уверен, что делает эта функция ccp
, которую вы вызываете, но если она только создает новую позицию из аргументов, то следующее является гораздо более простым и эффективным эквивалентом:
Ball.position.y -= FullScreenDisplacement;
Надеюсь, все вышеперечисленное поможет. Если что-то не имеет смысла, или мои предложенные изменения не помогают, дайте мне знать, и я подправлю свой ответ, чтобы удовлетворить.