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. 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; } 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 ); } win.clear(); win.draw( background ); win.draw( player ); win.display(); }
|
|
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 ); ? |
|
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? |
|
Lora |
» 2016-02-14 01:00:36 Usuń to 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. |
|
snajperek130 Temat założony przez niniejszego użytkownika |
» 2016-02-14 01:19:32 Niestety nic to nie dalo. Wrzuce tez Player 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; } } 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(); }
void Player::accelerate( sf::Vector2f mysz, String key ) { Vector2f norm = mysz - spaceship.getPosition(); float rot = atan2( norm.y, norm.x ); rot = rot * 180.f / M_PI; rot += 90; 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 ); } }
void Player::update( sf::Vector2f mysz ) { Vector2f norm = mysz - spaceship.getPosition(); float rot = atan2( norm.y, norm.x ); rot = rot * 180.f / M_PI; rot += 90; spaceship.setRotation( rot ); spaceship.move( vx, vy ); vx = vx - vx * 0.002f; vy = vy - vy * 0.002f; }
Dziwne, poniewaz gdy mam bez tej petli stalokrokowej, to dziala normalnie: 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 ) { Akumulator -= CzasKlatki; } background.update_background( win, CzasKlatki ); player.update( mysz ); win.clear(); win.draw( background ); win.draw( player ); win.display();
|
|
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. |
|
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).
|
|
|
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. |
|
« 1 » 2 |