如何在 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;
    }
  }
}