bbcodepl Temat założony przez niniejszego użytkownika |
[SFML] Miganie mapy kafelkowej » 2013-08-03 11:07:30 Witam. Napotkałem się na dziwny problem. Po otworzeniu aplikacji mapa kafelkowa jest w dobrym miejscu, wszystko pięknie, ładnie, ale strasznie miga (pojawiają się obrazki i znikają - tak jakby nie było podwójnego buforowania). Prosiłbym o odpowiedź. #include <SFML/Graphics.hpp> #include <string>
using namespace sf; using namespace std;
const int siatkaGry = 40, szerokoscAplikacji = siatkaGry * 20, wysokoscAplikacji = siatkaGry * 15, glebiaKolorow = 32; const double wersjaGry = 1.0, szybkoscAplikacji = 1.0; const string tytulAplikacji = "Gra"; const int szerokoscMap = 20, wysokoscMap = 15; int aktualnaMapa[ wysokoscMap ][ szerokoscMap ], lokacjaPostaci = 1; int R = 0, G = 0, B = 255;
Image obrazekPierwszy; Sprite spritePierwszy; RenderWindow oknoAplikacji;
int main() { obrazekPierwszy.LoadFromFile( "obrazek.png" ); obrazekPierwszy.SetSmooth( false ); spritePierwszy.SetImage( obrazekPierwszy ); RenderWindow oknoAplikacji( VideoMode( szerokoscAplikacji, wysokoscAplikacji, glebiaKolorow ), tytulAplikacji ); if( lokacjaPostaci == 1 ) { int aktualnaMapa[ wysokoscMap ][ szerokoscMap ] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; for( int y = 0; y < wysokoscMap; y++ ) { for( int x = 0; x < szerokoscMap; x++ ) { if( aktualnaMapa[ y ][ x ] == 1 ) { spritePierwszy.SetPosition( x * siatkaGry, y * siatkaGry ); oknoAplikacji.Draw( spritePierwszy ); } } } } while( oknoAplikacji.IsOpened() ) { Event zdarzenieAplikacji; while( oknoAplikacji.GetEvent( zdarzenieAplikacji ) ) { if( zdarzenieAplikacji.Type == Event::Closed ) oknoAplikacji.Close(); } oknoAplikacji.Display(); } }
|
|
MrPoxipol |
» 2013-08-03 11:09:32 Nie na tym polega rysowanie. Musisz utworzyć dla każdego kafelka sprajt, ustawić mu położenie i w pętli rysować wszystkie kafle. Jeden obieg pętli to jedna klatka. |
|
bbcodepl Temat założony przez niniejszego użytkownika |
» 2013-08-03 11:25:08 Czyli, miałbym napisać 300 sprite'ów, które przyjmują ten sam obrazek? |
|
pjpeg_objected |
» 2013-08-03 11:31:52 Musisz rysować kafle w pętli gry. Czyli wrzuć tą funkcję do rysowania mapy pomiędzy Clear(), a Display(). |
|
bbcodepl Temat założony przez niniejszego użytkownika |
» 2013-08-03 11:46:24 Dzięki za pomoc - działa ;). Ale mam jeszcze jeden problem. Zrobiłem funkcje 'rysujMape' w pętli gry, żeby nie było potem bałaganu w kodzie: while( oknoAplikacji.IsOpened() ) { Event zdarzenieAplikacji; while( oknoAplikacji.GetEvent( zdarzenieAplikacji ) ) { if( zdarzenieAplikacji.Type == Event::Closed ) oknoAplikacji.Close(); } rysujMape(); oknoAplikacji.Display(); }
I tym razem mam czarny ekran - nie pojawiają się w ogóle obrazki. void rysujMape() { if( lokacjaPostaci == 1 ) { int aktualnaMapa[ wysokoscMap ][ szerokoscMap ] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; for( int y = 0; y < wysokoscMap; y++ ) { for( int x = 0; x < szerokoscMap; x++ ) { if( aktualnaMapa[ y ][ x ] == 1 ) { spritePierwszy.SetPosition( x * siatkaGry, y * siatkaGry ); oknoAplikacji.Draw( spritePierwszy ); } } } } }
Od wczoraj dopiero się zaczynam uczyć SFML, więc nie bijcie :D |
|
pjpeg_objected |
» 2013-08-03 11:49:05 Nie czyścisz ekranu. Wstaw przed rysujMape: oknoAplikacji.Clear(). |
|
bbcodepl Temat założony przez niniejszego użytkownika |
» 2013-08-03 11:51:10 Już próbowałem tego wcześniej - nie działa :/ |
|
pjpeg_objected |
» 2013-08-03 12:09:52 Zauważ gdzie definiujesz zmienną aktualnaMapa. Znajduje się ona w ifie czyli jest tylko w tym ifie dostępna. |
|
« 1 » 2 3 |