Обращение к лицам одного и того же массива Cocos2D Iphone - PullRequest
0 голосов
/ 01 февраля 2011

Я работал над игрой для iphone и столкнулся с серьезной загадкой. Игра работает следующим образом: игрок управляет персонажем внизу экрана. Они перемещают персонажа вперед и назад, чтобы поймать шары, падающие с верхней части экрана. все эти шары являются частью массива, что заставляет их двигаться вниз по экрану. Все они имеют одинаковый указатель. *Мяч. Метод создает новые шары, когда его вызывают. Если шары сталкиваются с персонажем, они накладываются друг на друга. Для этого они удаляются из массива, который перемещает их, и добавляются в другой массив, который заставляет их становиться частью стека, делая их позицию X равной символам, а позицию Y - там, где она была, когда они сталкивались. Моя проблема в том, что стек становится выше, и весь экран должен прокручиваться вниз. Таким образом, персонаж исчезает с экрана, и с каждым дополнительным шариком нижний шарик также перемещается вниз и за пределы экрана. сохраняя только три шара на экране одновременно. Я попытался заставить второй массив переместить их вниз, но он помещает их все в одну и ту же позицию и, таким образом, уничтожает «стек». Ниже приведен мой метод обновления. пожалуйста, сообщите мне, как сделать эту работу. Я немного новичок в этом, поэтому я очень благодарен за хорошее объяснение !!

Спасибо Tanner

    if (CGRectIntersectsRect(SealRect, BallRect)) {

            BallIsMoving = NO;
            BallHasIntersectedSeal = NO;
            //BallIntersectedSeal = YES;
            [self CollisionRectUpdate];
            NumberOfCollisions = NumberOfCollisions + 1;
            Ball.position = ccp(SealSprite.position.x + 10, SealSprite.position.y + 20 + (NumberOfCollisions * 60));
            [BallArray_ removeObject: Ball];
            [BallHasCollidedArray_ addObject: Ball];

        }
}

for (CCSprite *Ball in BallHasCollidedArray_) {
    Ball.position = ccp(SealSprite.position.x + 10, Ball.position.y);

}
for (CCSprite *SealSprite in AllObjectsArray_) {

    if (NumberOfCollisions > 3) {

        FullScreenDisplacementSeal = (NumberOfCollisions - 4) * -60;

        if (SealSprite.position.y > FullScreenDisplacementSeal) { 

            SealSprite.position = ccp(SealSprite.position.x, SealSprite.position.y - 5);

        }
    }
}

for (CCSprite *Ball in BallHasCollidedArray_) {

    if (NumberOfCollisions > 3) {

        FullScreenDisplacement = (NumberOfCollisions - 4) * 60;
        Ball.position = ccp(Ball.position.x, Ball.position.y - FullScreenDisplacement);     
    }

}

}

Полагаю, мне нужен способ воздействовать на все "шары" в BallHasCollidedArray, одновременно воздействуя на каждый из них в отдельности. Это нужно выразить так, чтобы даже если было 5000 шаров, оно все равно работало.

1 Ответ

1 голос
/ 01 февраля 2011

Вы даете всем своим шарам одну и ту же координату 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...