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

[SDL] Przesuwanie sprite'ów w wątku

Ostatnio zmodyfikowano 2012-04-09 14:03
Autor Wiadomość
mejkon
Temat założony przez niniejszego użytkownika
[SDL] Przesuwanie sprite'ów w wątku
» 2012-04-09 13:50:13
Witam,

mam pewien problem. Otóż muszę zrobić swego rodzaju wężyka, wczytuje kolejno 5 obrazków i chcę aby wędrowały wokół ekranu. Chcę to zrobić w wątku i tu zaczyna się mój problem. Funkcja wątku wygląda tak:


int runner1 (void* image)
{
    SDL_Thread *jpg = (SDL_Thread *) image;
    // centre the bitmap on screen
    SDL_Rect dstrect;
    dstrect.x = (screen->w - jpg->w) / 2;
    dstrect.y = (screen->h - jpg->h) / 2;

    // clear screen
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        // draw bitmap
        SDL_BlitSurface(jpg, 0, screen, &dstrect);

        // DRAWING ENDS HERE

        // finally, update the screen :)
        SDL_Flip(screen);
        SDL_Delay(1000);

    // program main loop
    bool done = false;
    while (!done)
    {
        while(dstrect.x - 200 >= 0)
        {
            dstrect.x = dstrect.x - 200;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(jpg, 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_Delay(1000);

        }

        while(dstrect.y - 170 >=0)
        {
            dstrect.y = dstrect.y - 170;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(jpg, 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_Delay(1000);

        }

        while(dstrect.x + 200 <= screen -> w)
        {
            dstrect.x = dstrect.x + 200;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(jpg, 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_Delay(1000);

        }

        while(dstrect.y + 170 <= screen -> h)
        {
            dstrect.y = dstrect.y + 170;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(jpg, 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_Delay(1000);

        }


    } // end main loop

    return 0;
}

i nie wiem teraz jak schynchronizować te wątki aby po ekranie chodził jednolity, 5-cio elementowy "wężyk"!

Próbowałem to zrobić za pomocą mutexa ale nie wiem czy to nieodpowiedni sposób czy ja to źle robię:


int runner2 (void* mut)
{
    SDL_mutex *lock = (SDL_mutex *) mut;
    // centre the bitmap on screen
    SDL_mutexP(lock);
    SDL_Rect dstrect;
    dstrect.x = (screen->w - surf[2]->w) / 2;
    dstrect.y = (screen->h - surf[2]->h) / 2;

    // clear screen
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        // draw bitmap
        SDL_BlitSurface(surf[2], 0, screen, &dstrect);

        // DRAWING ENDS HERE

        // finally, update the screen :)
        SDL_Flip(screen);
        SDL_mutexV(lock);
        SDL_Delay(1000);

    // program main loop
    bool done = false;
    while (!done)
    {
        while(dstrect.x - 200 >= 0)
        {
            SDL_mutexP(lock);
            dstrect.x = dstrect.x - 200;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(surf[2], 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_mutexV(lock);
            SDL_Delay(1000);

        }

        while(dstrect.y - 170 >=0)
        {
            SDL_mutexP(lock);
            dstrect.y = dstrect.y - 170;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(surf[2], 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_mutexV(lock);
            SDL_Delay(1000);

        }

        while(dstrect.x + 200 <= screen -> w)
        {
            SDL_mutexP(lock);
            dstrect.x = dstrect.x + 200;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(surf[2], 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_mutexV(lock);
            SDL_Delay(1000);

        }

        while(dstrect.y + 170 <= screen -> h)
        {
            SDL_mutexP(lock);
            dstrect.y = dstrect.y + 170;

            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_BlitSurface(surf[2], 0, screen, &dstrect);

            // DRAWING ENDS HERE

            // finally, update the screen :)
            SDL_Flip(screen);
            SDL_mutexV(lock);
            SDL_Delay(1000);

        }


    } // end main loop

    return 0;
}

Byłbym wdzięczny za jakąś pomoc

PS.
Czy przez funkcję tworzącą wątek SDL_CreateThread (runner2 , mutex); da się przekazać więcej niż jeden zestaw danych tj. czy zamiast wysłana tylko mutexu lub obrazka można wysłać i mutex i obrazek?
P-54169
RazzorFlame
» 2012-04-09 14:03:53
Ahhh jesli chodzi ci o cos takiego
C/C++
//tutaj poruszanie pierwszego obrazu

for( int i = 0; i < 5; i++ )
{
    obrazki[ 1 ].x = obrazki[ i - 1 ] x - szerokoscobrazkow;
}
//albo
for( int i = 0; i < 5; i++ )
{
    obrazki[ i ].x++; //tutaj jaki ruch maja wykonywac
}
Tu masz pokazane jak poruszac w pozycji x.
No ewentualnie mozesz zrobic cos takiego.
C/C++
enum RUCH
{
    LEFT,
    RIGHT,
    UP,
    DOWN
};

RUCH ruchy[ 5 ];
ruchy[ 0 ] = RIGHT; // poczatkowy ruch pierwszego obrazka
//itd
//tutaj ify pozycji np jezeli pozycja jakiegos tam obrazka to .../... wtedy zmien jego ruch na ...

//dalej ify np jezeli ruch poszczegolnego obrazka == RIGHT wtedy dodawaj mu pozycje x
Ojj nie chcialo mi sie pisac tyle tego wiec ci napisalem w komentarzach o co chodzi

EDIT:
Pokaze ci jak to wyglada na 1 obrazku
C/C++
enum RUCH
{
    RIGHT,
    LEFT,
    UP,
    DOWN
};

class OBRAZEK
{
public:
    OBRAZEK( int pozycja_x, int pozycja_y, int szerokosc, int wysokosc, RUCH pierwszyruch )
        : akt_ruch( pierwszyruch )
        , x( pozycja_x )
        , y( pozycja_y )
        , w( szerokosc )
        , h( wysokosc ) //konstruktor klasy
    {
    }
    RUCH akt_ruch; //aktualny ruch
    int x, y, w, h;
    //... jesli chcesz to jeszcze cos
};

OBRAZEK obr1( 50, 50, 40, 40, RIGHT );

//to w petli

if( obr1.akt_ruch == RIGHT ) obr1.x++;

if( obr1.akt_ruch == LEFT ) obr1.x--;

if( obr1.akt_ruch == UP ) obr1.y--;

if( obr1.akt_ruch == DOWN ) obr1.y++;

if( obr1.x >= 400 && obr1.y = 50 ) obr1.akt_ruch = DOWN;

if( obr1.x >= 400 && obr1.y = 400 ) obr1.akt_ruch = LEFT;

if( obr1.x >= 50 && obr1.y = 400 ) obr1.akt_ruch = UP;

if( obr1.x >= 50 && obr1.y = 50 ) obr1.akt_ruch = RIGHT;


Ten obrazek bedzie sie ruszal w kolko tak:

>>>>>
^       |
|        |
|<----- v

Szczerze mowiac to nie za bardzo wiem co to sa wątki ale jezeli ci chodzi o to, to prosze bardzo :).
P-54171
« 1 »
  Strona 1 z 1