gpt4 book ai didi

c++ - 如何在 SFML 2.5.0 中进行两个 RectangleShape 之间的碰撞? (C++)

转载 作者:行者123 更新时间:2023-11-28 01:30:44 24 4
gpt4 key购买 nike

所以我对使用 SFML 进行编码比较陌生,如果我犯了一些新手错误,我深表歉意。我的项目是 SFML 中的 Space Invaders。当我在拍摄时,出现了一个问题。我该怎么做碰撞?我熟悉 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 类,这很容易。只需检索两个对象的矩形作为全局边界并尝试将它们相交:

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);`

关于c++ - 如何在 SFML 2.5.0 中进行两个 RectangleShape 之间的碰撞? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51630900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com