c++ - 使用向量的突破碰撞检测
问题描述
我正在使用 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;
}
解决方案
根据评论,听起来您只需要一个包装器来抽象检测一组/一行砖块的碰撞。
所以我的建议是
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;
}
};
推荐阅读
- php - 获取第n级多维数组PHP中的键值
- java - Java 应用程序上的 Apache NetBeans IDE 9.0 构建失败
- xslt-2.0 - DITA 到 PDF 标题问题
- class - Access other Class method in Flutter/dart
- python - Qt for Python QCoreApplication:如何退出非 GUI 应用程序
- sql - 事务(进程 ID 62)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务
- cluster-computing - 如何在hazelcast的verticles集群中实现保持活动
- c - 在不同函数的回调中使用函数
- mysql - Error when selecting values with like and not like MySql
- node.js - 注册失败:TypeError:参数“url”必须是字符串,而不是对象