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

[SFML 2.0] Wyświetlanie tablicy pikseli na ekran.

Ostatnio zmodyfikowano 2013-03-14 16:51
Autor Wiadomość
Apus
Temat założony przez niniejszego użytkownika
[SFML 2.0] Wyświetlanie tablicy pikseli na ekran.
» 2013-03-13 20:18:23
Mam dwuwymiarową tablicę typu int o rozmiarach okna, w pętli zamieniam liczby na odpowiadające im kolory, które wstawiam do sf::Image za pomocą setPixel(). Potem zawartość sf::Image kopiuję do sf::Texture funkcją loadFromImage() i wyświetlam w oknie. Przy oknie o rozmiarach 512x512 pikseli to wszystko dzieje się w niecałą sekundę.
I tu pojawia się problem, bo to miało być wyświetlanie terenu w grze. Nawet jeśli kopiowałbym z sf::Image do sf::Texture tylko przy przesunięciu widoku lub modyfikacji terenu, to gra zacinała by się co chwilę na około sekundę.
A więc pytanie, czy da się to zrobić szybciej przy użyciu SFML? Jest jakiś inny sposób wyświetlenia tablicy pikseli na ekran? Czy jest sens rysować każdy piksel jako sf::Sprite?
P-78246
pekfos
» 2013-03-13 20:28:33
A jaki jest sens budować mapę z pojedynczych pikseli (pomijając, że robisz to ekstremalnie nieefektywnie)? Już lepiej było by trzymać mapę w formacie bmp (lub innym bezstratnym formacie), potem tylko wczytać i odpowiednio wyświetlić.
P-78247
Apus
Temat założony przez niniejszego użytkownika
» 2013-03-13 20:33:01
Chcę modyfikować pojedyncze piksele mapy w czasie działania programu, więc nie widzę innego wyjścia niż budować mapę z pojedynczych pikseli.
P-78248
akwes
» 2013-03-13 20:42:46
Spoko, na obrazku bmp też możesz przecież edytować pojedyncze piksele.
P-78249
pekfos
» 2013-03-13 20:47:32
Zbuduj mapę, a potem tylko ją modyfikuj. Jak będziesz w pętli budować mapę, to gra będzie robić za pokaz slajdów.
P-78250
Apus
Temat założony przez niniejszego użytkownika
» 2013-03-13 20:51:01
Tylko, że ja mam coś takiego:
C/C++
struct PixelDef
{
    sf::Color Color;
    //potem dodam wiecej parametrow, np. czy przepuszcza swiatlo, czy koliduje itp.
};

PixelDef PixelDefs[] =
{
    { sf::Color( 0, 0, 127, 255 ) },
    { sf::Color( 72, 36, 0, 255 ) },
    { sf::Color( 0, 200, 0, 255 ) },
    { sf::Color( 64, 64, 64, 255 ) }
};

a w pętli wywołuję to:
C/C++
void UpdateScreen( sf::Image & ScreenImg, sf::Image & MapImg, sf::IntRect & View )
{
    for( int x = 0; x < View.width; x++ )
    {
        for( int y = 0; y < View.height; y++ )
        {
            ScreenImg.setPixel( x, y, PixelDefs[ MapImg.getPixel(( View.left + x ),( View.top + y ) ).r ].Color );
        }
    }
}
a potem
C/C++
ScreenT.loadFromImage( ScreenImg );
Window.clear();
Window.draw( ScreenS ); // ScreenS to sf::Sprite z teksturą ScreenT
Window.display();
Mam edytować bitmapę, wczytywać ją jako sf::Texture i wyświetlać?

Jeżeli będę edytował mapę w pętli to i tak będę miał co najmniej półsekundowe ścinki przy przesyłaniu sf::Image do sf::Texture. A zamierzam, żeby gra działała na fullscreen, czyli kilka razy wiecej pikseli niż w oknie 512x512.
P-78251
pekfos
» 2013-03-13 21:20:08
Co chcesz osiągnąć?
P-78260
Apus
Temat założony przez niniejszego użytkownika
» 2013-03-13 21:21:35
Chcę osiągnąć mapę kafelkową z kafelkami wielkości pikseli, edytowaną w czasie rzeczywistym.
P-78262
« 1 » 2 3
  Strona 1 z 3 Następna strona