2014-01-10 2 views
0

Моя первая игра в ALLEGRO 5 с C++.создание комбинаций препятствий в 2D-скроллер-игре

У игрока есть постоянный ход в правильном направлении. С правого края экрана игрок сталкивается с препятствиями, как треугольники и квадраты. Эти препятствия оживают на правом краю экрана и умирают на левом краю экрана.

Предположим, что X - треугольник, а O - квадрат.

я хочу, чтобы создать их в нескольких комбинациях как

.. {х} {хо} {} {xoox OXXO} {} ахх ... И некоторые вариации (случайные возможно)

И после того, как что я буду рандомизировать происхождение этого шаблона.

SO Я нашел способ реализовать то, что я хотел. Я использовал переключатель() для случайного выбора различных комбинаций. Это работает очень хорошо. Но раз в то время он перекрывал даже после того, как я ввел минимальный зазор XOFF

Вот код:

`//I have used srand(time(NULL)); once in main function too. 


    if(state == PLAYING) 
     { 

      ball->Moveball(); 
       ball->Jumpball(); 

       //Camera----------- 
       ball->Cameraupdate(); 
       al_identity_transform(&camera); 
       al_translate_transform(&camera,-Cameraposition[0],-Cameraposition[1]); 
       al_use_transform(&camera); 



       if(rand() % 200==0) 
       { 

        xoff+=200;// to introduce a minimum gap between them but this also fail once in a while. 
        int ch; 
        ch=rand()%4; 
         switch(ch) 
         { 

         case 0: 
         //T 

         triangle = new Triangle(850 + Cameraposition[0]+xoff,319); 
         objects.push_back(triangle); 
         triangle->SetAlive(true); 

         break; 

         case 1: 
         //TT 

         triangle = new Triangle(850 + Cameraposition[0]+xoff,319); 
         objects.push_back(triangle); 
         triangle->SetAlive(true); 
         triangle = new Triangle(850 +30+ Cameraposition[0]+xoff,319); 
         objects.push_back(triangle); 
         triangle->SetAlive(true); 
         break; 

         case 2: 
         //S 

         square = new Square(850 + Cameraposition[0]+xoff,310); 
         objects.push_back(square); 
         square->SetAlive(true); 

         break; 

         case 3: 
         //SS 

         square = new Square(850 + Cameraposition[0]+xoff,310); 
         objects.push_back(square); 
         square->SetAlive(true); 
         square = new Square(850 +82+ Cameraposition[0]+xoff,310); 
         objects.push_back(square); 
         square->SetAlive(true); 

         break; 

         } 

       } 
` 

Проблема решена: (Для тех, кто испытал подобное сомнение) Приведенный выше код решает проблему создания случайной комбинации препятствий и случайного создания этих комбинаций. Но проверьте наличие коллизий, если вы не хотите получать совпадающие комбинации.

+0

У вас есть ошибки, как и второе 'еще если (triangle-> GetAlive() == false) ', который должен быть' else if (square-> GetAlive() == false'. – Keeler

+0

Holy moly!: OI - это глупость особого вида. XD Надеюсь, что та же проблема. brb – user3183363

+0

Нет, проблема по-прежнему существует. Как будто вы разрезаете это перекрытие по вертикали от середины, у нас будет две правильные половины треугольника. – user3183363

ответ

0

Просто добавьте еще один цикл:

void createObstacles(int numObstacles) 
{ 
    for(int i = 0; i < numObstacles; i++) 
    { 
     if(rand() % 2 == 0) 
     { 
      // Create a triangle. 
     } 
     else 
     { 
      // Create a square. 
     } 
    } 
} 

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

Теперь вы можете сделать:

if(rand() % 200 == 0) 
{ 
    // Create anywhere from 1 to maxToCreate (which is 4) obstacles at a time. 
    const int maxToCreate = 4; 
    int numToCreate = (rand() % maxToCreate) + 1; 

    // Call the function to make some obstacles. 
    createObstacles(numToCreate); 
} 

Поскольку ваши формы накладываются друг на друга, либо исправить код инициализации для инициализации им путь

+0

Килер, я попробовал. Но вместо того, чтобы входить в комбо, квадраты перекрывают треугольники или треугольники перекрывают квадраты. В обоих случаях их координаты x и y одинаковы. – user3183363

+0

Я думаю, что существует некоторый конфликт между созданием треугольников и квадратов. Треугольник не перекрывает другой треугольник. Никакой квадрат не перекрывает другой квадрат. Но либо треугольник перекрывает квадрат, который уже нарисован, либо квадрат перекрывает уже нарисованный треугольник. Вы видите какую-либо ошибку в коде для создания треугольника/квадрата? – user3183363

+0

Вы используете множество «магических чисел». Все эти экземпляры 15 и 40 в вашей проверке границ выглядят подозрительными и непоследовательными. Вы тестируете много вещей в этих операциях if, но вы не задокументировали, что вы на самом деле проверяете там. – Keeler