ksry Temat założony przez niniejszego użytkownika |
[SFML]Renderowanie mapy z kafelków » 2012-08-21 17:07:23 Witam. Chciałbym wyrenderować mapę kafelkową, zamieniając informacje o blokach na same bloki. Zaplanowałem już sobie w jaki sposób informacje o blokach są przechowywane. Mam takie coś:
void render() { char * mapa = "000000000000000000000\n" "011111111111111111110\n" "011111111111111111110\n011111111111111111110\n" "011111111111111111110\n011111111111111111110\n011111111111111111110\n" "011111111111111111110\n011111111111111111110\n011111111111111111110\n011111111111111111110\n" "011111111111111111110\n011111111111111111110\n011111111111111111110\n000000000000000000000"; int linia = 1; int znak = 0; sf::Image ziemia; sf::Image blokada; ziemia.loadFromFile( "./img/dirt.png" ); blokada.loadFromFile( "./img/black.png" ); sf::Image render; sf::Image current; sf::Texture current_texture; while( znak <= strlen( mapa ) ) { if( mapa[ znak ] != '\n' ) { switch( mapa[ znak ] ) { case '0': current = blokada; break; case '1': current = ziemia; } render.copy( current, znak * 32,( linia - 1 ) * 32, sf::IntRect( 0, 0, 32, 32 ) ); } else linia++; znak++; } render.saveToFile( "./img/mapa.png" ); current_texture.loadFromImage( render ); mapka.setTexture( current_texture ); }
nie ma żadnych zmian na ekranie po narysowaniu zmiennej mapka (mapka jest zadeklarowana jako sf::Sprite)
jak widać, użyłem render.saveToFile, jednak żaden plik się nie pojawia
gdzie leży problem? i przy okazji, czy taka metoda przechowywania i czytania/renderowania mapy jest dobra? :P |
|
m4tx |
» 2012-08-21 17:30:41 Taka metoda nie jest dobra, bo kopiujesz piksele, a kopiowanie pikseli jest czasochłonną operacją. Jeżeli koniecznie chcesz tym sposobem to zrobić, to możesz "wyrenderować" mapę raz, a potem tylko rysować Sprite. Ale najlepszym sposobem będzie prawdopodobnie rysowanie kafli po kolei - dodatkowo możesz wtedy ukrywać niewidoczne na ekranie kafle. |
|
ksry Temat założony przez niniejszego użytkownika |
» 2012-08-21 17:33:13 Dowiedziałem się też tego w dokumentacji. Ale jako że mapa ma nie być renderowana dynamicznie, tylko raz na jakiś czas, zdecydowałem się na to. Inna sprawa - co jest wygodniejsze. Mogę się przerzucić zanim nie jest za późno.
|
|
waxx |
» 2012-08-21 18:21:14 yyyy? co z tego ze 'raz na jakis czas'
stworzenie nawet tysiecy sf::Sprite nie jest jakies pamieciozerne - one zawieraja raptem referencje do obrazka i kilka innych malych zmiennych
|
|
ksry Temat założony przez niniejszego użytkownika |
» 2012-08-21 18:27:34 Czyli że mam zrobić tablicę spritów, jeden klucz na jedną współrzędną, zmieniać je wraz ze zmianą otoczenia (chodzenie postaci) i z każdym obiegiem pętli głównej nakładać całą tablicę na mapę? |
|
waxx |
» 2012-08-21 19:25:00 nie musisz, mozesz robic sprity co klatke wazne zeby miec sf::Texture czy tam sf::Image, zaleznie od wersji, wczytane wczesniej |
|
m4tx |
» 2012-08-21 19:32:46 mozesz robic sprity co klatke |
Alokowanie pamięci dla obiektów co klatkę nigdy nie będzie dobrym pomysłem. To po prostu zbyt czasochłonne, zwłaszcza, jeśli mówimy tu o tworzeniu kilku tysięcy obiektów. |
|
ksry Temat założony przez niniejszego użytkownika |
» 2012-08-21 19:50:04 To już nie wiem. Dobrym pomysłem jest zrobienie dwóch tablic dwuwymiarowych, gdzie jedna przechowuje całą mapę, a druga - tylko interesujący mnie kawałek mapy? Wartości byłby typu int, gdzie potem podmieniam je na sprite, aktualizując tablicę numer 2 podczas ruchu postaci. A może jakieś lepsze propozycje? |
|
« 1 » 2 3 4 5 |