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

[SDL, C++] Problem z wyświetlaniem bitmapy

Ostatnio zmodyfikowano 2010-08-14 13:10
Autor Wiadomość
programator
Temat założony przez niniejszego użytkownika
[SDL, C++] Problem z wyświetlaniem bitmapy
» 2010-08-14 11:03:19
Nie chciałem pisać tego na forum, ale nie mam wyboru, nie potrafię nic na ten problem poradzić...
Proszę, powiedzcie co jest nie tak z tym kodem?
C/C++
#include <SDL.h>

int main( int argc, char * args[] )
{
    SDL_Surface * ekran = NULL;
    SDL_Surface * tlo = NULL;
    SDL_Surface * ludek = NULL;
    SDL_Rect przesuniencie_ludka;
    Uint8 * keystate = SDL_GetKeyState( NULL );
    SDL_Event zdarzenie;
    bool wyjscie = false;
   
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 1260, 600, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "Ludek", NULL );
    tlo = SDL_LoadBMP( "bg.bmp" );
    ludek = SDL_LoadBMP( "ludek.bmp" );
    SDL_SetColorKey( ludek, SDL_SRCCOLORKEY, SDL_MapRGB( ludek->format, 255, 255, 255 ) );
    while( !wyjscie )
    {
        SDL_FillRect( ekran, NULL, 0 );
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT ) wyjscie = true;
           
        }
        if( keystate[ SDLK_RIGHT ] ) przesuniencie_ludka.x++;
        else if( keystate[ SDLK_LEFT ] ) przesuniencie_ludka.x--;
        else if( keystate[ SDLK_UP ] ) przesuniencie_ludka.y--;
        else if( keystate[ SDLK_DOWN ] ) przesuniencie_ludka.y++;
       
        SDL_BlitSurface( tlo, NULL, ekran, NULL );
        SDL_BlitSurface( ludek, NULL, ekran, & przesuniencie_ludka );
        //SDL_Flip(tlo);
        SDL_Flip( ekran );
    }
    SDL_FreeSurface( ludek );
    SDL_FreeSurface( tlo );
    SDL_Quit();
    return 0;
}
Kompiluje sie, uruchamia, ale nie wyświetla "ludka".
Oto jak to wygląda:
[url href="http://zapisz.net/images/742_zrzut_ekranu.png" nazwa="Klik"/]
Najgorsze jest to, że raz mi ten kod nawet działał... Tzn. Ludek poruszał się po planszy.
Przy następnym uruchomieniu już nie...
P-20818
szyx_yankez
» 2010-08-14 11:57:29
Tytuł powinien być taki: "Dziwnie zaprogramowany program", bo w końcu jak go napisałeś tak się zachowuje.
P-20821
programator
Temat założony przez niniejszego użytkownika
» 2010-08-14 12:39:23
W takim razie co jest w nim takiego dziwnego?
Co jest źle?
P-20822
kamillo121
» 2010-08-14 12:44:41
Skoro nie udzielasz pomocy to po co spamujesz ? nabijasz posty ?

Nie flipuj tła a potem ekranu, skoro wszytko malujesz na buforze (surface ekran) to flipuj tylko ekran SDL_Flip(ekran);  a nie  SDL_Flip(tlo); SDL_Flip(ekran);
P-20823
programator
Temat założony przez niniejszego użytkownika
» 2010-08-14 12:55:12
Poprawiłem, ale efekt jest ten sam.
Po pierwszym skompilowaniu i uruchomieniu wyświetla ludzika.
Za drugim razem już nie...
P-20824
kamillo121
» 2010-08-14 12:58:13
a spróbuj zmienić na taki kod i zobacz czy za drugim razem (wtedy jak nie wyświetla ludzika) czy program się od razu wyłączy:

C/C++
#include <SDL.h>

int main( int argc, char * args[] )
{
    SDL_Surface * ekran = NULL;
    SDL_Surface * tlo = NULL;
    SDL_Surface * ludek = NULL;
    SDL_Rect przesuniencie_ludka;
    Uint8 * keystate = SDL_GetKeyState( NULL );
    SDL_Event zdarzenie;
    bool wyjscie = false;
   
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 1260, 600, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "Ludek", NULL );
    tlo = SDL_LoadBMP( "bg.bmp" );
    ludek = SDL_LoadBMP( "ludek.bmp" );
    if( ludek == NULL ) return 0;
   
    SDL_SetColorKey( ludek, SDL_SRCCOLORKEY, SDL_MapRGB( ludek->format, 255, 255, 255 ) );
    while( !wyjscie )
    {
        SDL_FillRect( ekran, NULL, 0 );
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT ) wyjscie = true;
           
        }
        if( keystate[ SDLK_RIGHT ] ) przesuniencie_ludka.x++;
        else if( keystate[ SDLK_LEFT ] ) przesuniencie_ludka.x--;
        else if( keystate[ SDLK_UP ] ) przesuniencie_ludka.y--;
        else if( keystate[ SDLK_DOWN ] ) przesuniencie_ludka.y++;
       
        SDL_BlitSurface( tlo, NULL, ekran, NULL );
        SDL_BlitSurface( ludek, NULL, ekran, & przesuniencie_ludka );
        SDL_Flip( ekran );
    }
    SDL_FreeSurface( ludek );
    SDL_FreeSurface( tlo );
    SDL_Quit();
    return 0;
}



a i weż ustaw początkowe wartości w przesuniecie_ludka(x,y,w,h) ;)
być może to właśnie przez to, że nie ustawiasz wartości początkowych wychodzą dziwne wartości i nie wyświetla bitmapy
P-20825
programator
Temat założony przez niniejszego użytkownika
» 2010-08-14 13:08:41
Jesteś genialny!:)
Wielkie dzięki, problem leżał w tym, że wszystkie zmienne (w tym przesuniencie_ludka) były zadeklarowane w main, czyli lokalnie.
A w zmiennych lokalnych są śmieci.
Rozwiązaniem jest tak jak napisałeś zainicjowanie wszystkich zmiennych zerami lub zrobienie ich zmiennymi globalnymi (te są automatycznie inicjowane zerami)
Jestem Ci winien piwo:P
Jeszcze raz dzięki.
P-20827
kamillo121
» 2010-08-14 13:10:12
Spoko, od tego jesteśmy by sobie pomagać..ale nawiasem mówiąc żubra proszę ;)
P-20828
« 1 »
  Strona 1 z 1