Реализация бонусов для изменения всего состояния игры в cocos2d?

Недавно я задал вопрос, связанный с внедрением бонусов; однако я решил, что хочу пойти другим путем.

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

Когда игрок нажимает на синюю монету, усиление, я хочу, чтобы 1. персонаж изменился на синий цвет (у меня есть рамки для этого), 2. фон стал синим и 3. платформа стала синей. (есть изображения для этого); Я хотел бы, чтобы все эти факторы имели место в течение 20-секундного периода времени.

Я планировал сделать это с помощью класса Blue с переменной экземпляра blue (общедоступной переменной), для которой я установил бы YES и NO соответственно (если была выбита синяя монета). ) в других моих классах (класс платформы, класс игрока). Однако это неэффективно и не работает, когда я включаю таймер.

У кого-нибудь есть идея, как реализовать усиление?

Это мой код, когда игрок ударяет по синей монете:

    // try remove blue coin
    - (void) tryRemoveBluecoin
    {
    NSMutableArray * currentBluecoinArray = [self getcurrentBluecoinArr];

    if(currentBluecoinArray)
    {
        int playerY = ((CCLayer*)(self.player)).position.y;
        for(int x=0; x<[currentBluecoinArray count];x++)
        {
            CCSprite *bluecoin = [currentBluecoinArray objectAtIndex:x];

            if(abs(bluecoin.position.x+bluecoin.parent.position.x-[Player initX])<50)
            {
                if(abs(bluecoin.position.y+bluecoin.parent.position.y-playerY)<30 && bluecoin.visible && bluecoin.visible)
                {
                    [bluecoin.parent removeChild:bluecoin cleanup:YES];

                    CGSize winSize = [[CCDirector sharedDirector] winSize];
                    [[SimpleAudioEngine sharedEngine] playEffect:@"jump.wav" pitch:1 pan:0 gain:1];

                    // SET BLUE VARIABLE TO YES

                    NSLog(@"BEGIN BLUE POWER UP EFFECTS FOR 20 SECONDS");

                }
            }
        }
    }


    [self hitTestOB];
}

Спасибо за любые ваши идеи!


person Surz    schedule 08.11.2013    source источник


Ответы (1)


Итак, прошло некоторое время с тех пор, как я в последний раз использовал Cocos2d, но вы знаете, что на самом деле вы можете установить информацию о цвете для узлов, верно? Это звучит как гораздо более разумный способ спуститься вниз. Создавайте свои спрайты с учетом этого и держите массив со всеми элементами, которые вам нужно раскрасить.

Имейте метод, определяющий новый цвет на основе вашего состояния игры, например, перечисления состояния игры могут быть сопоставлены со свойством NSInteger для ваших бонусов. цвет ccColor3B;

// _state being an NSInteger ivar
// the different states defined in an enum

switch (_state) {
    case gameStateBlue:
        color = ccc3(0, 0, 255);
        break;
    case gameStateGreen:
        color = ccc3(0, 255, 0);
        break;
    default:
        break;

        // etc.
}

отправьте эту информацию о цвете методу, который обрабатывает ваш массив спрайтов следующим образом:

for (CCSprite *sprite in _arrayOfSpritesToChangeColor) {
    sprite.color = color; 
}

Это потребует предварительного планирования ваших активов, но гораздо большей гибкости в будущем, если вы хотите поэкспериментировать с различными цветами и эффектами. Это намного меньше налогов, и вам не нужно обменивать кучу активов, чтобы достичь того, чего вы хотите. Теперь мой Cocos довольно ржавый, поэтому я мог перепутать некоторые детали, но общая идея должна быть здоровой.

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

person T. Benjamin Larsen    schedule 08.11.2013
comment
Спасибо. К сожалению, это не cCSprites, это анимация! - person Surz; 09.11.2013
comment
анимация выполняется на спрайте, она меняет текстуру спрайта каждые пару кадров - person LearnCocos2D; 09.11.2013
comment
Итак, я могу сделать то же самое для анимации?... Могу ли я изменить состояние в одном классе и сделать его известным в другом классе? - person Surz; 09.11.2013
comment
Вам нужно будет сделать то же самое со спрайтами, составляющими анимацию. Пока состояние является общедоступным свойством, его должно быть просто обрабатывать из любого другого класса. - person T. Benjamin Larsen; 09.11.2013
comment
Извините, это должен быть спрайт, запускающий анимацию (сказал вам, что я ржавый), - person T. Benjamin Larsen; 09.11.2013