Sfml碰撞:当玩家击中一个正方形时,他只是停止移动 我决定在C++和SFML中进行碰撞测试。但是当玩家击中方块时,你就不能再移动了。我没有任何关于如何进行碰撞的问题,但是当我真的发生碰撞时该怎么做

Sfml碰撞:当玩家击中一个正方形时,他只是停止移动 我决定在C++和SFML中进行碰撞测试。但是当玩家击中方块时,你就不能再移动了。我没有任何关于如何进行碰撞的问题,但是当我真的发生碰撞时该怎么做,c++,sfml,C++,Sfml,这是我的密码: #include <SFML/Graphics.hpp> #include <iostream> #include <thread> using namespace std; using namespace sf; RenderWindow window(VideoMode(500, 500), "SFML"); RectangleShape r1; RectangleShape r2; void collision(){ r1.se

这是我的密码:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <thread>

using namespace std;
using namespace sf;

RenderWindow window(VideoMode(500, 500), "SFML");

RectangleShape r1;
RectangleShape r2;

void collision(){

r1.setSize(Vector2f(50.0, 50.0));
r2.setSize(Vector2f(50.0, 50.0));

r1.setPosition(20, 200);
r2.setPosition(420, 200);

r1.setFillColor(Color::Red);
r2.setFillColor(Color::Blue);
}

int main(){

collision();

while (window.isOpen()){
    Event event;

    while (window.pollEvent(event)){

        if (event.type == Event::Closed){
            window.close();
        }
    }

        if (Keyboard::isKeyPressed(Keyboard::W))
            if (!r1.getGlobalBounds().intersects(r2.getGlobalBounds()))
                r1.move(0.0, -0.05);

        if (Keyboard::isKeyPressed(Keyboard::A))
            if (!r1.getGlobalBounds().intersects(r2.getGlobalBounds()))
                r1.move(-0.05, 0.0);

        if (Keyboard::isKeyPressed(Keyboard::S))
            if (!r1.getGlobalBounds().intersects(r2.getGlobalBounds()))
                r1.move(0.0, 0.05);

        if (Keyboard::isKeyPressed(Keyboard::D))
            if (!r1.getGlobalBounds().intersects(r2.getGlobalBounds()))
                r1.move(0.05, 0.0);

    window.draw(r2);
    window.draw(r1);

    window.display();
    window.clear();
}
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间sf;
渲染窗口(视频模式(500500),“SFML”);
矩形r1;
矩形r2;
无效碰撞(){
r1.设置大小(矢量2f(50.0,50.0));
r2.设置大小(矢量2F(50.0,50.0));
r1.设置位置(20,200);
r2.设定位置(420200);
r1.设置填充颜色(颜色:红色);
r2.setFillColor(颜色:蓝色);
}
int main(){
碰撞();
while(window.isOpen()){
事件;
while(window.pollEvent(事件)){
if(event.type==event::Closed){
window.close();
}
}
如果(键盘::isKeyPressed(键盘::W))
如果(!r1.getGlobalBounds().相交(r2.getGlobalBounds()))
r1.移动(0.0,-0.05);
如果(键盘::isKeyPressed(键盘::A))
如果(!r1.getGlobalBounds().相交(r2.getGlobalBounds()))
r1.移动(-0.05,0.0);
如果(键盘::isKeyPressed(键盘::S))
如果(!r1.getGlobalBounds().相交(r2.getGlobalBounds()))
r1.移动(0.0,0.05);
如果(键盘::isKeyPressed(键盘::D))
如果(!r1.getGlobalBounds().相交(r2.getGlobalBounds()))
r1.移动(0.05,0.0);
窗口绘制(r2);
窗口绘制(r1);
window.display();
window.clear();
}
}
再一次,我想知道如何正确地移动你的球员,使之在你不能进入一个物体时

提前谢谢

另外,请不要告诉我“呃,你的密码太可怕了,你的括号太糟糕了……”我知道。有点乱,好吗


谢谢。

您的问题是,您只允许玩家在其边界与第二个对象的边界不相交的情况下移动,因此当您第一次与该对象碰撞时,您不能再移动到其边界之外

你需要做的是在玩家与物体碰撞时将其向后移动

例如:

if (Keyboard::isKeyPressed(Keyboard::W)) {
    sf::FloatRect& intersection;
    if (r1.getGlobalBounds().intersects(r2.getGlobalBounds(), intersection) {
        r1.move(0.0, intersection.height);
    }
    else {
        r1.move(0.0, -0.05);
    }
}
intersects方法允许您传入对sf::Rect的引用,如果玩家的边界与第二个对象的边界相交,则相交将存储在Rect中


这允许您将玩家向后移动所需的空间量,以便对象不再相交,玩家可以再次移动。

杰克·爱德华兹回答的问题是,相交控制在移动命令之前。但首先精灵必须移动,然后是交叉口控制。若有交叉点,精灵必须向后移动

if (Keyboard::isKeyPressed(Keyboard::W)){
                r1.move(0.0, -0.05);
            if (r1.getGlobalBounds().intersects(r2.getGlobalBounds()))
                r1.move(0.0, +0.05);}

还是不行!玩家僵住了!或者它是有效的,但不总是有效的。好吧,我发现为什么玩家有时会被卡住是因为他进入了立方体。当他这么做的时候,按下任何一个行走键都会把他推到别处。我怎样才能让他不进入立方体?