Удалить спрайт с экрана cocos2d iphone? - PullRequest
3 голосов
/ 03 марта 2011

У меня есть игра, которую я написал.Я почти готов закончить, но обнаружил ошибку.В основном игра становится медленнее, чем дольше вы играете.Я думаю, это связано со спрайтами, которые все еще выводятся за пределы экрана.Я вставлю код ниже, но в основном спрайт создается методом «addNewBall».В этом методе он добавляется в массив, который вычисляет его движение.После того, как мяч достигнет положения, когда он находится за пределами экрана, он удаляется из массива, что приводит к тому, что он перестает двигаться, но он все еще «вытягивается» за пределы экрана.Как убрать спрайт, чтобы процессор больше не вычислял его.Заранее благодарим за помощь!

Таннер

Код:

-(void) addNewBall {
    NumberOfBalls = NumberOfBalls + 1;  

    int RandomXPosition = (arc4random() % 240) + 40;
    NSString *BallFileString = @"OrangeBall.png";

    switch (arc4random() % 5) {
        case 1:
            BallFileString = @"OrangeBall.png";
            break;
            case 2:
                BallFileString = @"GreenBall.png";
                break;
            case 3:
                BallFileString = @"YellowBall.png";
                break;
            case 4:
                BallFileString = @"PinkBall.png";
                break;
            case 0:
                BallFileString = @"BlueBall.png";
                break;
    }


    Ball = [CCSprite spriteWithFile:BallFileString];
    Ball.position = ccp(RandomXPosition, 520);

    BallIsMoving = YES;
    [self addChild:Ball z:10];
    [AllObjectsArray_ addObject:Ball];
    [BallArray_ addObject:Ball];

}


//And here is where it is removed...


if (Ball.position.y <= -100) {

[BallArray_ removeObject: Ball];
}

Ответы [ 3 ]

8 голосов
/ 03 марта 2011

В вашем методе удаления вы, кажется, отсутствуют некоторые условия. Разве вы не хотите удалить шарик, если его позиция y больше высоты экрана или если его позиция x находится вне экрана? В любом случае, в том же месте, где вы удаляете шарик из массива, вы должны добавить:

[self removeChild:Ball cleanup: YES]

Я также должен указать, что ваш BallArray, вероятно, избыточен, так как вы все равно добавляете все шары в другой узел. Если единственными дочерними элементами этого узла являются Ball s, вы можете получить массив шаров, используя его свойство children. В этом случае дочерний массив будет: self.children (см. http://www.cocos2d -iphone.org / api-ref / latest-stable / interface_c_c_node.html # a5e739ecda0c314283a89ac389dfca2fa для получения дополнительной информации.)

Если у вас есть дочерние элементы, отличные от Ball, на одном и том же узле, вы можете добавить промежуточный узел, чтобы упростить конструкцию, чтобы можно было использовать на один массив меньше.

3 голосов
/ 03 марта 2011

Вы сказали, что удаляете объекты из массивов, но не упомянули, что также удаляете спрайт из родительского CCNode.

Проверьте методы из CCNode для удаления дочерних элементов: http://www.cocos2d -iphone.org / api-ref / latest-stable / interface_c_c_node.html # a0d4e615f688458c74001acf10f0ae011

Вы можете использовать:

[Ball removeFromParentAndCleanup:YES];

Это удалит шар изродительский CCNode и удалит все действия и обратные вызовы.

1 голос
/ 30 августа 2014

Вам нужно указать свой спрайт, и вы можете использовать эту следующую строку .. [self removeChild: Очистка мяча: ДА]

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