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

Obliczanie wierzchołków na obiekcie, warunek odpowiadający za kolizję.

Ostatnio zmodyfikowano 2012-05-06 14:23
Autor Wiadomość
Trust
Temat założony przez niniejszego użytkownika
Obliczanie wierzchołków na obiekcie, warunek odpowiadający za kolizję.
» 2012-05-02 02:15:12
Witam !!!
tym razem chodzi o kolizje. Niżej kawałek kodu, który odpowiada za obliczanie wierzchołków samochodu nr. 1 i nr. 2 :

C/C++
//samochod 1

int kx1 = 0, ky2 = 0, kx3 = 0, ky4 = 0, kx5 = 0, ky6 = 0;



kx1 = 52 + s1_y; // lewy dolny rog
ky2 = s1_x + 0;

kx3 = 41 + s1_x; // prawy gorny
ky4 = s1_y + 0;

kx5 = s1_x + 41; //prawy dolny
ky6 = s1_y + 52;



//samochod 2

int kx7 = 0, ky8 = 0, kx9 = 0, ky10 = 0, kx11 = 0, ky12 = 0;



kx7 = 52 + s2_y; // lewy dolny rog
ky8 = s2_x + 0;

kx9 = 41 + s2_x; // prawy gorny
ky10 = s2_y + 0;

kx11 = s2_x + 41; //prawy dolny
ky12 = s2_y + 52;

Wymiary obrazka to ( czyli samochodu 1 i 2 ) to 41x52. Zmienne s1_x,s1_y,s2_x,s2_y to współrzędne początkowe na jakich są ustawione samochody. I gdy przechodzę do pętli warunkowej np:
C/C++
if(( kx1, ky2 ) =( kx9, ky10 ) )
{
    s2_x - 10;
    //lub
    kx1 - 10;
}

lub

C/C++
if(( kx1, ky2 ) >=( kx9, ky10 ) )
{
    s2_x - 10;
    //lub
    kx1 - 10;
}

...która ma sprawdzać czy samochód 1(lewy dolny róg) styka się z samochodem 2 (prawy górny róg) w ogóle nie reaguje tzn. samochód 1 nie jest cofnięty na osi x o 10 pikseli. I tu pytanie dlaczego ? Przecież to jest TYLKO jeden warunek i nic, zero reakcji. Głowię się nad tym już z 3-4 godz. dlatego proszę o pomoc:)

A tu cały kod:
C/C++
#include <allegro.h>

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    allegro_init();
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 880, 686, 0, 0 );
   
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 150 ) );
   
    BITMAP * buffer = create_bitmap( 880, 686 );
    clear_to_color( buffer, 0x333333 );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
   
    BITMAP * s1 = NULL;
    BITMAP * s2 = NULL;
    BITMAP * MAPA = NULL;
    BITMAP * bufor = NULL;
    BITMAP * start = NULL;
    BITMAP * choinki = NULL;
    BITMAP * barierki = NULL;
   
    SAMPLE * dzwiek = NULL;
    SAMPLE * dzwiek1 = NULL;
   
   
   
   
   
    //********LADOWANIE***SAMOCHODOW************************************************
    bufor = create_bitmap( 880, 686 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    MAPA = load_bmp( "mapy/MAPA.bmp", default_palette );
    if( !MAPA )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć mapy !" );
        allegro_exit();
        return 0;
    }
   
    s1 = load_bmp( "samochody/s1.bmp", default_palette );
    if( !s1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka s1 !" );
        allegro_exit();
        return 0;
    }
   
    s2 = load_bmp( "samochody/s2.bmp", default_palette );
    if( !s2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka s2 !" );
        allegro_exit();
        return 0;
    }
   
    start = load_bmp( "start.bmp", default_palette );
    if( !start )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka start !" );
        allegro_exit();
        return 0;
    }
   
    choinki = load_bmp( "elementy_do_mapy/choinki.bmp", default_palette );
    if( !choinki )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka choinki !" );
        allegro_exit();
        return 0;
    }
   
    barierki = load_bmp( "elementy_do_mapy/barierki.bmp", default_palette );
    if( !barierki )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka barierki !" );
        allegro_exit();
        return 0;
    }
   
    dzwiek = load_sample( "dzwieki/warkot1.wav" );
    if( !dzwiek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować dzwieku !" );
        allegro_exit();
        return 0;
    }
    dzwiek1 = load_sample( "dzwieki/dzwiek1.wav" );
    if( !dzwiek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować dzwieku1 !" );
        allegro_exit();
        return 0;
    }
   
   
   
   
   
    //******************************************************************************
   
   
   
   
    int s1_x = 130, s1_y = 400, s2_x = 80, s2_y = 400;
   
   
    play_sample( dzwiek1, 12, 12, 1000, 0 );
   
   
    while( !key[ KEY_ESC ] )
    {
       
       
       
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) { adjust_sample( dzwiek, 255, 127, 300, 0 ); s1_x--; }
           
            if( key[ KEY_RIGHT ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_x++; }
           
            if( key[ KEY_UP ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_y--; }
           
            if( key[ KEY_DOWN ] ) { adjust_sample( dzwiek, 255, 255, 1000, 0 ); s1_y++; }
           
           
            // samochod numer 2
           
           
            if( key[ KEY_A ] ) s2_x--;
           
            if( key[ KEY_D ] ) s2_x++;
           
            if( key[ KEY_W ] ) s2_y--;
           
            if( key[ KEY_S ] ) s2_y++;
           
            speed--;
           
        }
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        blit( MAPA, bufor, 0, 0, 0, 0, MAPA->w, MAPA->h );
        blit( start, bufor, 20, 6, 40, 362, start->w, start->h );
        blit( barierki, bufor, 0, 0, 120, 112, barierki->w, barierki->h );
        masked_blit( s1, bufor, 0, 0, s1_x, s1_y, s1->w, s1->h );
        masked_blit( s2, bufor, 0, 0, s2_x, s2_y, s2->w, s2->h );
        blit( bufor, screen, 0, 0, 0, 0, 880, 686 );
       
       
       
        if( s1_x <=- 1 )
        {
            s1_x = 9;
        }
        if( s1_x >= 840 )
        {
            s1_x = 830;
        }
        if( s1_y >= 635 )
        {
            s1_y = 625;
        }
        if( s1_y <=- 1 )
        {
            s1_y = 9;
        }
        if( s2_x <=- 1 )
        {
            s2_x = 9;
        }
        if( s2_x >= 840 )
        {
            s2_x = 830;
        }
        if( s2_y >= 635 )
        {
            s2_y = 625;
        }
        if( s2_y <=- 1 )
        {
            s2_y = 9;
        }
       
        //samochod 1
       
        int kx1 = 0, ky2 = 0, kx3 = 0, ky4 = 0, kx5 = 0, ky6 = 0;
       
       
       
        kx1 = 52 + s1_y; // lewy dolny rog
        ky2 = s1_x + 0;
       
        kx3 = 41 + s1_x; // prawy gorny
        ky4 = s1_y + 0;
       
        kx5 = s1_x + 41; //prawy dolny
        ky6 = s1_y + 52;
       
       
       
        //samochod 2
       
        int kx7 = 0, ky8 = 0, kx9 = 0, ky10 = 0, kx11 = 0, ky12 = 0;
       
       
       
        kx7 = 52 + s2_y; // lewy dolny rog
        ky8 = s2_x + 0;
       
        kx9 = 41 + s2_x; // prawy gorny
        ky10 = s2_y + 0;
       
        kx11 = s2_x + 41; //prawy dolny
        ky12 = s2_y + 52;
       
       
       
       
        if(( kx1, ky2 ) >=( kx9, ky10 ) )
        {
            kx1 - 10;
        }
       
    }
   
   
    remove_int( increment_speed );
    destroy_bitmap( bufor );
    destroy_bitmap( MAPA );
    destroy_bitmap( start );
   
    destroy_bitmap( s1 );
    destroy_bitmap( s2 );
    readkey();
   
    destroy_bitmap( buffer );
   
    return 0;
}
END_OF_MAIN();
P-55771
szyx_yankez
» 2012-05-02 08:00:18
Tobie chodzi o zwykłą kolizje 2 prostokątów. Było już mnóstwo tematów o tym.
Frazy, które należy wpisać w wyszukiwarkę google:
P-55775
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-02 10:13:10
Czytam i nic nie wiem. A czy mój pomysł jest dobry ? I czemu ten warunek nie działa ?


Poniższy kod powinien zadziałać w chwili gdy samochodem 1 wjeżdżamy za tył samochodu 2. I w momencie gdy samochód 1 dotyka przodem tyłu samochodu 2 to samochód 1 powinien się cofnąć po osi y o -10. Oczywiście nie działa, a jest chyba dobrze napisany.
C/C++
if(( kx9, ky10 ) >=( kx7, ky8 ) &&( kx11, ky12 ) >=( kx3, ky4 ) )
{
    ky8 - 10;
}
P-55776
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-03 00:15:21
Metodą prób i błędów doszedłem do tego,ze 3 czy 4 wierzchołki żle się obliczały. błąd poprawiony.
Zrobiłem kolizję która na razie odnosi się tylko do prawego boku samochodu nr 2 oraz jego tyłu. Kolizję działają tak na "styk".

Jeżeli chcę dodać to warunku ,ze jeżeli samochod 1 dotyka samochodu 2 lewym bokiem i samochod 1 odsunie się od niego np o 5 px. w prawo to jak to zapisac ? Bo tak :
C/C++
s1_x + 10;
 ani tak :
C/C++
kx2 + 10;
kx3 + 10;
kx5 + 10;
kx7 + 10;
nie działa.

niżej część kodu odpowiadająca za kolizję:

C/C++
//samochod 1


kx2 = s1_x;
ky1 = 52 + s1_y; // lewy dolny rog


kx3 = 41 + s1_x; // prawy gorny
ky4 = s1_y;

kx5 = s1_x + 41; //prawy dolny
ky6 = s1_y + 52;

kx7 = s1_x; //lewy gorny
ky8 = s1_y;

//samochod 2


ky10 = 52 + s2_y;
kx9 = s2_x; // lewy dolny rog


kx11 = 41 + s2_x; // prawy gorny
ky12 = s2_y;

kx13 = s2_x + 41; //prawy dolny
ky14 = s2_y + 52;

kx15 = s2_x; //lewy gorny
ky16 = s2_y;


// wyświatla na ekranie wszystkie wierzchołki samochodów.
textprintf_ex( screen, font, 10, 10, makecol( 255, 255, 255 ), - 1, "ky1: %d", ky1 );
textprintf_ex( screen, font, 10, 20, makecol( 255, 255, 255 ), - 1, "kx2: %d", kx2 );
textprintf_ex( screen, font, 10, 30, makecol( 255, 255, 255 ), - 1, "kx3: %d", kx3 );
textprintf_ex( screen, font, 10, 40, makecol( 255, 255, 255 ), - 1, "ky4: %d", ky4 );
textprintf_ex( screen, font, 10, 50, makecol( 255, 255, 255 ), - 1, "kx5: %d", kx5 );
textprintf_ex( screen, font, 10, 60, makecol( 255, 255, 255 ), - 1, "ky6: %d", ky6 );
textprintf_ex( screen, font, 10, 70, makecol( 255, 255, 255 ), - 1, "kx7: %d", kx7 );
textprintf_ex( screen, font, 10, 80, makecol( 255, 255, 255 ), - 1, "ky8: %d", ky8 );
textprintf_ex( screen, font, 10, 90, makecol( 255, 255, 255 ), - 1, "kx9: %d", kx9 );
textprintf_ex( screen, font, 10, 100, makecol( 255, 255, 255 ), - 1, "ky10: %d", ky10 );
textprintf_ex( screen, font, 10, 110, makecol( 255, 255, 255 ), - 1, "kx11: %d", kx11 );
textprintf_ex( screen, font, 10, 120, makecol( 255, 255, 255 ), - 1, "ky12: %d", ky12 );
textprintf_ex( screen, font, 10, 130, makecol( 255, 255, 255 ), - 1, "kx13: %d", kx13 );
textprintf_ex( screen, font, 10, 140, makecol( 255, 255, 255 ), - 1, "ky14: %d", ky14 );
textprintf_ex( screen, font, 10, 150, makecol( 255, 255, 255 ), - 1, "kx15: %d", kx15 );
textprintf_ex( screen, font, 10, 160, makecol( 255, 255, 255 ), - 1, "ky16: %d", ky16 );


if( kx13 >= kx2 && kx11 >= kx7 && ky8 >= ky12 && ky14 >= ky1 ) //prawy bok auta 2 kolizja
{
   
    textout_ex( MAPA, font, "prawy bok auta 2 kolizja !", 0, 0, makecol( 255, 255, 255 ), - 1 );
    s1_x - 10;
   
}


if( ky8 >= ky10 && ky14 >= ky4 && kx7 >= kx9 && kx13 >= kx3 )
{
    textout_ex( MAPA, font, "tyl auta 2 Kolizja !", 250, 0, makecol( 255, 255, 255 ), - 1 );
    s2_y - 10;
}
P-55831
akwes
» 2012-05-03 00:21:57
C/C++
kx2 + 10;
kx3 + 10;
kx5 + 10;
kx7 + 10;


Hm... Nie przyglądałem się Twojemu kodowi... ale

Try this shit:
C/C++
kx2 = kx2 + 10;
kx3 = kx3 + 10;
kx5 = kx5 + 10;
kx7 = kx7 + 10;

or even this

C/C++
kx2 += 10;
kx3 += 10;
kx5 += 10;
kx7 += 10;

W innych przypadkach też :P
P-55832
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-03 00:28:12
Jeżeli tak nie działa to jak to zapisać ?
P-55833
akwes
» 2012-05-03 00:31:08
C/C++
kx7 + 10;

Ten zapis nic nie zmienia.

C/C++
kx7 += 10;
// lub
kx7 = kx7 + 10;

Dopiero zmienia stan zmiennej.

Jeżeli dalej nie działa, to jest więcej błędów. A widzę że kodzie masz mnóstwo takich zapisów.
P-55834
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-03 00:37:41
Ale jak zapisze to tak:
C/C++
s1_x + 10;
to powinno działać, a nie działa.
Nizej przedstawiam funkcję która niepozwala obiektowi wychodzic poza ekran. jeżeli jest za blisko granicy(tam gdzie wychodzi poza ekran) to np:
C/C++
s1_x = 9;

i ta funkcja działa, a ta od kolizji nie... a zasada działania jest poniekąd zbliżona.
C/C++
if( s1_x <=- 1 )
{
    s1_x = 9;
}
if( s1_x >= 840 )
{
    s1_x = 830;
}
if( s1_y >= 635 )
{
    s1_y = 625;
}
if( s1_y <=- 1 )
{
    s1_y = 9;
}
if( s2_x <=- 1 )
{
    s2_x = 9;
}
if( s2_x >= 840 )
{
    s2_x = 830;
}
if( s2_y >= 635 )
{
    s2_y = 625;
}
if( s2_y <=- 1 )
{
    s2_y = 9;
}
P-55835
« 1 » 2 3
  Strona 1 z 3 Następna strona