Как мне дублировать спрайт на экране несколько раз, чтобы у каждого спрайта был один и тот же код? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь дублировать спрайты на экране, но я не могу сделать это без создания нескольких спрайтов.

Я обнаружил, что кто-то другой задает тот же вопрос, но я пытаюсь, например, щелкнуть где-нибудь в окне и заставить спрайт появиться там.Я пытался нарисовать этот спрайт в двух местах на экране (что сработало), но я также добавил столкновение для спрайта и спрайта игрока, что по какой-то причине не помешало игроку перейти в спрайт.

 #include <SFML/Graphics.hpp>
 #include <SFML/Window/Keyboard.hpp>

bool collision(sf::FloatRect r1, sf::FloatRect r2)
{
    sf::FloatRect intersection;
    return r1.intersects(r2, intersection);
}

bool collision(sf::Shape const & r1, sf::Shape const & r2)
{
    return collision(r1.getGlobalBounds(), r2.getGlobalBounds());
}
int main(){
sf::RenderWindow window(sf::VideoMode(800,600),"INSERT_WINDOW_TITLE", 
sf::Style::Titlebar | sf::Style::Close);
sf::RectangleShape player(sf::Vector2f(20.f,20.f));
player.setFillColor(sf::Color::Blue);
sf::RectangleShape rect(sf::Vector2f(20.f,20.f));
rect.setFillColor(sf::Color::Red);
int mousex = 400;
int mousey = 240;
rect.setPosition(400,240);
while(window.isOpen()){
    sf::Event event;
    if(collision(player,rect) == false){
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
player.move(0.f,-1.f);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) 
player.move(0.f,1.f);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) 
player.move(-1.f,0.f);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) 
player.move(1.f,0.f);
    }
    if(sf::Mouse::isButtonPressed(sf::Mouse::Left)){
        mousex = sf::Mouse::getPosition().x;
        mousey = sf::Mouse::getPosition().y;
    }
    while(window.pollEvent(event)){
         if (event.type == sf::Event::Closed)
            window.close();
    }
    window.clear(sf::Color::Black);
    window.draw(player);
rect.setPosition(400,240); // did not have any collision with this rect
    window.draw(rect);
rect.setPosition(mousex,mousey); // I set this position after the 
previous one, which is why it HAD collision
    window.draw(rect);
    window.display();
}
}

Как видите, я добавил комментарии, где произошла "ошибка".Проблема состоит в том, что только второй sf :: RectangleShape имел столкновение, и спрайт рисовался слишком быстро для любого реального столкновения (или, по крайней мере, это то, что я предполагаю).(Я думаю о дублировании спрайтов без дублирования кода 1000 раз) Как бы я решил эту проблему?

1 Ответ

0 голосов
/ 27 декабря 2018

Проблема в том, что вы проверяете столкновение только один раз за цикл.Итак, если вы нарисуете прямоугольник дважды, столкнется только один из них.Чтобы решить эту проблему, вы должны проверить

if(collision(player,rect) == false)

, который, кстати, может быть сокращен до

if(!collision(player,rect))

снова после изменения положения прямоугольника в этой строке:

rect.setPosition(mousex,mousey); // I set this position after the previous one, which is why it HAD collision
...