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

[Allegro] Mapa kafelkowa - kolizje

Ostatnio zmodyfikowano 2011-11-27 12:31
Autor Wiadomość
RazzorFlame
Temat założony przez niniejszego użytkownika
[Allegro] Mapa kafelkowa - kolizje
» 2011-11-20 18:10:48
Mam pytanie. Powiedzmy ze mamy ludka i kafelki. Czy w platformowce zeby sprawdzić kolizje z wszystkimi kafelkami z mapy trzeba robic kilka/kilkanascie roznych bitmap? Np chciałbym aby ludek nie spadał z ziemi. To wtedy mi sprawdza kolizje tylko z 1 kafelkiem. Niechce zadnego kodu tylko przykład jak mozna to zrobic POMOCY!
P-44394
SeaMonster131
» 2011-11-20 18:12:17
Tzn? Jeżeli masz mapę kafelkową to dajesz np:

C/C++
if( mapa[ ludek.y / dlugosc_kafelka ][ ludek.x / szerokosc_kafelka ] != ziemia )
     ludek.y++;

P-44395
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2011-11-20 18:16:43
Np masz mape:

C/C++
short int map[ 10 ][ 10 ]
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
    0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
    0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
} };
Np 1 to ziemia. I tych kafelkow jest tu 5. To trzeba 5 bitmap robic?
P-44396
pekfos
» 2011-11-20 18:21:25
nie. wystarczy jedna.
P-44397
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2011-11-20 18:26:44
Pefkos. Mam taki kod:

main.cpp
C/C++
#include <allegro.h>
#include "decl.h"


int main()
{
    allegro_init();
    install_mouse();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    set_palette( default_palette );
    set_window_title( "Collision" );
    clear_to_color( screen, 48 );
   
   
   
   
    BITMAP * bufor = NULL;
   
   
    bufor = create_bitmap( 800, 600 );
   
   
    OBJECT back;
    OBJECT ludek;
   
    back.x = 200;
    back.y = 400;
    back.w = 50;
    back.h = 50;
    back.bmp = load_bmp( "back1.bmp", default_palette );
   
    ludek.w = 18;
    ludek.h = 48;
    ludek.x = 200;
    ludek.y = 200;
    ludek.bmp = load_bmp( "image.bmp", default_palette );
   
    show_mouse( screen );
    while( !key[ KEY_ESC ] )
    {
        back.x = 0;
        unscare_mouse();
       
       
        if( key[ KEY_RIGHT ] ) ludek.x++;
       
        if( key[ KEY_LEFT ] ) ludek.x--;
       
       
        if( collide_up( ludek, back ) == true ) ludek.y = back.y - ludek.h - 1;
       
        if( collide_down( ludek, back ) == true ) ludek.y = back.y + back.h + 1;
       
        if( collide_up( ludek, back ) == false ) ludek.y += 3;
       
       
       
       
        while( back.x != 800 )
        {
           
            masked_blit( back.bmp, bufor, 0, 0, back.x, back.y, back.w, back.h );
            back.x += 50;
        }
        masked_blit( ludek.bmp, bufor, 0, 0, ludek.x, ludek.y, ludek.w, ludek.h );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        clear_to_color( bufor, makecol( 255, 255, 255 ) );
       
    }
   
   
    return 0;
   
}
END_OF_MAIN();

decl.h
C/C++
class OBJECT
{
public:
    int x;
    int y;
    int w;
    int h;
   
    int b;
    int c;
   
    BITMAP * bmp;
   
};

bool collide_up( OBJECT A, OBJECT B )
{
   
    if( A.y >= B.y - A.h - 1 && A.y < B.y + B.h / 2 && A.x + A.w >= B.x && A.x <= B.x + B.w ) return true;
    else return false;
   
}

bool collide_down( OBJECT A, OBJECT B )
{
   
    if( A.y <= B.y + B.h && A.y > B.y && A.x + A.w >= B.x && A.x <= B.x + B.w ) return true;
    else return false;
   
}

Nie działa mi kolizja z wszystkimi.
P-44399
pekfos
» 2011-11-20 18:55:49
if( collide_down( ludek, back ) == true ) ludek.y = back.y + back.h + 1;
to ma sens?
BTW: zmień nazwę tematu bo ta jest zła
(http://cpp0x.pl/forum/temat/?id=5565&p=2 zobacz sobie post z FAQ część 1)
P-44400
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2011-11-20 18:56:49
Ma sens tam jest definicja. Pozatem wtedy nieda sie przejsc przez bitmape.
P-44401
pekfos
» 2011-11-20 19:00:43
jak ma sens? jeśli dobrze rozumiem to pseudokodem można to tak zapisać
jeżeli gracz koliduje dolną krawędzią z czymś to przenieś gracza za dolną krawędź tego czegoś
// i zmień nazwę tematu
P-44402
« 1 » 2
  Strona 1 z 2 Następna strona