В основном цикле 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();
}
}
Хорошо, я нашел проблему самостоятельно, читая мой собственный вопрос.
Vector2f movement( 0.f, 0.f ), viewMovement( 0.f, 0.f );
Это (в то время как (win.isOpen ())) неправильно, так как я уже написал это, прежде чем int main ();
movement = Vector2f( 0.f, 0.f );
viewMovement = Vector2f( 0.f, 0.f );
С этим ^ это работает.
Спасибо всем, кто даже думал об этом, чтобы ответить мне.
Других решений пока нет …