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

[Allegro] Kolizja z ruchomym pociskiem

Ostatnio zmodyfikowano 2010-05-27 17:06
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Allegro] Kolizja z ruchomym pociskiem
» 2010-05-26 20:27:24
Po paru dniach udało mi się wypocić kawałek kosmicznej strzelanki, której kod prezentuję nieco niżej i jednocześnie zapytuję; Dlaczego ta paskudna kolizja nie chce zadziałać. Mógłby ktoś coś doradzić lub nieco poprawić? Tak aby kolizja zadziałała? Please help my!!!
C/C++
#include <allegro.h>
#include <vector>
using std::vector;

BITMAP * bufor = NULL;
BITMAP * background = NULL;
BITMAP * statek = NULL;
BITMAP * pocisk = NULL;

MIDI * muzyczka;
volatile long int speed = 0;
volatile long int k = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_VARIABLE( k );

class Bohater
{
public:
    int poz_x, poz_y;
    short int x, y;
    short int s, w;
    vector < BITMAP *> spodki;
    Bohater();
    ~Bohater();
    void pozycja_ufo( int & x, int & y );
    void pocisk_strzal( int & pocx, int & pocy );
};

Bohater::Bohater()
{
    spodki.reserve( 10 );
}

Bohater::~Bohater()
{
}

void Bohater::pozycja_ufo( int & x, int & y )
{
    if( x < 640 )
    {
        x += 2; //Predkość przemieszczania ufo
       
    }
    if( x >= 640 )
    {
        x = 0;
        y = 0;
    }
    k++;
    if( k == 256 )
         k = 0;
   
    // rect(bufor,0,0,bufor->w - 1,bufor->h - 1,makecol(255,255,255));
    /*rotate_sprite(bufor,spodki[0], x , y ,itofix(k));
          rotate_sprite(bufor,spodki[1], x-40 , y+40 ,itofix(k));*/
    masked_blit( spodki[ 0 ], bufor, 0, 0, x, y, spodki[ 0 ]->w, spodki[ 0 ]->h );
    masked_blit( spodki[ 1 ], bufor, 0, 0, x - 40, y, spodki[ 1 ]->w, spodki[ 1 ]->h );
}

void Bohater::pocisk_strzal( int & pocx, int & pocy )
{
    if( pocy < 480 )
    {
        pocy -= 15;
    }
    if( pocy <= 0 )
    {
        pocy = 420;
        //pocx=320;
    }
   
    pocy--;
   
    /*BITMAP *oryginal;
        BITMAP *kopia;
        kopia=create_bitmap(oryginal->w,oryginal->h);
        blit(oryginal,kopia,0,0,0,0,oryginal->w,oryginal->h);*/
   
    /* kopiowanie bitmapy do bufora*/
    create_bitmap( pocisk->w, pocisk->h );
    masked_blit( pocisk, bufor, 0, 0, pocx, pocy, pocisk->w, pocisk->h );
   
}
bool kolizja1( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};

int main()
{
    allegro_init();
    install_keyboard();
    install_timer();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    detect_digi_driver( DIGI_AUTODETECT );
    detect_midi_driver( MIDI_AUTODETECT );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, NULL );
   
    Bohater boh, wrog, pocisk0; // Obiekty klasy Bohater
    wrog.x = 0, wrog.y = 0, wrog.s = 40, wrog.w = 40;
    pocisk0.x = 320, pocisk0.y = 420, pocisk0.s = 40, pocisk0.w = 40;
    //Wczytywanie grafik i dzwięków
    muzyczka = load_midi( "muzyczka.mid" );
    bufor = create_bitmap( 640, 480 );
    background = load_bmp( "glob.bmp", default_palette );
    statek = load_bmp( "statek.bmp", NULL );
    pocisk = load_bmp( "pocisk.bmp", NULL );
    boh.spodki[ 0 ] = load_bmp( "spodek.bmp", NULL );
    boh.spodki[ 1 ] = load_bmp( "spodek.bmp", NULL );
    boh.spodki;
   
    int x = 0, y = 0; //Pozycja kuli celu
    int pozsx = 320, pozsy = 420; //Poruszanie statkiem
    int pociskx = 320, pocisky = 420; // Poruszanie pociskiem
   
    play_midi( muzyczka, 1 );
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        blit( background, bufor, 0, 0, 0, 0, background->w, background->h );
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) { pozsx -= 2; pociskx -= 2; }
            if( key[ KEY_RIGHT ] ) { pozsx += 2; pociskx += 2; }
            if( key[ KEY_SPACE ] ) { boh.pocisk_strzal( pociskx, pocisky ); }
            speed--;
        }
       
        if( kolizja1( wrog.x, wrog.y, wrog.s, wrog.w, pocisk0.x, pocisk0.y, pocisk0.s, pocisk0.w ) == true )
        {
            allegro_message( "Kolizja" );
        }
        boh.pozycja_ufo( x, y );
        masked_blit( statek, bufor, 0, 0, pozsx, pozsy, statek->w, statek->h );
        //masked_blit(pocisk,bufor,0,0,pociskx,pocisky,pocisk->w,pocisk->h);
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    destroy_bitmap( boh.spodki[ 0 ] );
    destroy_bitmap( bufor );
    destroy_bitmap( background );
    destroy_bitmap( pocisk );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-17193
malan
» 2010-05-26 20:51:23
Następny...- muzykę i obrazki to sam sobie mam narysować? Wiem, że jest tu garstka osób, która dałby radę odpowiedzieć na Twoje pytanie bez żadnej kompilacji (itd.), ale podczas testowania programu łatwiej wpaść na to co jest nie tak (czyt. szybciej dostaniesz odpowiedź) :).
P-17196
filipesq
» 2010-05-26 20:56:02
Męczysz się z kolizją easykoder'a?! To nic dziwnego skoro nie chce działać! On dał tylko taki przykład, który praktycznie w ogóle się nie nadaje! Jak się bawisz nawet vectorami (na szczęście, znudziły mi się pytania: "Co zrobić aby ludzik nie chodził do góry?", "Nie znam C++, uczę się allegro i mam problem..." albo "Robiękolona tibii, help!!!") to z łatwością napiszesz kolizję.

Przykład:
C/C++
if( x1 > x2 && x1 < x2 + x2_szer && y1 > y2 && y1 < y2 + y2 + wys )
{
    //kolizja
}
Ale to tylko przykład. Można też zrobić getpixel itp.
Metoda powyżej jest uniwersalna, zadziała z każdą biblioteką graficzną pod każdym językiem
P-17197
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-05-27 00:27:48
Sam tą kolizje wymyśliłeś czy ktoś Ci pomógł? Zarąbiasta działa nawet pod hebrajskim.
P-17207
michalp
» 2010-05-27 16:03:50
Jak się bawisz nawet vectorami to z łatwością napiszesz kolizję.

Co ma kolizja do std::vector?
P-17223
kamillo121
» 2010-05-27 16:49:24
To, że w Bieszczadach pada deszcz :) Może warto najpierw poczytać o kolizji a potem zabierać się za pisanie czegoś takiego
P-17225
lenrokskate
» 2010-05-27 17:06:36
Co ma kolizja do std::vector?
tutaj nie chodzi o std::vector, tylko o wektor na płaszczyźne kartezjańskiej (matematyka)

łap tu linka (po polsku): klik!
P-17226
« 1 »
  Strona 1 z 1