SFML 2.0 Ориентация на игрока одной башней

0

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

 int detection (sf::Sprite statek,sf::RectangleShape linia,sf::Texture textstatku)
{
    sf::FloatRect rect, rect2;
    rect = linia.getGlobalBounds();
    rect2 = statek.getGlobalBounds();

    if(rect2.intersects(rect))
        return 1;
    else
        return 2;

}


int _tmain(int argc, _TCHAR* argv[])
{

sf::Event evente;
sf::RenderWindow okno ( sf::VideoMode(500,500,32)," TURRET TEST ");
sf::Texture textturreta;
textturreta.loadFromFile ("C:\\Users\\Darono\\C++\\Projekty\\IN PROGGRES\\Single turret\\Debug\\turret.png");
sf::CircleShape turret (20.0,100);
turret.setTexture((sf::Texture *)&textturreta);
turret.setPosition (240,240);


sf::Texture Lufatext;
Lufatext.loadFromFile("C:\\Users\\Darono\\C++\\Projekty\\IN PROGGRES\\Single turret\\Debug\\Lufa.png");

sf::Sprite lufa;
lufa.setTexture(Lufatext);

sf::Texture gracztext;
gracztext.loadFromFile("C:\\Users\\Darono\\C++\\Projekty\\IN PROGGRES\\Single turret\\Debug\\gracz.png");
sf::Sprite gracz(gracztext);


int orginY=turret.getPosition().y+20;
int orginX=turret.getPosition().x+20;

lufa.setPosition(turret.getPosition().x+20,turret.getPosition().y+20);
lufa.setOrigin (2,-20);

sf::RectangleShape liniastrzalu(sf::Vector2f(1,200));
liniastrzalu.setOrigin(0,-20);
liniastrzalu.setPosition(turret.getPosition().x+20,turret.getPosition().y+20);


int a =0;
while (okno.isOpen())
{
    if (gracz.getPosition().y >= turret.getPosition().y-240||gracz.getPosition().y <= turret.getPosition().y+280)
    {

        if (detection(gracz,liniastrzalu,textturreta)== 1)
        {
            std::cout <<"lol";
        }
        if (detection(gracz,liniastrzalu,textturreta)==2)
        {
            lufa.rotate(1);
            liniastrzalu.rotate(1);
        }


    }
    while (okno.pollEvent(evente))
    {
        //lufa obraca się razem z kołem
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
        {
            gracz.move(-2,0);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
        {
            gracz.move(2,0);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
            gracz.move(0,2);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
            gracz.move(0,-2);
        }

    }



    okno.display();
    okno.clear();
    okno.draw(turret);
    okno.draw(lufa);
    okno.draw(gracz);
    //okno.draw(liniastrzalu);


}

return 0;
}
Теги:
sfml

1 ответ

0
Лучший ответ

Вы должны следовать нескольким передовым методам:

Ваш игровой цикл состоит из 3 основных частей: обработка пользовательского ввода, обновление игрового мира и рисование игрового мира. Хотя вы делаете это, у вас есть порядок, смешанный. Кажется, вы обновляете свой игровой мир перед тем, как обращаться с пользователем.

Рисование в SFML состоит в очистке поверхности, нанесении и представлении в этом порядке.

okno.clear();
okno.draw(turret);
okno.draw(lufa);
okno.draw(gracz);
okno.display();

Обратите внимание, как я положил вызов дисплея до конца.

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

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

  • 0
    Я обновил свой код, но все же я не знаю, что делать дальше.
  • 0
    @Darono Вы можете опубликовать свой обновленный код. Кроме того, возможно, вы можете создать небольшой пример, который работает (или, скорее, имеет те же проблемы) без текстур, потому что у нас нет этих текстур и, следовательно, мы не можем протестировать ваш код. Возможно, вы захотите использовать английские имена переменных и функций, чтобы сообщество было проще следить за вами.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню