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

[Allegro] kosmiczna strzelanka

Ostatnio zmodyfikowano 2010-06-11 09:00
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Allegro] kosmiczna strzelanka
» 2010-06-03 14:03:47
Mam już napisany kawałek gry, która zachowuje się tak jak sobie to zaplanowałem. statki(wrogowie) poruszają się z góry na dół a statek (bohater) porusza się w pozimie z lewej do prawej i na odwrót oddając przy tym strzały (po nacisnieciu spacji), i wszystko niby jest okey poza takim mankamentem że po zajsciu kolizji pocisku z wrogim statkiem następuje kolizja która  się nie kończy bo kiedy statek wroga znajduje się jeszcze u góry ekranu a statek bohater na lini jego lotu (toru lotu), następuje znowu  kolizja... Co zrobić aby kolizja następowała tylko po oddaniu strzału i trafieniu pociskiem  wrogiego statku? Ani wcześniej ani później? Poniżej kod programu a tutaj link do kodu źródłowego (załącznika) i grafik: http://www.easykoder.vot.pl/forum/showthread.php?tid=152
Prawie na samym dole:"kosmiczna strzelanka".

C/C++
#include <allegro.h>
#include <vector>

using std::vector;

BITMAP * bufor = NULL;
BITMAP * niebo = NULL;
BITMAP * niebo1 = NULL;
BITMAP * statek = NULL;
BITMAP * pocisk = NULL;
SAMPLE * laser = 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();
};

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

Bohater::~Bohater()
{
}

bool kolizja( 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( 80 ) );
    detect_digi_driver( DIGI_AUTODETECT );
    detect_midi_driver( MIDI_AUTODETECT );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, NULL );
   
    Bohater boh, wrog[ 10 ], pocisk0[ 10 ]; // Obiekty klasy Bohater
    //Wczytywanie grafik i dzwięków
    muzyczka = load_midi( "muzyczka.mid" );
    laser = load_sample( "laser.wav" );
    bufor = create_bitmap( 640, 480 );
    niebo = load_bmp( "glob.bmp", default_palette );
    niebo1 = load_bmp( "glob.bmp", default_palette );
    statek = load_bmp( "statek.bmp", NULL );
    pocisk = load_bmp( "pocisk.bmp", NULL );
    for( int i = 0; i < 10; ++i )
         boh.spodki[ i ] = load_bmp( "spodek.bmp", NULL );
   
   
    boh.x = 320, boh.y = 420;
    int pociskx = 320, pocisky = 420; // Poruszanie pociskiem
    int pozsx = 320, pozsy = 420; // Zmienne do statek
   
    for( int i = 0; i < 10; ++i )
    {
        wrog[ i ].x = 40;
        wrog[ i ].y = 40;
        wrog[ i ].s = 40;
        wrog[ i ].w = 40;
    }
   
   
    pocisk0[ 0 ].x = 320, pocisk0[ 0 ].y = 420, pocisk0[ 0 ].w = 40, pocisk0[ 0 ].s = 40;
    //Zmienne potrzebne do scrollowania tła
    int niebo_x = 0, niebo_y = 0;
    int niebo1_x = 0, niebo1_y = 0;
    int niebo2_x = 0, niebo2_y = 0;
    int mapa_y = 0, ekran_y = 480;
    int obraz_y = ekran_y;
   
    play_midi( muzyczka, 1 );
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        niebo_y = - mapa_y % ekran_y;
        niebo1_y = ekran_y - mapa_y % ekran_y;
        mapa_y++;
        blit( niebo, bufor, 0, 0, niebo_x, niebo_y, niebo->w, niebo->h );
        blit( niebo1, bufor, 0, 0, niebo1_x, niebo1_y, niebo1->w, niebo1->h );
       
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) { pozsx -= 2; pocisk0[ 0 ].x -= 2; }
            if( key[ KEY_RIGHT ] ) { pozsx += 2; pocisk0[ 0 ].x += 2; }
            if( key[ KEY_SPACE ] )
            {
               
               
                /*Przemieszczanie pocisku*/
                for( int i = 0; i <= 10; ++i )
                {
                    if( pocisk0[ i ].y < 480 )
                    {
                        pocisk0[ i ].y -= 15;
                    }
                    if( pocisk0[ i ].y <= 0 )
                    {
                        pocisk0[ i ].y = 420;
                        //pocx=320;
                    }
                    pocisk0[ i ].y--;
                }
               
                create_bitmap( pocisk->w, pocisk->h ); /* kopiowanie pocisku do bufora*/
                masked_blit( pocisk, bufor, 0, 0, pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w );
            }
            speed--;
           
        }
        /*Scrollowanie statków, wrogów*/
        for( int i = 0; i < 10; ++i )
        {
            if( wrog[ i ].y < 480 )
            {
                wrog[ i ].y += 2;
               
            }
            else if( wrog[ i ].y >= 480 )
            {
                wrog[ i ].x = 20;
                wrog[ i ].y = 20;
            }
        }
        k++;
        if( k == 256 )
             k = 0;
       
        // rect(bufor,0,0,bufor->w - 1,bufor->h - 1,makecol(255,255,255));
       
        // rotate_sprite(bufor,boh.spodki[0], wrog.x-80 , wrog.y+40 ,itofix(k));
       
        masked_blit( boh.spodki[ 0 ], bufor, 0, 0, wrog[ 0 ].x = 200, wrog[ 0 ].y + 40, wrog[ 0 ].s, wrog[ 0 ].w );
        masked_blit( boh.spodki[ 1 ], bufor, 0, 0, wrog[ 1 ].x = 280, wrog[ 1 ].y + 120, wrog[ 1 ].s, wrog[ 1 ].w );
        masked_blit( boh.spodki[ 2 ], bufor, 0, 0, wrog[ 2 ].x = 360, wrog[ 2 ].y + 40, wrog[ 2 ].s, wrog[ 2 ].w );
        masked_blit( statek, bufor, 0, 0, pozsx, pozsy, statek->w, statek->h );
       
        if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 0 ].x, wrog[ 0 ].y, wrog[ 0 ].s, wrog[ 0 ].w ) == true )
        {
            textprintf_ex( bufor, font, 0, 460, makecol( 255, 255, 0 ), - 1, "Kolizja 0" );
            play_sample( laser, 2000, 1000, 255, 0 );
           
        }
        if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 1 ].x, wrog[ 1 ].y, wrog[ 1 ].s, wrog[ 1 ].w ) == true )
        {
            textprintf_ex( bufor, font, 0, 460, makecol( 155, 155, 0 ), - 1, "Kolizja 1" );
            play_sample( laser, 2000, 1000, 255, 0 );
        }
        if( kolizja( pocisk0[ 0 ].x, pocisk0[ 0 ].y, pocisk0[ 0 ].s, pocisk0[ 0 ].w, wrog[ 2 ].x, wrog[ 2 ].y, wrog[ 2 ].s, wrog[ 2 ].w ) == true )
        {
            textprintf_ex( bufor, font, 0, 460, makecol( 255, 255, 255 ), - 1, "Kolizja 2" );
            play_sample( laser, 2000, 1000, 255, 0 );
        }
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    for( int i = 0; i < 10; ++i )
         destroy_bitmap( boh.spodki[ i ] );
   
    destroy_bitmap( bufor );
    destroy_bitmap( niebo );
    destroy_bitmap( pocisk );
    destroy_sample( laser );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-17500
lemis.aryl
» 2010-06-11 09:00:27
Statki wroga tak zasuwają, że ich prawie nie widać.
P-17891
« 1 »
  Strona 1 z 1