【问题标题】:breakout collision detection using vectors使用向量的突破碰撞检测
【发布时间】:2020-01-17 17:52:13
【问题描述】:

我正在使用 C++ 和 OpenGL 开发一款突破性游戏。我已经使用直接 C++ 删除了一些代码。我正在使用向量来存储对象。

我想简化我的碰撞检测代码。我正在开发使用向量在基于文本的 c++ 中存储砖块值的突破游戏。好吧,我正在尝试将向量用作动态数组。基本上我想将砖块的值存储在一个向量中。然后我想遍历向量以确定砖是否被球击中。我能够检测到单个砖块是否被球击中,但我想确定砖块值的向量是否被球击中。换句话说,不是一次为每一个砖块使用碰撞检测循环,而是我希望向量存储砖块的值,以便我可以动态地遍历它们。

我的代码:

class Brick
{
public:
    float x;
    float y;
    float brick_x;
    float brick_y;
    float brickWidth;
    float brickHeight;
};

int main()
{
    vector<Brick> brick;
    Brick playerBrick;
    Brick playerBrick_two;

    playerBrick.x = 30.0f;
    playerBrick.y = 20.0f;
    playerBrick.brick_x = 20.0f;
    playerBrick.brick_y = 10.0f;
    playerBrick.brickWidth = 60.0f;
    playerBrick.brickHeight = 20.0f;

    playerBrick_two.x = 40.0f;
    playerBrick_two.y = 30.0f;
    playerBrick_two.brick_x = 30.0f;
    playerBrick_two.brick_y = 20.0f;
    playerBrick_two.brickWidth = 60.0f;
    playerBrick_two.brickHeight = 20.0f;

    brick.push_back(playerBrick);
    brick.push_back(playerBrick_two);

    for (int i = 0; i < 2; i++)
    {
        cout << brick[i].x << " " << brick[i].y << " " << brick[i].brick_x << " " << brick[i].brick_y << " " << brick[i].brickWidth << " " << brick[i].brickHeight << endl;
    }
    for (int i = 0; i < 2; i++)
    {
        if (brick[i].x > brick[i].brick_x && brick[i].x < brick[i].brick_x + brick[i].brickWidth && brick[i].y > brick[i].brick_y && brick[i].y < brick[i].brick_y + brick[i].brickHeight)
        {
            cout << "Collision" << endl;
        }
    }

void bricks_eight()
{
    glColor3f(0.8f, 0.0f, 0.0f);
    glRectf(50.0f, 60.0f, 70.0f, 50.0f);
    glRectf(70.0f, 60.0f, 90.0f, 50.0f);
    glRectf(90.0f, 60.0f, 110.0f, 50.0f);
    glRectf(110.0f, 60.0f, 130.0f, 50.0f);
    glRectf(130.0f, 60.0f, 150.0f, 50.0f);
    glRectf(150.0f, 60.0f, 170.0f, 50.0f);
}

好吧,我正在发布一排我想在球击中它们时消除的砖块。由于我有几排砖,我想使用碰撞检测功能,使用矢量检查球和砖的碰撞。 x 和 y 变量是球坐标,brick_x 和brick_y 变量是砖坐标。

我调整了 Makogan 的代码,但它仍然没有同时检查很多冲突。

``
class Brick
{
public:
    float x;
    float y;
    float brick_x=0.0f;
    float brick_y=0.0f;
    float brickWidth=20.0f;
    float brickHeight=10.0f;
    bool TestCollision(float x, float y)
    {
        if (x > brick_x && x<brick_x + brickWidth && y > brick_y && y < brick_y + brickHeight)
        {
            return true;
        }
        return false;
    }
};

class BrickLayer
{
public:
    vector<Brick> bricks{(5.0f,5.0f)};
    bool TestCollisions(float x, float y) {
        for (auto& brick : bricks) if (brick.TestCollision(x, y)) return true;
        return false;
    }
};

int main()
{
    BrickLayer brick;
    cout << brick.TestCollisions(5.0f,5.0f)<< endl;


    system("pause");
    return 0;
}

【问题讨论】:

  • 您需要更具体地说明所需的输出和当前输出是什么,如果可以,请提供一个重现问题的最小工作示例。
  • 我仍然不是 100% 的你想要达到的目标。阅读您的问题,听起来您可以遍历数组,检测与每块砖的碰撞并将结果存储在另一个向量中。
  • 我试图同时检测所有砖块的碰撞,而不仅仅是每个砖块的一个碰撞函数。我使用向量的原因是因为我可以动态测试每次碰撞,而无需数组的所有开销。
  • 数组和向量本质上是一回事,唯一的区别是向量的大小是动态的,所以我不确定你所说的开销是什么意思,它们具有完全相同的行为。 “我试图同时检测所有砖块的碰撞,而不仅仅是每个砖块的一个碰撞函数” 所有碰撞的集合与包含集合中一个碰撞的单例集合的并集相同。在计算上,您无法避免必须按顺序测试碰撞。我假设你的问题是你的循环很慢,对吗?
  • 我有很多积木要测试,所以我需要一个简单易用的碰撞检测功能。

标签: c++


【解决方案1】:

根据 cmets,听起来您只需要一个包装器来抽象检测一组/一行砖块的碰撞。

所以我的建议是

class Brick
{
public:
    float x;
    float y;
    float brick_x;
    float brick_y;
    float brickWidth;
    float brickHeight;
    TestCollision(float x,float y) {/* check goes here */}
};

class BrickLayer
{
public:
    vector<Brick> bricks;
    float min_x;
    float min_y;
    float total_width;
    float total_height;

    BrickLayer(vector<Brick> bricks) {/* initialize the instance fields here */}
    // Option 1, iterating over every brick:
    bool TestCollisions(float x, float y) {
        for(auto& brick : bricks) if(brick.testCollision(x,y)) return true;
         return false;
    }
    // Option 2, use cached information:
    bool TestCollisions(float x, float y) {
       if (x > min_x && x < min_x + total_width && y > min_y && y < min_y + total_height)
        return true;
    }

};

【讨论】:

  • @gamer67 当然只有单一的TestCollission 检查不会测试与多个砖块的碰撞。它只测试与一个的碰撞。让我更具体地回答我的问题,看看是否有帮助。
  • 我的问题是我有很多砖块要检查碰撞,我想使用一种更有效地检查碰撞的算法。
  • 我正在努力解决这个问题,让我非常具体地知道我可以为您提供什么帮助。
  • 嗯,我给你的算法的第二个版本需要更长的时间来初始化,但是碰撞测试会更有效。
  • 主要问题是它是否适合您。如果是,请接受答案,并最好给予支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多