[SFML] Pętla stałokrokowa
Ostatnio zmodyfikowano 2015-08-21 11:21
pasierdamian Temat założony przez niniejszego użytkownika |
[SFML] Pętla stałokrokowa » 2015-08-21 11:21:45 Witam, chciałbym zrobic w moim programie losującym kulki pętle stałokrokową tak aby kulki nie zachowywały się dziwnie przy przycieciach programu #include <iostream> #include <vector> #include <SFML/Graphics.hpp> #include <cstring> #include <cstdlib> #include <ctime> #include <string> #include <stack> #include "Ball.h" #include "Line.h" #include <SFML/Graphics/Text.hpp> #include "TextBall.h" using namespace std; using namespace sf;; const int balls = 50; float xSpeed[ balls ]; float ySpeed[ balls ]; float xposition[ balls ]; float yposition[ balls ]; int pozitionx[ balls ]; int pozitiony[ balls ]; int promien[ 49 ]; int licznik = 0;
int main() { RenderWindow win( VideoMode( 800, 600 ), L"Rozdział 1" ); srand( time( NULL ) ); int losuj =( std::rand() % 47 ) + 1; sf::Clock deltaClock; sf::Time myEventTimer; Clock stoper; Font font; font.loadFromFile( "arial.ttf" ); vector < Ball > ball( 50, Ball( win ) ); vector < TextBall > tekst( 50, TextBall( win ) ); std::vector < Ball > wylosowane( 6, Ball( win ) ); std::vector < TextBall > wylosowanenumery( 6, TextBall( win ) ); for( int i = 1; i < balls; i++ ) { promien[ i ] =( std::rand() % 40 ) + 30; pozitionx[ i ] =( std::rand() % 200 ) + 30; pozitiony[ i ] =( std::rand() % 200 ) + 10; Color color1 = Color( rand() % 255, rand() % 255, rand() % 255, 255 ); ySpeed[ i ] =( std::rand() % 100 ) + 50; xSpeed[ i ] =( std::rand() % 100 ) + 50; ball[ i ].SetPozition( ball[ i ].radius() + pozitionx[ i ], ball[ i ].radius() + pozitiony[ i ] ); ball[ i ].Fil( color1 ); ball[ i ].Promien( promien[ i ] ); std::string s = std::to_string( i ); tekst[ i ].sFont( font ); tekst[ i ].sString( s ); tekst[ i ].sCharacterSize( promien[ i ] ); xposition[ i ] = ball[ i ].GetPosition().x + ball[ i ].radius() * 2 / 3; yposition[ i ] = ball[ i ].GetPosition().y + ball[ i ].radius() / 4; tekst[ i ].sColor( sf::Color::Black ); tekst[ i ].sPosition( xposition[ i ], yposition[ i ] ); } Line linia1( win ); linia1.sie( 600, 500 ); linia1.position( 20, 20 ); linia1.thiness( 2 ); sf::Time timeSinceLastUpdate = sf::Time::Zero; sf::Time TimePerFrame = sf::seconds( 1.f / 40.f ); while( win.isOpen() ) { licznik++; win.clear( Color::White ); Event e; while( win.pollEvent( e ) ) { if( e.type == Event::Closed ) win.close(); } auto dt = stoper.restart().asSeconds(); for( int i = 1; i < 50; i++ ) { ball[ i ].Move( xSpeed[ i ] * dt, ySpeed[ i ] * dt ); tekst[ i ].Move( xSpeed[ i ] * dt, ySpeed[ i ] * dt ); } linia1.draw(); for( int i = 1; i < 50; i++ ) { ball[ i ].Draw(); tekst[ i ].Draw(); } for( int i = 1; i < 50; i++ ) { int positionY = ball[ i ].GetPosition().y; if( positionY <= 20 ) { ySpeed[ i ] = - ySpeed[ i ]; } if( positionY >= 520.0 - 2 * ball[ i ].radius() ) { ySpeed[ i ] = - ySpeed[ i ]; } int positionX = ball[ i ].GetPosition().x; if( positionX <= 20 ) { xSpeed[ i ] = - xSpeed[ i ]; } if( positionX >= 620.0 - 2 * ball[ i ].radius() ) { xSpeed[ i ] = - xSpeed[ i ]; } } myEventTimer += deltaClock.restart(); if( myEventTimer >= seconds( 10 ) ) { myEventTimer -= seconds( 10 ); ball[ losuj ].SetPozition( 650, 40 ); tekst[ losuj ].sPosition( ball[ losuj ].GetPosition().x + ball[ losuj ].radius() * 2 / 3, ball[ losuj ].GetPosition().y + ball[ losuj ].radius() / 4 ); } win.display(); } } Kompletnie nie wiem jak się do tego zbarać. po 10 sekundach nastepuje losowanie myEventTimer += deltaClock.restart(); if( myEventTimer >= seconds( 10 ) ) { myEventTimer -= seconds( 10 ); ball[ losuj ].SetPozition( 650, 40 ); tekst[ losuj ].sPosition( ball[ losuj ].GetPosition().x + ball[ losuj ].radius() * 2 / 3, ball[ losuj ].GetPosition().y + ball[ losuj ].radius() / 4 ); } Jednak petla programu robi koło i wylosowna kula cały czas się odbija. Jak wyłączyć ją z pętli? Do tego losuj zawsze zwraca liczbę 42 , czego może być to przyczynna? Całkowicie nie działa także zakomentowany zapis for( int i = 1; i < 7; i++ ) { if( licznik > 2000 ) { int losuj =( std::rand() % 47 ) + 1; wylosowane.push_back( ball[ losuj ] ); wylosowanenumery.push_back( tekst[ losuj ] ); wylosowane[ 0 ].SetPozition( 650, 40 ); wylosowanenumery[ 0 ].sPosition( wylosowane[ 0 ].GetPosition().x + wylosowane[ 0 ].radius() * 2 / 3, wylosowane[ 0 ].GetPosition().y + wylosowane[ 0 ].radius() / 4 ); } }
Nie wsysypuje błędów ale kulki zaczynają wypadać z pola i nie wyświetlają się aktualnei wylosowane kulki |
|
« 1 » |