Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML]Renderowanie mapy z kafelków

Ostatnio zmodyfikowano 2012-08-22 20:53
Autor Wiadomość
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ś:
C/C++
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; //jedna linia mapy (y)
    int znak = 0; //wskaznik zaczyna od 0, 1 znak to 1 kafelek na mapie (x)
    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
P-63197
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.
P-63206
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.
P-63208
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

P-63216
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ę?
P-63217
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
P-63224
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.
P-63225
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?
P-63228
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona