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

[Allegro] Znów ta kolizja

Ostatnio zmodyfikowano 2009-07-03 13:17
Autor Wiadomość
malpka321
Temat założony przez niniejszego użytkownika
» 2009-06-30 20:28:30
wiem wiem, tylko gdybym umiał rozwiązać ten problem to bym nie pisał na forum i nie zawracał wam głowy, ale i tak dzięki-może mi coś zaświta w głowie i rozwiąże problem
P-8112
DejaVu
» 2009-06-30 21:35:40
1. ustal położenie obiektu po wciśnięciu klawisza (lub po uwzględnieniu grawitacji)
2. ustal zbiór klocków, które zajmuje ludek
3. dla każdego klocka zajmowanego wykonuj:
3.1. jeśli klocek jest kolizją - porównaj algorytmem wykrywania kolizji czy ludek najeżdża na klocek - jeśli tak -> kolizja na danym klocku.

Algorytm kolizji powinien być w tym przypadku ten, który podałem wcześniej, tj. wykrywanie zderzeń prostokątów. Używanie wykrycia kolizji w Twojej postaci nie zda egzaminu. Ty obecnie sprawdzasz tylko czy ludek zajmuje klocek i dlatego masz problemy.

/edit:
Po głębszym zastanowieniu Twój algorytm wykrywania kolizji zadziała, jeśli wyznaczysz prawidłowo zbiór klocków, które zajmuje ludek :)

/edit2:
Innymi słowy musisz wyznaczyć te klocki, które są zaznaczone na różowo :)
P-8114
malpka321
Temat założony przez niniejszego użytkownika
» 2009-07-02 21:32:01
próbowałem napisać kod tym sposobem co napisałeś, ale kurcze za nic mi nie wychodzi.
Stworzyłem również 4 nowe zmienne- pozycje ludka w każdym kierunku +/- 1.tzn. np. (ludek.x-1)/40, (ludek.y+1)/40 itd.- niestety kolizja nie działa.
P-8165
DejaVu
» 2009-07-02 23:14:39
C/C++
#include <allegro.h>
#include "postac.h"
#include "game.h"


int main()
{
    uruchom_allegro();
   
    // Wskaźniki
    BITMAP * bufor = create_bitmap( 640, 480 );
    BITMAP * ludekb1 = NULL;
    BITMAP * ludekb2 = NULL;
    BITMAP * tlo = NULL;
    BITMAP * teren = NULL;
   
    //Ładowanie  obrazków
    teren = load_bmp( "teren.bmp", default_palette );
    ludekb1 = load_bmp( "ludek.bmp", default_palette );
    tlo = load_bmp( "tlo.bmp", default_palette );
    ludekb2 = load_bmp( "ludekb2.bmp", default_palette );
   
   
    bohater ludek, ludek2;
   
    ludek.x = 440; ludek.y = 40; ludek.s = 40; ludek.w = 40;
    ludek2.x = 300; ludek2.y = 300; ludek2.s = 40; ludek2.w = 40;
   
   
    ludek.dodaj_wartosci();
    bool help = false;
    bool kolizja = false;
    bool grawitacja;
    bool mp = true;
    bool ml;
    double predkoscLotu = 0;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            grawitacja = true;
            mp = true;
            ml = true;
            ludek.update();
           
            // Obsługa klawiatury
            for( int x = ludek.x; x <= ludek.x + 40; x += 39 )
            for( int y = ludek.y; y <= ludek.y + 40; y += 39 )
            if( x <= 600 && y <= 440 )
            {
                if(( map[( y +( int ) predkoscLotu ) / 40 ][ x / 40 ] ) == 15 ) grawitacja = false;
               
                if(( map[ y / 40 ][( x - 1 ) / 40 ] ) == 15 ) ml = false;
               
                if(( map[ y / 40 ][( x + 1 ) / 40 ] ) == 15 ) mp = false;
               
            }
           
            if( ml == true ) { if( key[ KEY_LEFT ] ) ludek.x--; }
           
            if( mp == true ) { if( key[ KEY_RIGHT ] ) ludek.x++; }
           
            if( grawitacja == false ) predkoscLotu = 1;
           
            if( key[ KEY_UP ] && grawitacja == false ) predkoscLotu =- 4;
           
            if( grawitacja == true )
            {
                ludek.y += predkoscLotu;
                predkoscLotu += 0.1;
            }
           
            if( key[ KEY_A ] ) ludek.expup( 100 );
           
            if( key[ KEY_S ] ) ludek.hpup( 100 );
           
            if( key[ KEY_D ] ) ludek.hpdown( 100 );
           
            if( key[ KEY_P ] ) help = true;
           
            if( key[ KEY_O ] ) help = false;
           
           
            if( ludek.y < 0 ) ludek.y = 0;
           
            if( ludek.x < 0 ) ludek.x = 0;
           
            if( ludek.y > 440 ) ludek.y = 440;
           
            if( ludek.x > 600 ) ludek.x = 600;
           
            speed--;
        }
       
       
       
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
       
        if( ludek.exp > ludek.max_exp )
        {
            ludek.lvlup();
           
        }
       
       
       
        wys_mape( bufor, teren );
       
        masked_blit( ludekb1, bufor, 0, 0, ludek.x, ludek.y, ludek.s, ludek.w );
        masked_blit( ludekb2, bufor, 0, 0, ludek2.x, ludek2.y, ludek2.s, ludek2.w );
        masked_blit( tlo, bufor, 0, 0, 5, 5, 200, 100 );
        ludek.wyswietl( bufor );
       
       
       
       
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( ludekb1 );
    destroy_bitmap( ludekb2 );
    destroy_bitmap( tlo );
    destroy_bitmap( teren );
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-8173
malpka321
Temat założony przez niniejszego użytkownika
» 2009-07-03 13:17:17
WIELKIE DZIĘKI. Teraz przeanalizuje kod i zobaczę jak to zrobiłeś mistrzu xD
Problem rozwiązany !!!
P-8184
1 « 2 »
Poprzednia strona Strona 2 z 2