lelu0 Temat założony przez niniejszego użytkownika |
[SFML] Zmienianie sie grafiki » 2011-10-18 15:37:56 Witam. Postanowiłem napisać grę w trzy karty. Problemy zaczęły się, gdy chciałem żeby po wybraniu właściwej bądź niewłaściwej karty wyświetlały się odpowiednie napisy. Problem w tym że po włączeniu aplikacji na ekranie jest wyświetlany napis od razu, a cały ekran nieustannie miga. oto kod (jest jeszcze w samym środku pracy, wiec jako tako gra nie działa jak powinna, jest jeszcze sporo do napisania, ale staram się ją testować na bieżąco): #include <iostream> #include <SFML/Graphics.hpp>
using namespace std; int wylosuj( int l ) { l =( rand() % 2 ) + 1; return l; } bool spr( int a[], int c ) { do { if( a[ c ] == 2 ) return true; c++; } while( c <= 1 ); return false; }
int main() { srand( time( 0 ) ); int karty[ 3 ]; int l[ 2 ]; int i = 0; do { int liczba; liczba = wylosuj( 0 ); if( spr( l, 0 ) == false ) { karty[ i ] = liczba; i++; } } while( i <= 2 ); sf::Image karta; karta.LoadFromFile( "karta.png" ); sf::Sprite kartas; kartas.SetImage( karta ); kartas.SetPosition( 100, 200 ); sf::Sprite kartas2; kartas2.SetImage( karta ); kartas2.SetPosition( 300, 200 ); sf::Sprite kartas3; kartas3.SetImage( karta ); kartas3.SetPosition( 500, 200 ); sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Trzy Karty" ); while( okno.IsOpened() ) { sf::Event zdarzenie; while( okno.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == sf::Event::Closed ) okno.Close(); } sf::String t1( L"Trzy Karty" ); sf::String t2( L"Zwyciestwo" ); sf::String t3( L"Przegrana" ); t1.SetPosition( 300, 10 ); t2.SetPosition( 300, 540 ); t3.SetPosition( 300, 540 ); okno.Clear( sf::Color( 30, 180, 100 ) ); okno.Draw( t1 ); okno.Draw( kartas ); okno.Draw( kartas2 ); okno.Draw( kartas3 ); okno.Display(); int select; const sf::Input & sterowanie = okno.GetInput(); if( sterowanie.IsKeyDown( sf::Key::A ) ) select = karty[ 0 ]; if( sterowanie.IsKeyDown( sf::Key::S ) ) select = karty[ 1 ]; if( sterowanie.IsKeyDown( sf::Key::D ) ) select = karty[ 2 ]; int zwyciestwo = 2; if( zwyciestwo == select ) { okno.Clear( sf::Color( 30, 180, 100 ) ); okno.Draw( t2 ); okno.Display(); } else { okno.Clear( sf::Color( 30, 180, 100 ) ); okno.Draw( t3 ); okno.Display(); }; } return 0; } Wiem że wygląda trochę chaotycznie. Więc co musze zrobic żeby komunikaty wyswietlały się poprawnie a ekran nie migał? |
|
blojayble |
» 2011-10-19 21:55:06 Po pierwsze, to próbuj działać obiektowo. Po drugie, ja najpierw robię sterowanie,a dopiero potem rysowanie i jest cacy. Po trzecie int zwyciestwo = 2; if( zwyciestwo == select ) { okno.Clear( sf::Color( 30, 180, 100 ) ); okno.Draw( t2 ); okno.Display(); } else { okno.Clear( sf::Color( 30, 180, 100 ) ); okno.Draw( t3 ); okno.Display(); }; Może chodzi o else, jeżeli nie spełni pierwszego warunku, to mogą dziać się różne cuda, chyba że nie załapałem ukrytego sensu tego kodu. Proponuję dokładnie określić co dla czego, i umieścić to w pętli while(GetEvent), ponieważ na samym początku się to wykonuje, a jeżeli nie zdążysz na początku nacisnąć przycisku, co jest niemożliwe, aby być takim szybkim :), to oczywiste, że wyświetli się ten napis. Proponuję wyobrazić sobie, jak to w ogóle miało działać, bo jest "nieco" nieprzemyślane. Pozdro. |
|
lelu0 Temat założony przez niniejszego użytkownika |
» 2011-10-21 19:25:19 Dzięki za pomoc, to mój pierwszy program w sfml po kursie na tej stronie, chciałem sprawdzić czy cos umiem ale wychodzi że niewiele ;) w każdym razie dzienki, jak bede mial natchnienie to jeszcze popróbuje. |
|
« 1 » |