Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Petla stalokrokowa

Ostatnio zmodyfikowano 2016-02-14 22:08
Autor Wiadomość
snajperek130
Temat założony przez niniejszego użytkownika
Petla stalokrokowa
» 2016-02-13 23:34:45
Witam, mam problem z petla stalokrokowa. Tlo dziala normalnie, ale gracz nie zatrzymuje sie i wogole zle dziala sterowanie. Jesli gracz jest aktualizowany poza petla while( Akumulator > CzasKlatki ) to wszystko dziala normalnie. Prosze o pomoc.
C/C++
bool menu = false;

sf::Clock Zegar;

float Akumulator = 0;

float CzasKlatki = 0.03;

while( !menu )
{
    Akumulator += Zegar.restart().asSeconds();
    Event event;
    Vector2f mysz( Mouse::getPosition( win ) );
   
    char key;
    while( win.pollEvent( event ) )
    {
       
        if( event.type == Event::KeyReleased && event.key.code == Keyboard::Escape )
        { menu = true; }
        else if( event.type == sf::Event::Closed || event.type == sf::Event::KeyReleased && event.key.code == Keyboard::Escape )
        { menu = true; }
       
        // player move
        else if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::A ) )
        {
            player.accelerate( mysz, "WA" );
        }
       
        //...
       
       
       
    }
    while( Akumulator > CzasKlatki )
    {
       
        Akumulator -= CzasKlatki;
        background.update_background( win, CzasKlatki );
        player.update( mysz );
    }
    //player.update(mysz);
    win.clear();
    win.draw( background );
    win.draw( player );
    win.display();
   
}
P-144839
Gibas11
» 2016-02-14 00:20:33
Nie do końca rozumiem o co Ci chodzi, dlaczego nie użyjesz po prostu
win.setFramerateLimit( 60 );
?
P-144840
snajperek130
Temat założony przez niniejszego użytkownika
» 2016-02-14 00:45:46
Hmmm z tego co czytalem, to zalecana jest funkcja stalokrokowa, a o setFramerateLimit jakos nikt nie pisze.
Bo petla stalokrokowa ustawia stala liczbe fpsow, a setFramerateLimit ustawia limit tak?
P-144841
Lora
» 2016-02-14 01:00:36
Usuń to
C/C++
if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::A ) )
{
    player.accelerate( mysz, "WA" );
}
z pętli eventów i wrzuć do pętli stałokrokowej.
P-144842
snajperek130
Temat założony przez niniejszego użytkownika
» 2016-02-14 01:19:32
Niestety nic to nie dalo. Wrzuce tez Player
C/C++
while( !menu )
{
    Akumulator += Zegar.restart().asSeconds();
    Event event;
    Vector2f mysz( Mouse::getPosition( win ) );
   
    char key;
    while( win.pollEvent( event ) )
    {
       
        if( event.type == Event::KeyReleased && event.key.code == Keyboard::Escape )
        { menu = true; }
        else if( event.type == sf::Event::Closed || event.type == sf::Event::KeyReleased && event.key.code == Keyboard::Escape )
        { menu = true; }
       
        // player move
       
       
       
       
    }
    while( Akumulator > CzasKlatki )
    {
       
        if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::A ) )
        {
            player.accelerate( mysz, "WA" );
        }
        else if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::D ) )
        {
            player.accelerate( mysz, "WD" );
        }
        else if( Keyboard::isKeyPressed( Keyboard::S ) && Keyboard::isKeyPressed( Keyboard::A ) )
        {
            player.accelerate( mysz, "SA" );
        }
        else if( Keyboard::isKeyPressed( Keyboard::S ) && Keyboard::isKeyPressed( Keyboard::D ) )
        {
            player.accelerate( mysz, "SD" );
        }
       
        else if( Keyboard::isKeyPressed( Keyboard::A ) )
        {
            player.accelerate( mysz, "A" );
        }
       
        else if( Keyboard::isKeyPressed( Keyboard::D ) )
        {
            player.accelerate( mysz, "D" );
        }
       
        else if( Keyboard::isKeyPressed( Keyboard::W ) )
        {
            player.accelerate( mysz, "W" );
        }
       
       
        else if( Keyboard::isKeyPressed( Keyboard::S ) )
        {
            player.accelerate( mysz, "S" );
        }
        Akumulator -= CzasKlatki;
        background.update_background( win, CzasKlatki );
        player.update( mysz );
       
       
    }
   
    win.clear();
    win.draw( background );
    win.draw( player );
    win.display();
   
}
C/C++
void Player::accelerate( sf::Vector2f mysz, String key )
{
   
    Vector2f norm = mysz - spaceship.getPosition(); //Counting the vector between the mouse and sprite
    float rot = atan2( norm.y, norm.x ); // counting the rotation
    rot = rot * 180.f / M_PI; //conversion to degrees
    rot += 90; // adding to work normally
   
    if( key == "W" )
    {
        float xN = static_cast < float >( speed * sin(( rot * M_PI ) / 180.0 ) );
        float yN = static_cast < float >( speed * cos(( rot * M_PI ) / 180.0 ) );
        vx += xN * 0.02f;
        vy -= yN * 0.02f;
        spaceship.move( vx, vy );
       
    }
}
C/C++
void Player::update( sf::Vector2f mysz ) //5
{
   
    //rotation in the direction of the mouse
    Vector2f norm = mysz - spaceship.getPosition(); //Counting the vector between the mouse and sprite
    float rot = atan2( norm.y, norm.x ); // counting the rotation
    rot = rot * 180.f / M_PI; //conversion to degrees
    rot += 90; // adding to work normally
    spaceship.setRotation( rot );
    spaceship.move( vx, vy );
    vx = vx - vx * 0.002f; //slowing down
    vy = vy - vy * 0.002f;
}

Dziwne, poniewaz gdy mam bez tej petli stalokrokowej, to dziala normalnie:
C/C++
while( win.pollEvent( event ) )
{
   
    if( event.type == Event::KeyReleased && event.key.code == Keyboard::Escape )
    { menu = true; }
    else if( event.type == sf::Event::Closed || event.type == sf::Event::KeyReleased && event.key.code == Keyboard::Escape )
    { menu = true; }
    else if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::A ) )
    {
        player.accelerate( mysz, "WA" );
    }
    else if( Keyboard::isKeyPressed( Keyboard::W ) && Keyboard::isKeyPressed( Keyboard::D ) )
    {
        player.accelerate( mysz, "WD" );
    }
    else if( Keyboard::isKeyPressed( Keyboard::S ) && Keyboard::isKeyPressed( Keyboard::A ) )
    {
        player.accelerate( mysz, "SA" );
    }
    else if( Keyboard::isKeyPressed( Keyboard::S ) && Keyboard::isKeyPressed( Keyboard::D ) )
    {
        player.accelerate( mysz, "SD" );
    }
   
    else if( Keyboard::isKeyPressed( Keyboard::A ) )
    {
        player.accelerate( mysz, "A" );
    }
   
    else if( Keyboard::isKeyPressed( Keyboard::D ) )
    {
        player.accelerate( mysz, "D" );
    }
   
    else if( Keyboard::isKeyPressed( Keyboard::W ) )
    {
        player.accelerate( mysz, "W" );
    }
   
   
    else if( Keyboard::isKeyPressed( Keyboard::S ) )
    {
        player.accelerate( mysz, "S" );
    }
}

while( Akumulator > CzasKlatki )
{
    // player move
   
    Akumulator -= CzasKlatki;
   
   
}
background.update_background( win, CzasKlatki );
player.update( mysz );
win.clear();
win.draw( background );
win.draw( player );
win.display();
P-144843
Gibas11
» 2016-02-14 08:57:50
setFramerateLimi załatwi ci pętlę stałokrokową i utrzyma ten stan do momentu, w którym twój PC będzie w stanie wygenerować klatkę w wyznaczonym czasie i tylko w przeciwnej sytuacji FPSy spadają, ale tego w żaden sposób nie unikniesz.
P-144844
Lora
» 2016-02-14 12:26:00
A co dokładnie nie działa? Zauważ, że jeśli masz te warunki sprawdzające czy dany klawisz jest wciśnięty w pętli eventów, to są one sprawdzane tylko wtedy gdy wystąpi jakiś event, a kiedy masz je poza nią to są sprawdzane przy każdym obiegu pętli. Jeżeli chcesz wykonywać metodę accelerate tylko raz po kliknięciu danego klawisza to zostaw te warunki w pętli eventów i zamień warunki Keyboard::isKeyPressed na Event::KeyPressed.
setFrameLimit jest mało precyzyjny. W dokumentacji SFML można przeczytać:

SFML will try to match the given limit as much as it can, but since it internally uses sf::sleep, whose precision depends on the underlying OS, the results may be a little unprecise as well (for example, you can get 65 FPS when requesting 60).
P-144846
Gibas11
» 2016-02-14 15:25:53
@Up Wahania są praktycznie niezauważalne, dopiero przy 120fps pojawiają mi się skoki 120-121 a ustawianie większych wartości nie bardzo ma sens.
P-144850
« 1 » 2
  Strona 1 z 2 Następna strona