如何在 SFML 2.5.0 中进行两个 RectangleShape 之间的碰撞? (C++)
How do I do collision between two RectangleShapes in SFML 2.5.0? (C++)
所以我对使用 SFML 进行编码比较陌生,如果我犯了一些新手错误,我深表歉意。我的项目是 Space Invaders in SFML。当我在拍摄时,出现了一个问题。我该怎么做碰撞?我熟悉 shape.getGlobalBounds().intersect(),它在以前的项目中起作用。它没有用。所以我试着简化它。我将 RectangleShape 用于敌人形状和子弹形状。
这是碰撞的实际 for 循环:
for (int y = 0; y <= 2; ++y) {
for (int x = 0; x <= 6; ++x) {
if (shootShape.getPosition().x < e.aliensX[x] && shootShape.getPosition().x > e.aliensX[x] + 15 ||
shootShape.getPosition().y < e.aliensY[y] && shootShape.getPosition().y > e.aliensY[y] + 15) {
e.aliensX[x] = -10;
e.aliensY[y] = -10;
shooting = false;
reload = false;
}
}
}
这是拍摄功能:
void Player::shoot() {
if (reload) {
shootX = posX + 5;
shootY = posY - 50;
shootShape.setPosition(shootX, shootY);
shooting = true;
reload = false;
}
if (shooting) {
shootY -= 150 * 2 * deltaTime;
shootShape.setPosition(shootX, shootY);
}
}
这就是我绘制敌人的方式(我不知道如何创建多个敌人):
void Enemy::drawAliens() {
for (int j = 0; j <= arraySizeY; ++j) {
for (int i = 0; i <= arraySizeX; ++i) {
actualShape.setPosition(aliensX[i], aliensY[j]);
if (aliensY[i] <= p.shootY && aliensY[i] >= p.shootY) {
aliensX[i] = -10;
aliensY[i] = -10;
}
else {
win.draw(actualShape);
}
}
}
}
一些变量背后的解释:
aliensX 是一个数组,其中包含敌人的不同 x 位置。
aliensY 是一个数组,其中包含敌人的不同 y 位置。
shooting 是一个 bool 变量,当子弹行进时为真。
reload就是能不能开枪
编辑:
由于我创建敌人的方式,相交将不起作用。它们都是一个形状。我需要它与特定坐标一起工作,因为我不知道一次创建多个敌人的更好方法。如果有办法做到这一点,将不胜感激!
如果您依赖 SFML 的模板化 sf::Rect
class,这很容易。只需检索两个对象的矩形作为全局边界并尝试将它们相交:
const bool collides = firstDrawable.getGlobalBounds().intersect(secondDrawable.getGlobalBounds());`
同样可以用一个小的临时矩形来完成,你可以填充与 sf::Drawable
没有直接关联的动态值:
const sf::FloatRect bullet(x - width / 2, y - height / 2, width, height);
const bool collides = firstDrawable.getGlobalBounds().intersect(bullet);`
您的 if 语句永远不会为真。你有
shootShape.getPosition().x < e.aliensX[x] && shootShape.getPosition().x > e.aliensX[x] + 15.
您的 shootShape.getPosition().x
永远不能同时小于 e.aliensX[x]
和大于 e.aliensX[x] + 15
。这不可能。 y 位置也一样。将您的 if 语句更改为
for (int y = 0; y <= 2; ++y) {
for (int x = 0; x <= 6; ++x) {
if (shootShape.getPosition().x > e.aliensX[x] && shootShape.getPosition().x < e.aliensX[x] + 15 ||
shootShape.getPosition().y > e.aliensY[y] && shootShape.getPosition().y < e.aliensY[y] + 15) {
e.aliensX[x] = -10;
e.aliensY[y] = -10;
shooting = false;
reload = false;
}
}
}
所以我对使用 SFML 进行编码比较陌生,如果我犯了一些新手错误,我深表歉意。我的项目是 Space Invaders in SFML。当我在拍摄时,出现了一个问题。我该怎么做碰撞?我熟悉 shape.getGlobalBounds().intersect(),它在以前的项目中起作用。它没有用。所以我试着简化它。我将 RectangleShape 用于敌人形状和子弹形状。
这是碰撞的实际 for 循环:
for (int y = 0; y <= 2; ++y) {
for (int x = 0; x <= 6; ++x) {
if (shootShape.getPosition().x < e.aliensX[x] && shootShape.getPosition().x > e.aliensX[x] + 15 ||
shootShape.getPosition().y < e.aliensY[y] && shootShape.getPosition().y > e.aliensY[y] + 15) {
e.aliensX[x] = -10;
e.aliensY[y] = -10;
shooting = false;
reload = false;
}
}
}
这是拍摄功能:
void Player::shoot() {
if (reload) {
shootX = posX + 5;
shootY = posY - 50;
shootShape.setPosition(shootX, shootY);
shooting = true;
reload = false;
}
if (shooting) {
shootY -= 150 * 2 * deltaTime;
shootShape.setPosition(shootX, shootY);
}
}
这就是我绘制敌人的方式(我不知道如何创建多个敌人):
void Enemy::drawAliens() {
for (int j = 0; j <= arraySizeY; ++j) {
for (int i = 0; i <= arraySizeX; ++i) {
actualShape.setPosition(aliensX[i], aliensY[j]);
if (aliensY[i] <= p.shootY && aliensY[i] >= p.shootY) {
aliensX[i] = -10;
aliensY[i] = -10;
}
else {
win.draw(actualShape);
}
}
}
}
一些变量背后的解释: aliensX 是一个数组,其中包含敌人的不同 x 位置。 aliensY 是一个数组,其中包含敌人的不同 y 位置。 shooting 是一个 bool 变量,当子弹行进时为真。 reload就是能不能开枪
编辑: 由于我创建敌人的方式,相交将不起作用。它们都是一个形状。我需要它与特定坐标一起工作,因为我不知道一次创建多个敌人的更好方法。如果有办法做到这一点,将不胜感激!
如果您依赖 SFML 的模板化 sf::Rect
class,这很容易。只需检索两个对象的矩形作为全局边界并尝试将它们相交:
const bool collides = firstDrawable.getGlobalBounds().intersect(secondDrawable.getGlobalBounds());`
同样可以用一个小的临时矩形来完成,你可以填充与 sf::Drawable
没有直接关联的动态值:
const sf::FloatRect bullet(x - width / 2, y - height / 2, width, height);
const bool collides = firstDrawable.getGlobalBounds().intersect(bullet);`
您的 if 语句永远不会为真。你有
shootShape.getPosition().x < e.aliensX[x] && shootShape.getPosition().x > e.aliensX[x] + 15.
您的 shootShape.getPosition().x
永远不能同时小于 e.aliensX[x]
和大于 e.aliensX[x] + 15
。这不可能。 y 位置也一样。将您的 if 语句更改为
for (int y = 0; y <= 2; ++y) {
for (int x = 0; x <= 6; ++x) {
if (shootShape.getPosition().x > e.aliensX[x] && shootShape.getPosition().x < e.aliensX[x] + 15 ||
shootShape.getPosition().y > e.aliensY[y] && shootShape.getPosition().y < e.aliensY[y] + 15) {
e.aliensX[x] = -10;
e.aliensY[y] = -10;
shooting = false;
reload = false;
}
}
}