在2D侧卷轴游戏中创建障碍物的组合

时间:2014-01-10 21:15:50

标签: c++ algorithm random 2d allegro5

我在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;

                        }

                }
`
  

问题解决了:(对于那些经历过类似疑问的人)上面的代码解决了创建随机障碍组合并随机生成这些组合的问题。但如果您不想获得重叠组合,请检查是否存在碰撞。

1 个答案:

答案 0 :(得分:0)

只需添加另一个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);
}

由于形状重叠,要么修复初始化代码,要么按照

的方式初始化它们