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

SDL Problem z kolizją

Ostatnio zmodyfikowano 2010-02-02 19:51
Autor Wiadomość
Bartaz
Temat założony przez niniejszego użytkownika
SDL Problem z kolizją
» 2010-02-02 14:27:07
Witam mam problem nie mogę za nic wymyślić kolizji do Ponga(A próbowałem)
Ma ktoś jakis pomysł?
Kod:
C/C++
#include <SDL/SDL.h>

SDL_Surface * paletka1 = NULL;
SDL_Surface * paletka2 = NULL;
SDL_Surface * tlo = NULL;
SDL_Surface * ekran = NULL;
SDL_Surface * pilka = NULL;

SDL_Event zdarzenie;
SDL_Rect LudekDestination;
SDL_Rect Paletka1Destination;
SDL_Rect Paletka2Destination;
SDL_Rect TloDestination;
SDL_Rect PilkaDestination;

Uint8 * keystate = SDL_GetKeyState( NULL );
int x = 70, y = 300; //**********PALETKA 1****************
int e = 900, r = 500; //********PALETKA 2****************
int a = 0, s = 0; //*************TŁO***************
int f = 300, g = 100; //*******PILKA***********


bool wyjscie = false;
int main( int argc, char * args[] )
{
   
    ekran = SDL_SetVideoMode( 1027, 768, 32, SDL_SWSURFACE );
    tlo = SDL_LoadBMP( "Grafika/Tlo.bmp" );
    paletka1 = SDL_LoadBMP( "Grafika/Paletka1.bmp" );
    paletka2 = SDL_LoadBMP( "Grafika/Paletka2.bmp" );
    pilka = SDL_LoadBMP( "Grafika/pilka.bmp" );
   
    //***********************************************
    while( !wyjscie )
    {
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
               
                wyjscie = true;
            }
        }
       
       
       
        if( keystate[ SDLK_UP ] )
        {
           
           
            f = f + 37;
           
            r = r - 37;
           
        }
        if( keystate[ SDLK_DOWN ] )
        {
           
            r = r + 27;
        }
        if( keystate[ SDLK_w ] )
        {
           
            y = y - 37;
           
           
           
        }
        if( keystate[ SDLK_s ] )
        {
           
            y = y + 37;
           
           
        }
       
        //***********************************************
        Paletka1Destination.x = x;
        Paletka1Destination.y = y;
        Paletka2Destination.x = e;
        Paletka2Destination.y = r;
        TloDestination.x = a;
        TloDestination.y = s;
        PilkaDestination.x = f;
        PilkaDestination.y = g;
       
       
        SDL_SetColorKey( paletka1, SDL_SRCCOLORKEY, SDL_MapRGB( paletka1->format, 255, 0, 255 ) );
        SDL_SetColorKey( paletka2, SDL_SRCCOLORKEY, SDL_MapRGB( paletka2->format, 255, 0, 255 ) );
        SDL_SetColorKey( pilka, SDL_SRCCOLORKEY, SDL_MapRGB( pilka->format, 255, 0, 255 ) );
        SDL_BlitSurface( tlo, NULL, ekran, & TloDestination );
        SDL_BlitSurface( paletka1, NULL, ekran, & Paletka1Destination );
        SDL_BlitSurface( paletka2, NULL, ekran, & Paletka2Destination );
        SDL_BlitSurface( pilka, NULL, ekran, & PilkaDestination );
       
        SDL_Flip( ekran );
       
    }
   
    SDL_FreeSurface( paletka1 );
    SDL_FreeSurface( paletka2 );
    SDL_FreeSurface( tlo );
    SDL_Quit();
    return 0;
}
A tu screen jak narazie to wygląda.
http://img716.imageshack.us/img716/1553/beztytuubi.png
EDIT///////////
Właśnie znalazłem na jakimś forum takie coś oto cytat:
"SDL posiada bibliotekę kolizji i nazywa się "sdl_collide"
Ale nie mogę znaleść za bardzo  o niej po Polsku  czy ktoś może wie jak tego używać?
P-13494
DejaVu
» 2010-02-02 16:25:32
Google mówią, że polskich zasobów na ten temat nie ma.

/edit:
Być może to Ciebie zadowoli: http://gpwiki.org/index.php/C:Collision_Detection_between_2_SDL_Surfaces
P-13496
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-02-02 16:36:04
Przetłumaczyło mi to Google ale bezsensu.
Nadal nie mam pojęcia jak tego użyć :(
Tam jest chyba tylko kolizja na okregach(chyba).
P-13497
WunM
» 2010-02-02 16:46:09
Nie wiesz?

C/C++
SDL_Surface * a positioned at( 104, 600 )
SDL_Surface * b positioned at( 708, 256 )

if( SDL_CollideBoundingBox( a, 104, 600, b, 708, 256 ) )
// ...

Ten (i inne) listing tłumaczy wszystko.
P-13498
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-02-02 16:56:41
Mi jakos nie wytłumaczyło.
P-13499
kamillo121
» 2010-02-02 17:08:57
Jak Ci trzeba  , to można przecież  zrobić prostą i jedna funkcję do kolizji  która przyjmuje dwa  SDL_Rect'y  i po trudzie  , 4 warunki i funkcja do wykrywania kolizji jest(co prawda nie najlepsza ale jest ;]) .
//A i jeszcze jedno, tam gdzie "usuwasz" tło to rób to przed pętlą a nie za każdym obiegiem pętli .  //   SDL_SetColorKey //
P-13500
Bartaz
Temat założony przez niniejszego użytkownika
...
» 2010-02-02 17:26:52
Zrobiłem sobie taką kolicje tylko nie wiem czy to ma szanse wogólóle działać:
Pierw obrazek:
http://img211.imageshack.us/img211/4850/obrazek.png
I działalo by to tak ,że  pozycja piłeczki będzie wieksza niż jednaj z tych kulek
i jeżeli bedzie mniejsza (chyba) niż ta druga kulka ta nadole i jeżeli pozycja kulki
bedzie większa niż pozycja paletki x to kolizja ,wiem że dziwne to ale jest(jesli wogóle by to działało)


@kamillo121
A co to da?
I jak by miała wyglądac ta funkca dokładniej(kod);
P-13501
kamillo121
» 2010-02-02 17:39:21
A co to da , że będziesz "czyścił" z tła sprity tylko raz a nie kilka dziesiąt razy na sekunde ? być może przyśpieszy pracę programu w przyszłości ;]

 kod hmm
 
C/C++
bool sprKolizje( SDL_Rect A, SDL_Rect B )
{
   
    if( A.x + A.w <= B.x ) return false; //nie ma kolizji
   
    if( A.x >= B.x + B.w ) return false; //nie ma kolizji
   
    if( A.y + A.h <= B.y ) return false; //nie ma kolizji
   
    if( A.y >= B.y + B.h ) return false; //nie ma kolizji
   
    return true; //jest kolizja
}

 Nie wiem czy to zadziała , bo tak z pamięci piszę ale powinno.
 Wywowułejsz raz po dodaniu do pozycji w osii x kulki a drugi po dodaniu pozycji w osii y kulki ;]   (albo po przypisaniu, zależy jak zmieniasz pozycję kulki xD )
P-13502
« 1 » 2
  Strona 1 z 2 Następna strona