SFML 2.0 通过单个炮塔瞄准玩家

SFML 2.0 Targeting a player by a single turret

本文关键字:玩家 单个炮 SFML      更新时间:2023-10-16

一开始 - 对不起我的英语(我还在学习)。我创建了一个针对玩家的炮塔。它工作正常,但是当我在塔的范围内移动时,炮塔不再针对我。只需查看此代码并在编译器中运行它即可。

 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;
}

您应该遵循一些最佳实践:

您的游戏循环由 3 个主要部分组成:处理用户输入、更新游戏世界和绘制游戏世界。虽然你这样做,但你把顺序弄混了。您似乎在处理用户输入之前更新了游戏世界。

SFML 中的绘图包括清洁表面、按该顺序绘制和呈现。

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

请注意我是如何将显示调用放在最后的。

无需

调用检测方法两次。调用它一次并将结果存储在变量中,然后使用该变量。

首先修复这些事情,因为它们会导致很多问题,这些问题可能会隐藏您的真正问题,或者在代码正常时引起问题。