Процедуры в c ++ с SFML не работают должным образом, алгоритм движения

В основном цикле while (win.isOpen ()) у меня есть 4 if:

#include<SFML/Graphics.hpp>
using namespace sf;
int main()
{
    RenderWindow win( VideoMode( 1280, 1024, 32 ), "abc" );
    View view( FloatRect( 0, 0, 320, 256 ) );
    Sprite player;
    Texture player_t;
    Image player_i;
    player_i.loadFromFile( "sprite1.png" );
    player_t.loadFromImage( player_i );

    player.setTexture( player_t );
    win.setView( view );

    float speed = 80.f;
    Clock frameClock;
    while( win.isOpen() )
    {
        Event event;
        while( win.pollEvent( event ) )
        {
            if( event.type == Event::Closed )
                win.close();
        }
        Time frameTime = frameClock.restart();

        Vector2f movement( 0.f, 0.f ), viewMovement( 0.f, 0.f );
        if( Keyboard::isKeyPressed( Keyboard::Up ) )
        {
            if( player.getPosition().y >= 0)
                movement.y -= speed;
            if( player.getPosition().y + 25 <= view.getCenter().y - 50 && view.getCenter().y - 128 >= 0 )
                viewMovement.y -= speed;
        }
        if( Keyboard::isKeyPressed( Keyboard::Down ) )
        {
            if( player.getPosition().y + 100 <= 1024 )
                movement.y += speed;
            if( player.getPosition().y + 25 >= view.getCenter().y + 50 && view.getCenter().y + 128 <= 1024 )
                viewMovement.y += speed;
        }
        if( Keyboard::isKeyPressed( Keyboard::Left ) )
        {
            if( player.getPosition().x >= 0)
                movement.x -= speed;
            if( player.getPosition().x + 15 <= view.getCenter().x - 82 && view.getCenter().x - 160 >= 0 )
                viewMovement.x -= speed;
        }
        if( Keyboard::isKeyPressed( Keyboard::Right ) )
        {
            if( player.getPosition().x + 100 <= 1280)
                movement.x += speed;
            if( player.getPosition().x + 15 >= view.getCenter().x + 82 && view.getCenter().x + 160 <= 1280 )
                viewMovement.x += speed;
        }
        player.move( movement * frameTime.asSeconds() );
        view.move( viewMovement * frameTime.asSeconds() );
        win.setView( view );

        win.clear();
        win.draw( player );
        win.display();
    }

}

Если они находятся в int main (), они работают нормально, но я хотел бы поместить их в процедуру из int main (), но когда я это делаю, во время компиляции не возникает никаких ошибок, но спрайт не перемещается, когда я нажимайте клавиши «Вверх», «Вниз», «Влево» и «Вправо». В чем проблема?

Вот код после выполнения процедур:

#include<SFML/Graphics.hpp>
using namespace sf;
RenderWindow win( VideoMode( 1280, 1024, 32 ), "abc" );
View view( FloatRect( 0, 0, 320, 256 ) );
Sprite player;
Vector2f movement( 0.f, 0.f ), viewMovement( 0.f, 0.f );
float speed = 80.f;
void movementOfPlayer()
{
    if( Keyboard::isKeyPressed( Keyboard::Up ) )
        {
            if( player.getPosition().y >= 0)
                movement.y -= speed;
            if( player.getPosition().y + 25 <= view.getCenter().y - 50 &&     view.getCenter().y - 128 >= 0 )
                viewMovement.y -= speed;
    }
    if( Keyboard::isKeyPressed( Keyboard::Down ) )
    {
            if( player.getPosition().y + 100 <= 1024 )
                movement.y += speed;
            if( player.getPosition().y + 25 >= view.getCenter().y + 50 && view.getCenter().y + 128 <= 1024 )
                viewMovement.y += speed;
    }
    if( Keyboard::isKeyPressed( Keyboard::Left ) )
    {
            if( player.getPosition().x >= 0)
                movement.x -= speed;
            if( player.getPosition().x + 15 <= view.getCenter().x - 82 && view.getCenter().x - 160 >= 0 )
                viewMovement.x -= speed;
    }
    if( Keyboard::isKeyPressed( Keyboard::Right ) )
    {
            if( player.getPosition().x + 100 <= 1280)
                movement.x += speed;
            if( player.getPosition().x + 15 >= view.getCenter().x + 82 && view.getCenter().x + 160 <= 1280 )
                viewMovement.x += speed;
    }
}
int main()
{
    Texture player_t;
    Image player_i;
    player_i.loadFromFile( "sprite1.png" );
    player_t.loadFromImage( player_i );

    player.setTexture( player_t );
    win.setView( view );

    Clock frameClock;
    while( win.isOpen() )
    {
        Event event;
        while( win.pollEvent( event ) )
        {
            if( event.type == Event::Closed )
                win.close();
        }
    Time frameTime = frameClock.restart();

    Vector2f movement( 0.f, 0.f ), viewMovement( 0.f, 0.f );
    movementOfPlayer();
    player.move( movement * frameTime.asSeconds() );
    view.move( viewMovement * frameTime.asSeconds() );
    win.setView( view );
    win.clear();
    win.draw( player );
    win.display();
}

}


person Running_Sloth    schedule 18.02.2018    source источник
comment
Вы связали объектный файл, созданный из отдельного файла?   -  person Technohacker    schedule 18.02.2018
comment
Конечно я сделал   -  person Running_Sloth    schedule 18.02.2018
comment
Не могли бы вы выложить каркас вашего главного двигателя или двигателя?   -  person Martin Sand    schedule 18.02.2018
comment
Покажите минимальный воспроизводимый пример.   -  person Jesper Juhl    schedule 18.02.2018
comment
Я внес некоторые изменения в вопрос, это упрощает проблему. Я заметил, что движение Vector2f и viewMovement изменяют ВНУТРИ процедуры, но когда процедура заканчивается, они возвращаются к 0. (Когда я помещаю if в пустоты, я делаю переменные глобальными и записываю их перед пустотами, поскольку, как сказано в вопросе, пустоты будут вне int main ()).   -  person Running_Sloth    schedule 18.02.2018


Ответы (1)


Хорошо, я сам обнаружил проблему, читая свой вопрос.

Vector2f movement( 0.f, 0.f ), viewMovement( 0.f, 0.f );

Это (в while (win.isOpen ())) неверно, так как я уже написал это до int main ();

movement = Vector2f( 0.f, 0.f );
viewMovement = Vector2f( 0.f, 0.f );

С этим ^ работает.

Спасибо всем, кто хотя бы подумал об этом, чтобы ответить мне.

person Running_Sloth    schedule 18.02.2018