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

[SDL, C++] Zamazywanie tła przez bitmapę

Ostatnio zmodyfikowano 2010-08-14 00:12
Autor Wiadomość
PROgress
Temat założony przez niniejszego użytkownika
[SDL, C++] Zamazywanie tła przez bitmapę
» 2010-08-13 23:20:52
Dobra, problem wydaje się głupi, ale nie mogę z niego jakoś wybrnąć...
Poprzeglądałem sobie wszystkie tematy i nic. Mianowicie chodzi o to ,iż rysuję postać, zmieniam jej tło na przeźroczyste i kiedy nią poruszam postać zostawia za sobą ślad(ona sama się rozmazuje).
Dam jeszcze kod:
C/C++
include < SDL.h >

//pozycja naszego bohatera
int bohater_x = 0;
int bohater_y = 0;
//czy chcemy wyjsc
bool myExit = false;

//pokazujemy okno z ludzikiem na przeźroczystym tle
SDL_Surface * ekran = NULL;
SDL_Surface * bitmap = NULL;
SDL_Rect rct_bitmap; //tworzymy prostokąt do poruszania bohaterem
SDL_Event main_event; //główne zdarzenie obsługujące pętlę

Uint8 * keystate = SDL_GetKeyState( NULL ); //obsługa klawiatury



int main( int argc, char * argv[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
   
    ekran = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "TEST", NULL ); //tytuł okna
   
   
   
    bitmap = SDL_LoadBMP( "test.bmp" );
   
    SDL_SetColorKey( bitmap, SDL_SRCCOLORKEY, SDL_MapRGB( bitmap->format, 255,
    0, 255 ) ); //ustawiamy przeźroczystość
    //===============================================================================
    //przypisujemy wymiary zmiennej prostkata bitmapy
    rct_bitmap.w = bitmap->w;
    rct_bitmap.h = bitmap->h;
    //======================================================================================
   
    SDL_FillRect( ekran, NULL, 0 );
    while( !myExit )
    {
        while( SDL_PollEvent( & main_event ) )
        {
            if( main_event.type == SDL_QUIT )
            {
                myExit = true;
            }
        }
        //ustwiamy klawisze ruchu
        if( keystate[ SDLK_RIGHT ] ) { bohater_x++; }
        if( keystate[ SDLK_LEFT ] ) { bohater_x--; }
        if( keystate[ SDLK_UP ] ) { bohater_y--; }
        if( keystate[ SDLK_DOWN ] ) { bohater_y++; }
        if( keystate[ SDLK_ESCAPE ] ) { myExit = true; }
       
       
        rct_bitmap.x = bohater_x; //przypisujemy bitmapie zmienne pozycji
        rct_bitmap.y = bohater_y;
       
        SDL_BlitSurface( bitmap, NULL, ekran, & rct_bitmap );
        SDL_Flip( ekran );
    }
   
   
   
    SDL_FreeSurface( bitmap );
    SDL_Quit();
   
    return 0;
   
}
Być może chodzi o linijki dotyczące rysowania i aktualizacji obrazka i ekranu...
Proszę o pomoc:/
P-20807
kamillo121
» 2010-08-13 23:27:43
Ekran zamalowujesz tylko raz przed pętlą na czarno "SDL_FillRect..."
jeżeli to dasz na początku ale w pętli while to powinno być okey ;]

//Oczywiście w tej pierwszej głównej pętli while

dzieje się tak dlatego, że kopiujesz postać na "ekran" w nowej pozycji ale to nie znaczy, że zniknie ze starej, po prostu "domalujesz" do starego renderu postać w nowej pozycji co w efekcie da rozmnożoną postać ;D
P-20808
PROgress
Temat założony przez niniejszego użytkownika
» 2010-08-13 23:44:22
Okej, stokrotne dzięki!:D Teraz jeszcze jedno pytanko. Gdy rysuję teraz postać na jakimś tle to wydajność programu drastycznie spada...
Kodzik:

//wszystko co wyżej
 SDL_BlitSurface(tlo, NULL, ekran, NULL);
 SDL_BlitSurface(bitmap, NULL, ekran, &rct_bitmap);
 SDL_Flip(ekran);
//dalsza część pętli...
P-20809
kamillo121
» 2010-08-13 23:46:47
co znaczy, że wydajność spada ? jak to obserwujesz ?
P-20810
PROgress
Temat założony przez niniejszego użytkownika
» 2010-08-13 23:56:06
Sprite porusza się znacznie wolniej niż dotychczas:/
P-20811
kamillo121
» 2010-08-14 00:05:30
No to raczej niemożliwe, musiałbyś mieć strasznie zmulonego kompa, żeby odczuć spowolnienie przez dodanie takich rzeczy, może ci się tylko wydaje:)

A co do poruszania postacią możesz zmienić dwie rzeczy:
co do keystat, gdy użytkownik nie naciśnie żadnego klawisza to po co sprawdzać czy naciśnięty klawisz to left itd ?
nie lepiej tak :
C/C++
while(...)
{
    while(...)
    {
        if( event.type == SDL_KEYDOWN )
        {
            tutaj sprawdasz keystate
        }
    }
   
}

a druga sprawa to tak, że używasz zmiennych  bohater_x i y  gdzie te zmienne służą jako "wektor" przesunięcia, ale skoro nie masz jakiejś rozbudowanej fizyki itd to możesz po prostu:

C/C++
if( keystate[ SDLK_RIGHT ] ) { rct_bitmap.x++; }
itd

dzięki czemu nie musisz przypisywać potem do zmiennych rct_bitmap.x i y zmiennych bohater_x i y
P-20813
PROgress
Temat założony przez niniejszego użytkownika
» 2010-08-14 00:12:22
OK, dzięki za wszystko. Popracuję nad tym i postaram się coś wykombinować;)
P-20814
« 1 »
  Strona 1 z 1