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

[SDL] Prostokąty/tablice/wyświetlanie sprite

Ostatnio zmodyfikowano 2012-07-11 21:46
Autor Wiadomość
Wasilek
Temat założony przez niniejszego użytkownika
[SDL] Prostokąty/tablice/wyświetlanie sprite
» 2012-07-10 20:59:26
Mając na celu ćwiczenia z biblioteką postanowiłem się trochę pobawić ... efektem mojej pracy był pistolet wystrzeliwujący kulkę, która grzęzła w ścianie (i tutaj wszystko dobrze działało)

Następnie postanowiłem zrobić to samo tylko, że dla 15 kulek ... no i tutaj pojawiają się problemy ... kulki nie powstają, a na dodatek jakimś cudem ściana przenosi się w miejsce, w którym powinna być kulka.

Tutaj jest kod od pierwszej wersji - ten który działa poprawnie

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

SDL_Surface * ekran = NULL;
SDL_Surface * pistolet = NULL;
SDL_Surface * obraz = NULL;
SDL_Surface * kursor = NULL;
SDL_Surface * kulka = NULL;
SDL_Surface * sciana = NULL;

int myszkaX, myszkaY;

SDL_Event zdarzenie;
SDL_Rect kursorr;
SDL_Rect pistoletr;
SDL_Rect kulkar;
SDL_Rect scianar;

Uint8 * keystate = SDL_GetKeyState( NULL );

float kulkax, kulkay;

float x = 480, y = 80;

bool wyjscie = false;

void s_k() // Kolizja kulki ze œcian¹
{
    if( kulkar.x <= scianar.x + 20 && kulkar.x + 4 >= scianar.x && kulkar.y <= scianar.y + 50 && kulkar.y + 4 >= scianar.y )
    {
        if( kulkax < 0 )
        {
            kulkax = kulkax + 0.012;
        }
    }
}

void t_k() // Tworzenie kulki
{
    kulkar.x = pistoletr.x + 4;
    kulkar.y = pistoletr.y + 4;
    kulkax = - 0.1;
}

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 640, 400, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    obraz = SDL_LoadBMP( "tlo.bmp" );
    pistolet = SDL_LoadBMP( "pistolet.bmp" );
    kursor = SDL_LoadBMP( "kursor.bmp" );
    sciana = SDL_LoadBMP( "sciana.bmp" );
    kulka = SDL_LoadBMP( "kulka.bmp" );
   
    scianar.x = 90;
    scianar.y = 50;
    scianar.w = 20;
    scianar.h = 50;
   
    kulkar.w = 4;
    kulkar.h = 4;
    kulkar.x = 640;
    kulkar.y = 400;
   
    pistoletr.x = x;
    pistoletr.y = y;
   
    kursorr.x = 0;
    kursorr.y = 0;
    SDL_BlitSurface( obraz, NULL, ekran, NULL );
    SDL_SetColorKey( kursor, SDL_SRCCOLORKEY, SDL_MapRGB( kursor->format, 255, 0, 0 ) );
    SDL_SetColorKey( pistolet, SDL_SRCCOLORKEY, SDL_MapRGB( pistolet->format, 255, 255, 255 ) );
    SDL_SetColorKey( sciana, SDL_SRCCOLORKEY, SDL_MapRGB( sciana->format, 255, 255, 255 ) );
    SDL_SetColorKey( kulka, SDL_SRCCOLORKEY, SDL_MapRGB( kulka->format, 255, 255, 255 ) );
   
    while( !wyjscie )
    {
        SDL_ShowCursor( SDL_DISABLE );
        SDL_BlitSurface( kursor, NULL, ekran, & kursorr );
        SDL_Flip( ekran );
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true;
            }
            if( zdarzenie.type == SDL_MOUSEMOTION )
            {
                kursorr.x = zdarzenie.motion.x;
                kursorr.y = zdarzenie.motion.y;
            }
        }
        if( zdarzenie.key.keysym.sym == SDLK_ESCAPE ) wyjscie = true;
       
        if( keystate[ SDLK_LEFT ] )
        {
            x = x - 0.5;
        }
        if( keystate[ SDLK_RIGHT ] )
        {
            x = x + 0.5;
        }
        if( keystate[ SDLK_UP ] )
        {
            y = y - 0.5;
        }
        if( keystate[ SDLK_DOWN ] )
        {
            y = y + 0.5;
        }
        if( keystate[ SDLK_SPACE ] )
        {
            t_k();
        }
        s_k();
        pistoletr.x = x;
        pistoletr.y = y;
        kulkar.x = kulkar.x + kulkax;
        kulkar.y = kulkar.y + kulkay;
        SDL_BlitSurface( obraz, NULL, ekran, NULL );
        SDL_BlitSurface( pistolet, NULL, ekran, & pistoletr );
        SDL_BlitSurface( kulka, NULL, ekran, & kulkar );
        SDL_BlitSurface( sciana, NULL, ekran, & scianar );
        SDL_Flip( obraz );
        SDL_Flip( pistolet );
        SDL_Flip( sciana );
        SDL_Flip( kulka );
       
       
    }
    SDL_FreeSurface( pistolet );
    SDL_FreeSurface( obraz );
    SDL_FreeSurface( kursor );
    SDL_FreeSurface( kulka );
    SDL_FreeSurface( sciana );
    SDL_Quit();
    return 0;
}

A tutaj kod dla 15 kulek.

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

SDL_Surface * ekran = NULL;
SDL_Surface * pistolet = NULL;
SDL_Surface * obraz = NULL;
SDL_Surface * kursor = NULL;
SDL_Surface * kulka = NULL;
SDL_Surface * sciana = NULL;

int myszkaX, myszkaY;
int n = 0; // zmienna od tworzenia kulek
SDL_Event zdarzenie;
SDL_Rect kursorr;
SDL_Rect pistoletr;
SDL_Rect kulkar[ 15 ];
SDL_Rect scianar;

Uint8 * keystate = SDL_GetKeyState( NULL );

float kulkax[ 15 ], kulkay[ 15 ]; // zmienne od prędkości kulek

float x = 480, y = 80; // zmienne od pozycji pistoletu

bool wyjscie = false;

void s_k() // Kolizja kulki ze ścianą
{
    for( int a; a < 15; a++ )
    if( kulkar[ a ].x <= scianar.x + 20 && kulkar[ a ].x + 4 >= scianar.x && kulkar[ a ].y <= scianar.y + 50 && kulkar[ a ].y + 4 >= scianar.y )
    {
        if( kulkax[ a ] < 0 )
        {
            kulkax[ a ] = kulkax[ a ] + 0.012;
        }
    }
}

void t_k() // Tworzenie kulki
{
   
    kulkar[ n ].x = pistoletr.x + 4;
    kulkar[ n ].y = pistoletr.y + 4;
    kulkax[ n ] = - 0.1;
    n++;
   
}

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 640, 400, 32, SDL_SWSURFACE | SDL_DOUBLEBUF );
    obraz = SDL_LoadBMP( "tlo.bmp" ); // 640*400
    pistolet = SDL_LoadBMP( "pistolet.bmp" ); // 37*25
    kursor = SDL_LoadBMP( "kursor.bmp" ); // 12*8
    sciana = SDL_LoadBMP( "sciana.bmp" ); // 20*50
    kulka = SDL_LoadBMP( "kulka.bmp" ); // 4*4
    for( int a = 0; a < 15; a++ ) // umiejscowienie kulek - nie wiem czy potrzebne :D
    {
        kulkar[ a ].w = 4;
        kulkar[ a ].h = 4;
        kulkar[ a ].x = 640;
        kulkar[ a ].y = 400;
    }
   
    scianar.x = 90; // miejsce sciany
    scianar.y = 50;
    scianar.w = 20;
    scianar.h = 50;
   
   
   
    pistoletr.x = x; // miejsce pistoletu
    pistoletr.y = y;
   
    kursorr.x = 0; // miejsce kursora
    kursorr.y = 0;
    SDL_SetColorKey( kursor, SDL_SRCCOLORKEY, SDL_MapRGB( kursor->format, 255, 0, 0 ) );
    SDL_SetColorKey( pistolet, SDL_SRCCOLORKEY, SDL_MapRGB( pistolet->format, 255, 255, 255 ) );
    SDL_SetColorKey( sciana, SDL_SRCCOLORKEY, SDL_MapRGB( sciana->format, 255, 255, 255 ) );
    SDL_SetColorKey( kulka, SDL_SRCCOLORKEY, SDL_MapRGB( kulka->format, 255, 255, 255 ) );
   
   
    while( !wyjscie )
    {
        SDL_ShowCursor( SDL_DISABLE );
        SDL_BlitSurface( kursor, NULL, ekran, & kursorr );
        SDL_Flip( ekran );
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true;
            }
            if( zdarzenie.type == SDL_MOUSEMOTION )
            {
                kursorr.x = zdarzenie.motion.x;
                kursorr.y = zdarzenie.motion.y;
            }
        }
        if( zdarzenie.key.keysym.sym == SDLK_ESCAPE ) wyjscie = true;
       
        if( keystate[ SDLK_LEFT ] ) // sterowanie pistoletem
        {
            x = x - 0.5;
        }
        if( keystate[ SDLK_RIGHT ] )
        {
            x = x + 0.5;
        }
        if( keystate[ SDLK_UP ] )
        {
            y = y - 0.5;
        }
        if( keystate[ SDLK_DOWN ] )
        {
            y = y + 0.5;
        }
        if( keystate[ SDLK_SPACE ] )
        {
            t_k(); // funkcja od tworzenia kulek
        }
        s_k(); // funkcja od kolizji
        pistoletr.x = x;
        pistoletr.y = y;
       
        for( int a; a < 15; a++ ) // poruszanie kulkami
        {
            kulkar[ a ].x = kulkar[ a ].x + kulkax[ a ];
            kulkar[ a ].y = kulkar[ a ].y + kulkay[ a ];
            SDL_BlitSurface( kulka, NULL, ekran, & kulkar[ a ] );
        }
        SDL_BlitSurface( obraz, NULL, ekran, NULL ); // pokazanie wszystkiego na ekranie
        SDL_BlitSurface( pistolet, NULL, ekran, & pistoletr );
        SDL_BlitSurface( sciana, NULL, ekran, & scianar );
        SDL_Flip( obraz );
        SDL_Flip( pistolet );
        SDL_Flip( sciana );
        SDL_Flip( kulka );
       
       
    }
    SDL_FreeSurface( pistolet );
    SDL_FreeSurface( obraz );
    SDL_FreeSurface( kursor );
    SDL_FreeSurface( kulka );
    SDL_FreeSurface( sciana );
    SDL_Quit();
    return 0;
}

Gdzie jest błąd ? :D
P-59812
Wasilek
Temat założony przez niniejszego użytkownika
» 2012-07-11 18:20:36
Zna ktoś może przyczynę tego problemu ?
Bez tego nie mam zbytnio jak ruszyć dalej ... a nigdzie nie mogę znaleźć rozwiązania :<
P-59870
SeaMonster131
» 2012-07-11 19:34:16
for( int a; a < 15; a++ )
zmienna "a" to jakieś śmieci, bo nie przypisujesz jej wartości.
P-59871
Wasilek
Temat założony przez niniejszego użytkownika
» 2012-07-11 19:41:16
Poprawiłem w dwóch miejscach zmienną "a" (moje niedopatrzenie :< ), jednak to jeszcze nie wszystko :/

Czy takie coś jest poprawne ---> SDL_Rect kulkar[15];   ?
P-59872
Wasilek
Temat założony przez niniejszego użytkownika
» 2012-07-11 21:26:36
Po kolejnych "chwilach" namysłu zmieniłem kolejność wyświetlania i kulki "widać" na ekranie ... ale nadal nie wiem czemu "ściana" przenosi się na miejsce kulek, zauważyłem, że jest to związane ze zmienną "n"
Jakieś sugestie ?
P-59876
Wasilek
Temat założony przez niniejszego użytkownika
» 2012-07-11 21:46:49
Po kolejnych próbach udało mi się naprawić błąd, wszystko działa tak jak powinno ^^
Ale nadal nie wiem czemu ściana przesuwała się na pozycję startową kulki gdy próbowałem wystrzelić więcej pocisków niż podałem w tabeli :<
Ale jak na razie można chyba zamknąć :D

btw Nikt nie odpowiada w tematach, abyśmy sami męczyli się z rozwiązaniami ? :D
P-59877
« 1 »
  Strona 1 z 1