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

时间:2013-12-27 22:59:17

标签: c++ sfml

一开始 - 抱歉我的英语(我还在学习)。 我创造了一个针对玩家的炮塔。它工作正常但是当我在塔的范围内移动时,炮塔不再瞄准我。只需看一下这段代码,然后在你的编译器中运行它。

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

1 个答案:

答案 0 :(得分:0)

您应该遵循以下几个最佳做法:

您的游戏循环包含3个主要部分:处理用户输入,更新游戏世界和绘制游戏世界。虽然你这样做,但你的订单混乱了。在处理用户输入之前,您似乎更新了游戏世界。

在SFML中绘图包括清理表面,绘制和按顺序显示

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

注意我如何将显示调用放到最后。

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

首先修复这些问题,因为它们会导致许多问题,这些问题可能会隐藏您的实际问题或在代码正常时导致问题。