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

[Allegro] Menu i Kolizja

Ostatnio zmodyfikowano 2012-08-03 22:48
Autor Wiadomość
Forczek
Temat założony przez niniejszego użytkownika
[Allegro] Menu i Kolizja
» 2012-08-03 20:51:04
Witam wszystkich. Od razu do rzeczy, piszę pewną grę i zacząłem od menu. Problem jest z kolizją. Może najpierw dam 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 mx = 0, my = 0, mb = 0;

void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

short int Kolizja( short int x1, short int x2,
short int y1, short int y2,
short int width1, short int width2,
short int height1, short int height2 );

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 800, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    BITMAP * kursor = NULL;
    kursor = load_bmp( "kursor.bmp", default_palette );
    install_mouse();
    set_mouse_sprite( kursor );
    unscare_mouse();
   
   
    BITMAP * bufor = NULL;
    BITMAP * Menu = NULL;
    BITMAP * wiking = NULL;
    BITMAP * przycisk01 = NULL;
    BITMAP * przycisk02 = NULL;
    BITMAP * przycisk03 = NULL;
    BITMAP * przycisk04 = NULL;
    BITMAP * przycisk05 = NULL;
    BITMAP * przycisk11 = NULL;
    BITMAP * przycisk12 = NULL;
    BITMAP * przycisk13 = NULL;
    BITMAP * przycisk14 = NULL;
    BITMAP * przycisk15 = NULL;
   
    bufor = create_bitmap( 1000, 800 );
    przycisk01 = load_bmp( "przycisk1.bmp", default_palette );
    przycisk02 = load_bmp( "przycisk1.bmp", default_palette );
    przycisk03 = load_bmp( "przycisk1.bmp", default_palette );
    przycisk04 = load_bmp( "przycisk1.bmp", default_palette );
    przycisk05 = load_bmp( "przycisk1.bmp", default_palette );
    przycisk11 = load_bmp( "przycisk2.bmp", default_palette );
    przycisk12 = load_bmp( "przycisk2.bmp", default_palette );
    przycisk13 = load_bmp( "przycisk2.bmp", default_palette );
    przycisk14 = load_bmp( "przycisk2.bmp", default_palette );
    przycisk15 = load_bmp( "przycisk2.bmp", default_palette );
    wiking = load_bmp( "wiking.bmp", default_palette );
    Menu = load_bmp( "Menu.bmp", default_palette );
   
    int menu = 1;
    int wiking_x = 575, wiking_y = 275;
    int frame = 0;
    double kolizja = false;
   
    while( menu == 0 )
    {
        while( speed > 0 )
        {
            if( menu == 1 )
            {
                if( Kolizja( 500, mouse_x,
                550, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 ) {
                    masked_blit( przycisk11, Menu, 0, 0, 500, 500, przycisk11->w, przycisk11->h );
                    textprintf_ex( przycisk11, font, 600, 500, makecol( 0, 0, 255 ), - 1, "Nowa Gra" );
                    if( mb == 1 )
                    {
                        menu = 2;
                    }
                }
                else
                {
                    masked_blit( przycisk01, Menu, 0, 0, 500, 500, przycisk01->w, przycisk01->h );
                    textprintf_ex( przycisk01, font, 600, 500, makecol( 0, 0, 255 ), - 1, "Nowa Gra" );
                }
                if( Kolizja( 500, mouse_x,
                450, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 ) {
                    masked_blit( przycisk12, Menu, 0, 0, 500, 450, przycisk11->w, przycisk11->h );
                    textprintf_ex( przycisk02, font, 600, 450, makecol( 0, 0, 255 ), - 1, "Wczytaj Gre" );
                    if( mb == 1 )
                    {
                        menu = 3;
                    }
                }
                else
                {
                    masked_blit( przycisk02, Menu, 0, 0, 500, 450, przycisk01->w, przycisk01->h );
                    textprintf_ex( przycisk12, font, 600, 450, makecol( 0, 0, 255 ), - 1, "Wczytaj Gre" );
                }
                if( Kolizja( 500, mouse_x,
                400, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 ) {
                    masked_blit( przycisk13, Menu, 0, 0, 500, 400, przycisk11->w, przycisk11->h );
                    textprintf_ex( przycisk03, font, 600, 400, makecol( 0, 0, 255 ), - 1, "Pomoc" );
                    if( mb == 1 )
                    {
                        menu = 4;
                    }
                }
                else
                {
                    masked_blit( przycisk03, Menu, 0, 0, 500, 400, przycisk01->w, przycisk01->h );
                    textprintf_ex( przycisk13, font, 600, 400, makecol( 0, 0, 255 ), - 1, "Pomoc" );
                }
                if( Kolizja( 500, mouse_x,
                350, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 ) {
                    masked_blit( przycisk14, Menu, 0, 0, 500, 350, przycisk11->w, przycisk11->h );
                    textprintf_ex( przycisk04, font, 600, 350, makecol( 0, 0, 255 ), - 1, "Autorzy" );
                    if( mb == 1 )
                    {
                        menu = 5;
                    }
                }
                else
                {
                    masked_blit( przycisk04, Menu, 0, 0, 500, 350, przycisk01->w, przycisk01->h );
                    textprintf_ex( przycisk14, font, 600, 350, makecol( 0, 0, 255 ), - 1, "Autorzy" );
                }
                if( Kolizja( 500, mouse_x,
                300, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 ) {
                    masked_blit( przycisk05, bufor, 0, 0, 500, 300, przycisk05->w, przycisk05->h );
                    textprintf_ex( przycisk05, font, 600, 300, makecol( 0, 0, 255 ), - 1, "Wyjscie" );
                    if( mb == 1 )
                    {
                        menu = 0;
                    }
                }
                else
                {
                    masked_blit( przycisk15, bufor, 0, 0, 500, 300, przycisk05->w, przycisk05->h );
                    textprintf_ex( przycisk15, font, 600, 300, makecol( 0, 0, 255 ), - 1, "Wyjscie" );
                }
            }
            speed--;
            frame++;
        }
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        blit( bufor, screen, 0, 0, 0, 0, 1000, 800 );
    }
    remove_int( increment_speed );
    destroy_bitmap( wiking );
    destroy_bitmap( przycisk01 );
    destroy_bitmap( przycisk02 );
    destroy_bitmap( przycisk03 );
    destroy_bitmap( przycisk04 );
    destroy_bitmap( przycisk05 );
    destroy_bitmap( przycisk11 );
    destroy_bitmap( przycisk12 );
    destroy_bitmap( przycisk13 );
    destroy_bitmap( przycisk14 );
    destroy_bitmap( przycisk15 );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Problem mam z kolizją, w poprzedniej grze działała według tego kodu. Teraz nie działa. Co jest nie tak, oto błąd:
undefined reference to 'Kolizja( short, short...., short)'
P-61674
SeaMonster131
» 2012-08-03 21:32:31
Nie masz ciała funkcji tylko samą jej deklaracje.
Skoro masz:
C/C++
short int Kolizja( short int x1, short int x2,
short int y1, short int y2,
short int width1, short int width2,
short int height1, short int height2 );
to musisz też gdzieś indziej dać:
C/C++
short int Kolizja( short int x1, short int x2,
short int y1, short int y2,
short int width1, short int width2,
short int height1, short int height2 )
{
   
    // cialo funkcji
   
}
P-61677
Forczek
Temat założony przez niniejszego użytkownika
» 2012-08-03 21:36:06
Znaczy czekaj jest chyba ta deklaracja i jest ciało bo:

short int Kolizja( short int x1, short int x2,
short int y1, short int y2,
short int width1, short int width2,
short int height1, short int height2 );

{
                if( Kolizja( 500, mouse_x,
                550, mouse_y,
                przycisk01->w, kursor->w,
                przycisk01->h, kursor->h ) != 0 )
}
P-61678
SeaMonster131
» 2012-08-03 21:42:35
No a skąd program ma wiedzieć co to jest ta Kolizja(..) ?
W tej funkcji raczej powinienieś porównywać wierzchołki, które przkazałeś przez argumenty a nie..
P-61679
Forczek
Temat założony przez niniejszego użytkownika
» 2012-08-03 21:45:43
double kolizja = false;
Masz co to jest kolizja.
Spróbuje jeszcze inaczej napisać kolizje, jak masz inny pomysł co tu jest nie tak to pisz.
P-61680
SeaMonster131
» 2012-08-03 21:49:38
O to mi chodzi:
C/C++
short int Kolizja( short int x1, short int x2,
short int y1, short int y2,
short int width1, short int width2,
short int height1, short int height2 )
{
    if( x1 >= x2 && x1 <= x2 + width2 &&...)
         return true;
   
    if(..)
         return true;
   
    ..
   
    return false;
}

To jest ciało funkcji. Bo przy kodzie, który podałeś, nigdzie go nie masz. Dlatego kompilator widzi tą funkcję, lecz nie widzi jej ciała, stąd ten błąd.
P-61681
RazzorFlame
» 2012-08-03 21:56:46
Forczek w ciele funkcji ty chcesz uzywac jej samej??? Oł szit :D Gdyby tak sie dalo moglbys zrobic petle :) NP
C/C++
void Funkcja()
{
    static int ile;
    cout <<++ile << endl;
    Funkcja();
}

Moze nie do tematu ale chcialem ci uswiadomic ze nie mozesz robic czegos takiego ponieważ program by sie na zawsze zapetlił. Poza tym tak sie nie da :P

EDIT:
Nie czytaj tego u góry :P zle napisalem
P-61682
Forczek
Temat założony przez niniejszego użytkownika
» 2012-08-03 22:48:40
Dobra, to ja jeszcze sobie pokombinuje. Bo po prostu kolega mi ten kod podsunął jak się allegro uczyłem i myślałem że i tu wypali, ale nie dało rady. Więc opracuje jednak swój dzięki za pomoc.
P-61689
« 1 »
  Strona 1 z 1