SpriteKit — Продолжаем писать игру Happy Airjet — Часть 9

В прошлой части сделали самое простое. Теперь сделаем плывущие облака. Облака создаются «в столбик», случайным образом выбирается количество облаков в столбике — либо 1, либо 2. Если выпало создание двух облаков, первое встает на случайную высоту, а второе на определенный отступ от первого. Также каждое облако имеет 3 различных формы, которые тоже выбираются случайным образом. Весь этот «столбик» создается за границей экрана, а потом получает анимацию и плывет в другой конец экрана. Когда облако становится невидимым на другом конце экрана, мы его «убиваем». Также каждому сгенерированному облаку мы задаем SKPhysicsBody, это для отлавливания столкновений с самолетом. Вроде понятно написал, попробую изобразить для визуалов.

CloudMap

Для простоты, предлагаю по «убиваемым» облакам обновлять счет в игре.
В Scene.m в метод didMoveToView вставляем (перед createScene=YES;) таймер для генератора облаков:

        //////////Создаем облака каждые 0,6 секунды
        SKAction *yo=[SKAction sequence:@[
                                          [SKAction runBlock:^{
                                                [self createCloud];
                                           }],
                                          [SKAction waitForDuration:0.6]]];

        [self runAction:[SKAction repeatActionForever:yo]];

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

-(float) randomFloatBetween:(float) min and:(float) max{
    float random =  ((rand()%RAND_MAX)/(RAND_MAX*1.0))*(max-min)+min;
    return random;
}

И теперь будем прописывать метод createCloud в Scene.m

-(void)createCloud
{
    //выбираем рандомно Y для первого облака, в переделах от моря (там где корабль плавает) и до верха
    float y=[self randomFloatBetween:190 and:self.size.height-20];
    




    //случайным образом выбираем тип облака из трех текстур
    NSString *cloudType;
    float rnd=[self randomFloatBetween:0 and:1];
    if (rnd<0.3) {
        cloudType=@"cloud1";
    }else if (rnd>0.7){
        cloudType=@"cloud2";
    }else{
        cloudType=@"cloud3";
    }
    
    //создаем спрайт с облаком и задаем ему имя и позицию
    SKSpriteNode *cloud = [SKSpriteNode spriteNodeWithImageNamed:cloudType];
    cloud.position = CGPointMake(self.size.width+50, y);
    cloud.name = @"CLOUD";
    
    
    //Анимация движения облака. И скорость - облако проплывает за 1.5 сек
    SKAction *yo=[SKAction sequence:@[
                                      [SKAction moveByX:-self.size.width-cloud.size.width-20 y:0 duration:1.5],
                                      [SKAction runBlock:^{
                                            [cloud removeFromParent];  //убиваем облако
                                            score++; //осчитываем очки в игре по убитым облакам
                                            [scoreLabel setText:[NSString stringWithFormat:@"Score %d", score]]; //вставляем счет в лэйбл для счета
                                            }]
                                      ]];
    
    
    
    [self addChild:cloud];  //добавляем облако на сцену
    [cloud runAction:yo];   //добавляем к облаку анимацию
    
    
    
    
    ////////////////ВТОРОЕ ОБЛАКО
    if ([self randomFloatBetween:0 and:1]<0.5){  //случайно выбираем делать его или не делать
        
        
        NSString *cloudType2; //случайно выбираем тип второго облака
        float rnd2=[self randomFloatBetween:0 and:1];
        if (rnd2<0.3) {
            cloudType2=@"cloud1";
        }else if (rnd2>0.7){
            cloudType2=@"cloud2";
        }else{
            cloudType2=@"cloud3";
        }
        
        //Далее надо определить куда воткнуть второе облако, ниже первого или выше. В зависимости от того, в какой части экрана находится первое облако.
        
        float y2=0;
        
        float k=(((self.size.height-20)-190)/2)+150;
        
        if (y>=k) {
            y2=y-180;
        }else{
            y2=y+180;
        }
        
        
        //И создаем второе облако
        //создаем спрайт с облаком и задаем ему имя и позицию
        SKSpriteNode *cloud2 = [SKSpriteNode spriteNodeWithImageNamed:cloudType2];
        cloud2.position = CGPointMake(self.size.width+50, y2);
        cloud2.name = @"CLOUD";
        
        [self addChild:cloud2];  //добавляем облако на сцену
        [cloud2 runAction:yo];   //добавляем к облаку анимацию
        
    }
    
    
}

Прокоментировал почти каждую строку, должно быть понятно. С вопросами велком в комменты. Запускайте проект и смотрите на летящие облака.

Должно получится что то вроде этого:
scene3

В следующей части будем работать с физикой — самолет ведь должен падать вниз )

  • Tima

    Отличная работа, друг! Жду, с нетерпением, следующий урок!

  • Pavel

    Класс, спасибо:) Было бы особенно классно, если бы написал еще уроки по менюшке и сохранении данных.
    Можешь объяснить, что значат эти вычисления по подробнее

    float k=(((self.size.height-20)-190)/2)+150;