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

[Allegro 4.4] Szybkie przesuwanie obiektu myszką, a kolizje

Ostatnio zmodyfikowano 2013-05-29 00:24
Autor Wiadomość
marianekA
Temat założony przez niniejszego użytkownika
[Allegro 4.4] Szybkie przesuwanie obiektu myszką, a kolizje
» 2013-05-11 18:58:35
zobaczyłem w sieci grę RUSH HOUR gdzie samochodziki przesuwa się myszką
i próbuję taka napisać. Niby działa dobrze ale coś jest nie tak.
Sprity wychodzą poza dozwolony obszar jak szybciej pociągnie się myszką.
Myślę że głównym błędem może być sposób w jaki to napisałem a wymyśliłem to tak:
pola, sprity i współrzędne mam w tablicach.
Na ekranie wyświetlam wybrane sprity.
Wskaźnikiem myszki ustalam strefy zajmowane przez sprity i przypisuje im numer sprita.
Po wciśnięciu LMB ustalam punkt 'złapania' wybranego sprita a współrzędna sprita
otrzymuje wartość współrzędnej myszki minus ten punkt złapania.
Sprity maję poruszać się tylko po planie czarnym.
To moja pierwsza próba ze spritami więc przymrużcie trochę oko.
Czy takie rozwiązanie ma sens?, czy powinienem to zrobić inaczej?
...a może dla mnie już pora na czytanie psalmów()
zamieszczam do wglądu pętlę główną.
C/C++
int hs = 0; //punkt złapania sprita (hotspot)
int z = 0; //dodatkowa
int c1, c2, c3, c4; // punkty kontrolne

while( !key[ KEY_ESC ] )
{
    teksty_pomocnicze( mz, hs );
    myszka();
    //--- ustalenie stref zone zajmowanch przez sprity ---
    for( int i = 1; i <= au; ++i )
         if( z == 0 && mb == 0 && mx > sx[ i ] && mx < sx[ i ] + spr[ i ]->w && my > sy[ i ] && my < sy[ i ] + spr[ i ]->h ) mz = i;
    //-----------------------------------------------------------------------
    if( mz > 0 && mz <= au && sa[ mz ] < 11 && z == 0 ) hs = mx - sx[ mz ]; //punkt złapania sprita ruchu poziomego
   
    if( mz > 0 && mz <= au && sa[ mz ] > 10 && z == 0 ) hs = my - sy[ mz ]; //punkt złapania sprita ruchu pionowego
   
    if( mb == 1 )
    {
        if( my > sy[ mz ] && my < sy[ mz ] + spr[ mz ]->h && mz > 0 && sa[ mz ] < 11 ) sx[ mz ] = mx - hs, z = 1; //zmiana 'sx[]'
       
        if( mx > sx[ mz ] && mx < sx[ mz ] + spr[ mz ]->w && mz > 0 && sa[ mz ] > 10 ) sy[ mz ] = my - hs, z = 1; //zmiana 'sy[]'
       
        if( mx < sx[ mz ] || mx > sx[ mz ] + spr[ mz ]->w && my < sy[ mz ] || my > sy[ mz ] + spr[ mz ]->h ) z = 0; //gdy wskaźnik poza zone
        //--- punkty kontrolne - 30 to środek szer. sprita ------------------
        c1 = getpixel( kolizje, sx[ mz ] - 2, sy[ mz ] + 30 );
        c2 = getpixel( kolizje, sx[ mz ] + 1 + spr[ mz ]->w, sy[ mz ] + 30 );
        c3 = getpixel( kolizje, sx[ mz ] + 30, sy[ mz ] - 2 );
        c4 = getpixel( kolizje, sx[ mz ] + 30, sy[ mz ] + 1 + spr[ mz ]->h );
        //-----------------------------------------------------------
        //--- cofnięcie po kolizji - napotkaniu koloru innego niż czarny ---
        if( c1 != 0 ) sx[ mz ] ++, z = 0;
       
        if( c2 != 0 ) sx[ mz ] --, z = 0;
       
        if( c3 != 0 ) sy[ mz ] ++, z = 0;
       
        if( c4 != 0 ) sy[ mz ] --, z = 0;
        //------------------------------------
    }
    if( mb == 0 && z == 1 && sa[ mz ] < 11 ) z = 0, sx[ mz ] =( mx - hs - 30 ) / a * a + 65; //dokładne wstawienie sprita
   
    if( mb == 0 && z == 1 && sa[ mz ] > 10 ) z = 0, sy[ mz ] =( my - hs - 30 ) / a * a + 65; //dokładne wstawienie sprita
   
    //--- bitmapa kolizji - plan poruszania spritów: czarny ----
    masked_blit( elementy, kolizje, 500, 0, 50, 50, 422, 373 ); //wstawienie parkingu do kolizje
    for( int i = 1; i <= au; ++i ) draw_sprite( kolizje, spr[ i ], sx[ i ], sy[ i ] );
    //--------------------------------------------------------------
    blit( elementy, bufor, 0, 0, 50, 50, 422, 373 ); //wstawienie parkingu do bufora
    for( int i = 1; i <= au; ++i ) draw_sprite( bufor, spr[ i ], sx[ i ], sy[ i ] );
   
    blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    rest( 1 );
};
P-82690
DejaVu
» 2013-05-21 08:21:33
Czyli masz problem z tzw. tunnelingiem :) Opis problemu:
Frazy, które należy wpisać w wyszukiwarkę google:
Jeżeli wszystko działa jak trzeba, gdy ruch wykonujesz powoli, to musisz dopisać sobie mechanizm, który będzie prawidłowo wykrywał kolizje w sytuacji, w której różnica między poprzednim położeniem myszy, a różnica między aktualnym położeniem myszy jest duża.
P-83474
marianekA
Temat założony przez niniejszego użytkownika
» 2013-05-29 00:24:29
Na razie projekt odłożyłem bo mam inne zajęcia ale wrócę do niego i jeszcze pokombinuję.
P-84249
« 1 »
  Strona 1 z 1