создание комбинаций препятствий в 2D-игре с боковой прокруткой

Моя первая игра в ALLEGRO 5 на c++.

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

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

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

..{x} {xo} {xoox} {oxxo} {oxx}... И некоторые варианты (возможно, случайные)

И после этого я рандомизирую появление этих шаблонов.

Итак, я нашел способ реализовать то, что хотел. Я использовал switch() для случайного выбора различных случаев комбинации. Это работает очень хорошо. Но время от времени он перекрывается даже после того, как я ввел минимальный зазор 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;

                        }

                }
`

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


person user3183363    schedule 10.01.2014    source источник
comment
У вас есть ошибки, например, второй else if(triangle->GetAlive() == false), который должен быть else if(square->GetAlive() == false.   -  person Keeler    schedule 11.01.2014
comment
Святая мольба! :O Я глуп особого рода. XD Будем надеяться, что это та же проблема. брб   -  person user3183363    schedule 11.01.2014
comment
Нет, проблема все еще существует. Это похоже на то, что если вы разрежете это перекрытие по вертикали от середины, у нас будет две правильные половины треугольника.   -  person user3183363    schedule 11.01.2014


Ответы (1)


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

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);
}

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

person Keeler    schedule 10.01.2014
comment
Киллер, я попробовал. Но вместо комбинаций либо квадраты накладываются на треугольники, либо треугольники накладываются на квадраты. В обоих случаях их координаты x и y одинаковы. - person user3183363; 11.01.2014
comment
Я думаю, что есть некоторый конфликт между созданием треугольников и созданием квадратов. Ни один треугольник не пересекается с другим треугольником. Ни один квадрат не перекрывает другой квадрат. Но либо треугольник перекрывает уже нарисованный квадрат, либо квадрат перекрывает уже нарисованный треугольник. Вы видите ошибку в моем коде создания треугольника/квадрата? - person user3183363; 11.01.2014
comment
Вы используете много «магических чисел». Все эти случаи 15 и 40 в вашей проверке границ выглядят подозрительно и непоследовательно. Вы тестируете много вещей в этих операторах if, но вы не задокументировали, что вы там проверяете на самом деле. - person Keeler; 11.01.2014
comment
Если вы собираетесь добавить код, добавьте его к исходному вопросу, чтобы всем было легко его увидеть. - person Keeler; 11.01.2014
comment
я переработал код. загружая его вместо этого. Последний, я думаю, был неправильным методом для достижения. - person user3183363; 12.01.2014
comment
Я бы не хотел, чтобы кто-то, кто ищет на сайте такую ​​же проблему, как и я, наткнулся на неверный код. - person user3183363; 12.01.2014