【问题标题】:creating combinations of obstacles in a 2D side scroller game在 2D 横向卷轴游戏中创建障碍物组合
【发布时间】:2014-01-10 21:15:49
【问题描述】:

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

                        }

                }
`

问题解决:(对于那些遇到过类似疑问的人)上面的代码解决了创建障碍物的随机组合并随机生成这些组合的问题。但如果您不想获得重叠组合,请检查冲突。

【问题讨论】:

  • 你有bug,比如第二个else if(triangle->GetAlive() == false),应该是else if(square->GetAlive() == false
  • 天哪! :O 我是一种特殊的愚蠢。 XD 让我们希望它是同样的问题。 brb
  • 不,问题仍然存在。就像如果你从中间垂直切割重叠,我们将有两个适当的半个三角形。

标签: c++ algorithm random 2d allegro5


【解决方案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);
}

由于你的形状是重叠的,要么修复你的初始化代码以初始化它们的方式

【讨论】:

  • 基勒,我试了一下。但不是出现在组合中,要么正方形与三角形重叠,要么三角形与正方形重叠。在这两种情况下,它们的 x 和 y 坐标都是相同的。
  • 我认为三角形的创建和正方形的创建之间存在一些冲突。没有三角形与其他三角形重叠。没有正方形与其他正方形重叠。但是任何一个三角形都与一个已经绘制的正方形重叠,或者一个正方形与一个已经绘制的三角形重叠。您能在我的三角形/正方形创建代码中看到任何错误吗?
  • 您使用了很多“幻数”。边界检查中的所有 15 和 40 实例看起来可疑且不一致。你在这些 if 语句中测试了很多东西,但你还没有记录你在那里实际检查的内容。
  • 如果您要添加代码,请将其添加到您的原始问题中,以便所有人都能看到。
  • 我重新编写了代码。而是上传它。我猜最后一个不是正确的实现方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2014-11-05
  • 1970-01-01
  • 2013-12-08
相关资源
最近更新 更多