Szustarol Temat założony przez niniejszego użytkownika |
[SFML] problem z przesuwankiem kilku obiektow na raz » 2016-10-29 22:58:41 Witam! Chcę zanimować przesuwanie pasów na drodze, ale niestety coś jest nie tak. Jeśli ich nie przesuwam wszystko jest okej, ale jeśli dam move na każdy to robi się między nimi przerwa Daję kod: void lines::initialise( sf::RenderWindow & window ) { std::vector < sf::RectangleShape > temp; temp.resize( ammount ); siz = window.getSize().y / 40; for( int i = 0; i < ammount; i++ ) { temp[ i ].setSize( sf::Vector2f( 6, siz ) ); temp[ i ].setFillColor( sf::Color( 255, 255, 255 ) ); } for( int i = 0; i < ammount; i++ ) { temp[ i ].setPosition( 0, siz * 2 * i ); } line = temp; }
void lines::drawintargetwindow( sf::RenderWindow & window ) { int temp; temp = window.getSize().x * 0.4 - 3; for( int i = 0; i < ammount; i++ ) { line[ i ].setPosition( temp, line[ i ].getPosition().y ); window.draw( line[ i ] ); } temp = window.getSize().x * 0.6 - 3; for( int i = 0; i < ammount; i++ ) { line[ i ].setPosition( temp, line[ i ].getPosition().y ); window.draw( line[ i ] ); } }
void lines::move() { time = clock.getElapsedTime(); clock.restart(); for( int i = 0; i < ammount; i++ ) { line[ i ].move( sf::Vector2f( 0, speed * time.asSeconds() ) ); if( line[ i ].getPosition().y > siz * 40 ) line[ i ].setPosition( 0, 0 - siz ); } }
wiec jesli wykomentuje calkowicie funkcje move, to odstepy sa prawidlowe zadalem juz to pytanie na forum sfml ale nie otrzymalem odpowiedzi wiec pytam tutaj podam link do oryginalnego pytania bo sa tam screenshoty ktore wyjasniaja moje pytanie en.sfml-dev.org/forums/index.php?topic=21036.0 |
|
michal11 |
» 2016-10-29 23:44:35 W funkcji drawintargetwindow (swoja droga fatalnie się to czyta, zastosuj np. CamelCase) dwa razy rysujesz tą samą linię i dodatkowo jeszcze jej ustawiasz jakąś pozycję, to może być potencjalny błąd.
Edit. Sorry za literówki, pisałem późno i z telefonu. |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-30 00:06:56 Ale po narysowaniu ona juz nie jest potrzebna (bo juz jest narysowana), moze sie myle ale nie wydaje mi sie by aż tak to sfmlowi szkodziło swoja droga fatalnie dir to czytaj, <-nie rozumiem tego zdania, mógłbyś inaczej wytłumaczyć |
|
Gibas11 |
» 2016-10-30 00:57:29 Przeczytaj co zwraca metoda sf::Clock::restart() (nie do końca błąd, ale zaśmiecasz sobie kod) i sprawdź czy zmienna 'amount' ma poprawny rozmiar podczas przesuwania.
//edit: I zarzucę klasykiem, daj minimalny, ale kompletny kod reprodukujący błąd. |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2016-10-30 11:25:59 #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/System.hpp> using namespace sf; int main() { Clock zegar; Time time; RenderWindow okno( VideoMode( 800, 600 ), "test" ); RectangleShape pasek[ 20 ]; int siz = 600 / 40; for( int i = 0; i < 20; i++ ) { pasek[ i ].setSize( sf::Vector2f( 6, siz ) ); pasek[ i ].setFillColor( sf::Color( 255, 255, 255 ) ); } for( int i = 0; i < 20; i++ ) { pasek[ i ].setPosition( 0, siz * 2 * i ); } int temp; int speed = 100; while( okno.isOpen() ) { time = zegar.restart(); for( int i = 0; i < 20; i++ ) { pasek[ i ].move( sf::Vector2f( 0, speed * time.asSeconds() ) ); if( pasek[ i ].getPosition().y > siz * 40 ) pasek[ i ].setPosition( 0, 0 - siz ); } okno.clear(); temp = 800 * 0.4; for( int i = 0; i < 20; i++ ) { pasek[ i ].setPosition( temp, pasek[ i ].getPosition().y ); okno.draw( pasek[ i ] ); } temp = 800 * 0.6; for( int i = 0; i < 20; i++ ) { pasek[ i ].setPosition( temp, pasek[ i ].getPosition().y ); okno.draw( pasek[ i ] ); } okno.display(); } }
chociazby taki kod- przerwa jest faktycznie mniejsza niz w normalnym kodzie ale jest widoczna EDIT zauwazylem ze jesli w kodzie programu zrobie tak movegameelements( line ); speed = log( mainclock.getElapsedTime().asMilliseconds() ); speed += 100; mainwindow.clear( sf::Color( 0, 0, 0 ) ); drawgameelements( mainwindow, line ); mainwindow.display();
zamiast tak speed = log( mainclock.getElapsedTime().asMilliseconds() ); speed += 100; mainwindow.clear( sf::Color( 0, 0, 0 ) ); drawgameelements( mainwindow, line ); mainwindow.display(); movegameelements( line );
to przerwa jest o wiele mniejsza czy moze wiec to byc problem powolności algorytmu? |
|
« 1 » |