简体   繁体   English

蛇游戏与尾巴碰撞

[英]Snake game collision with tail

I'm having a problem with the TailCollision function in my snake game. 我的蛇游戏中的TailCollision函数遇到问题。 Right now it doesn't work at all. 现在,它根本不起作用。 Other than that the snake is drawn and moves perfectly. 除此之外,蛇被抽出并完美地移动。 Thanks in advance to whoever points out where i goofed ^-^ 在此先感谢那些指出我犯了错误的人^-^

Em i'm new to sfml and using a vector... pretty much my first time so please don't be too harsh! EM我是sfml的新手,正在使用向量...这是我第一次来,所以请不要太苛刻!

Here is my Snake.cpp 这是我的Snake.cpp

#include "Snake.h"


Snake::Snake(){

    Snakey.setSize(sf::Vector2f(10, 10));

    Snakey.setFillColor(sf::Color(0,255,0));


    enter code here
    Snakey.setPosition(180,60);

    BodyList.push_back(Body);

}


Snake::~Snake(){
    BodyList.clear();
}

void Snake::Draw(sf::RenderWindow &window){

    window.draw(Snakey);

    for (sf::RectangleShape& Body : BodyList){

    window.draw(Body);
    }

    BodyList.erase(BodyList.begin());
    BodyList.push_back(Body);

}

void Snake::Grow(){

    Body.setSize(sf::Vector2f(10, 10));

    Body.setFillColor(sf::Color(0,100,0));

    Body.setPosition(Snakey.getPosition().x,Snakey.getPosition().y);

    BodyList.push_back(Body);


}



void Snake::Move(sf::Event event, sf::RenderWindow &window){

    if (sf::Keyboard::isKeyPressed && sf::Keyboard::Left == event.key.code && Dir != "Right"){
        Snakey.move(-10, 0);
        Body.move(-10,0);
        Dir = ("Left");
    }

    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Right == event.key.code && Dir != "Left"){
        Snakey.move(10, 0);
        Body.move(10,0);

        Dir = ("Right");
    }
    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Up == event.key.code && Dir != "Down"){
        Snakey.move(0, -10);
        Body.move(0,-10);

        Dir = ("Up");
    }
    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Down == event.key.code && Dir != "Up"){
        Snakey.move(0, 10);
        Body.move(0,10);

        Dir = ("Down");
    }

    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Down == event.key.code && Dir == "Up" || 
        sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Up == event.key.code && Dir == "Down" ||
        sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Right == event.key.code && Dir == "Left"||
        sf::Keyboard::isKeyPressed && sf::Keyboard::Left == event.key.code && Dir == "Right"){

        window.close();
    }
}

void Snake::TailCollision(sf::RenderWindow &window){

    for (int i = 0 ; i < BodyList.size(); i++){
        if ((Snakey.getPosition().x == BodyList[i].getPosition().x && Snakey.getPosition().y == BodyList[i].getPosition().y)&&
            (BodyList[i].getPosition().x != BodyList.back().getPosition().x &&
            BodyList[i].getPosition().y != BodyList.back().getPosition().y)){

                window.close();

        }

    }
}


sf::RectangleShape Snake::GetShape(){
    return Snakey;
}

I think it is better to use SFML built-in functions, like getGlobalBounds() . 我认为最好使用SFML内置函数,例如getGlobalBounds() If Snakey is a sf::Shape subclass (I hope it is), it should work. 如果Snakey是sf::Shape子类(我希望是),它应该可以工作。

const auto & headBounds = Snakey.getGlobalBounds();
for (int i = 0 ; i < BodyList.size(); i++)
{
    const auto & bodyBounds = BodyList[i].getGlobalBounds();
    if( bodyBounds.intersects( headBounds ) 
    {
        // process collision here
        break;
    }
}

Or even a bit shorter, as suggested in comments: 甚至更短,如注释中所建议:

const auto & headBounds = Snakey.getGlobalBounds();
if( 
    std::any_of(
            BodyList.begin()
        ,   BodyList.end()
        ,   [ headBounds ] ( const auto & body ) 
            {
                return body.getGlobalBounds().intersects( headBounds );
            }
   )
)
{
    // process collision;
}

I've realised the problem was with my move function and not even the collision one! 我已经意识到问题出在我的移动功能上,甚至没有碰撞! Thank you all and I'm sorry to waste your time! 谢谢大家,很抱歉浪费您的时间! ^-^ I really goofed... ^-^我真的好讨厌...

Snake::Snake(){

    Snakey.setSize(sf::Vector2f(10, 10));

    Snakey.setFillColor(sf::Color(0,255,0));

    Snakey.setPosition(180,60);

}


Snake::~Snake(){
    BodyList.clear();
}

void Snake::Draw(sf::RenderWindow &window){

    window.draw(Snakey);

    for (sf::RectangleShape& Body : BodyList){

    window.draw(Body);
    }

}

void Snake::Grow(){

    Body.setSize(sf::Vector2f(10, 10));

    Body.setFillColor(sf::Color(0,100,0));

    BodyList.push_back(Body);

}



void Snake::Move(sf::Event event, sf::RenderWindow &window){

    if (sf::Keyboard::isKeyPressed && sf::Keyboard::Left == event.key.code && Dir != "Right"){

        Body.setPosition(Snakey.getPosition().x,Snakey.getPosition().y);

        BodyList.push_back(Body);
        BodyList.erase(BodyList.begin());

        Snakey.move(-10, 0);

        Dir = ("Left");
    }

    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Right == event.key.code && Dir != "Left"){

        Body.setPosition(Snakey.getPosition().x,Snakey.getPosition().y);

        BodyList.push_back(Body);
        BodyList.erase(BodyList.begin());

        Snakey.move(10, 0);

        Dir = ("Right");
    }
    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Up == event.key.code && Dir != "Down"){

        Body.setPosition(Snakey.getPosition().x,Snakey.getPosition().y);        

        BodyList.push_back(Body);
        BodyList.erase(BodyList.begin());

        Snakey.move(0, -10);

        Dir = ("Up");
    }
    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Down == event.key.code && Dir != "Up"){

        Body.setPosition(Snakey.getPosition().x,Snakey.getPosition().y);

        BodyList.push_back(Body);
        BodyList.erase(BodyList.begin());

        Snakey.move(0, 10);

        Dir = ("Down");
    }

    else if (sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Down == event.key.code && Dir == "Up" || 
        sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Up == event.key.code && Dir == "Down" ||
        sf::Keyboard::isKeyPressed && sf::Keyboard::Key::Right == event.key.code && Dir == "Left"||
        sf::Keyboard::isKeyPressed && sf::Keyboard::Left == event.key.code && Dir == "Right"){

        window.close();
    }
}

void Snake::TailCollision(sf::RenderWindow &window){

    for (int i = 0 ; i < BodyList.size(); i++){
        if ((Snakey.getPosition().x == BodyList[i].getPosition().x && Snakey.getPosition().y == BodyList[i].getPosition().y)){

                window.close();

        }

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM