Allegro c++ obiekty oraz mapa


(Viton007) #1

Chciałem coś zrobić na podstawie artykułów z cpp0x.pl i mam kilka problemów związanych z gierką.

Tzn, nie mam pojęcia jak zrobić mape.

Chciałem zrobić 3 okna, tak aby po przejciu w odpowiednie miejsce psotacią zmieniało się okno, czyli taki teleport i niestety nie wiem jak to zrobić. Jeszcze bardziej utrudniło mi życie zatrzymanie postaci przed jakimś obiektem.

Drugi problem to czy będzie dobre operowanie na plikach .ini? Mam na myśli dane postaci i przedmiotów, ustawienie postaci.

Kolejny pytanie w jaki sposób utworzyć np MPC? Np. podchodzę do maga i kupuje od niego potiony. Umiejscawianie wszystkiego w kodzie (np jeżeli postać stoi w danym przeciale x, y i wcisne klawisz odezwie sie mag i wykona jakąś czynność) chyba nie ma sensu? Wszystkie elementy mam dodawać do kodu w ten sposób?

Wszystkie pliki są tutaj (skompilowana gra):

Możliwe, że jakiejś dllki brakuje. Poza tym gra powinna się odpalać.

#define USE_CONSOLE


#include 

#include 

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( 16 );

    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );

    install_timer();

    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );



	BITMAP * wall2 = NULL;

	BITMAP * wall = NULL;


BITMAP * bufor = NULL;

BITMAP * ludek0 = NULL;

BITMAP * ludek1 = NULL;

BITMAP * ludek2 = NULL;

BITMAP * ludek3 = NULL;


bufor = create_bitmap( 640, 480 );

if( !bufor )

{

    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );

    allegro_message( "Nie mogę utworzyć bufora !" );

    allegro_exit();

    return 0;

}




ludek0 = load_bmp( "pic//ludek1.bmp", default_palette );

ludek1 = load_bmp( "pic//ludek2.bmp", default_palette );

ludek2 = load_bmp( "pic//ludek3.bmp", default_palette );

ludek3 = load_bmp( "pic//ludek4.bmp", default_palette );

wall2 = load_bmp( "pic//wall2.bmp", default_palette );

wall = load_bmp( "pic//wall.bmp", default_palette );





if( !wall )

{

    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );

    allegro_message( "nie mogę załadować obrazka wall!" );

    allegro_exit();

    return 0;

}


if( !wall2 )

{

    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );

    allegro_message( "nie mogę załadować obrazka wall2 !" );

    allegro_exit();

    return 0;

}






while( !key[KEY_SPACE] )


    {


	clear_to_color( bufor, makecol( 150, 150, 150 ) );

	blit( wall, screen, 0,0, 0,0, wall->w, wall->h);


   textout_ex( screen, font, "Press SPACE to start", 300, 400, makecol( 0, 100, 243 ), - 1 );

	}






int ludek_x = 100, ludek_y = 100;

int frame = 0;



 int liczba=2;

while( !key[KEY_ESC] )

{




    while( speed > 0 )

    {


       if(ludek_x > 30) if( key[KEY_LEFT] )	ludek_x--;


		if ( key[KEY_RIGHT] ) ludek_x++;


       if(ludek_y > 20) if( key[KEY_UP] ) ludek_y--;


        if( key[KEY_DOWN] ) ludek_y++;


        speed--;



        frame++;

        if( frame > 80 ) frame = 0;



    }




clear_to_color( bufor, makecol( 150, 150, 150 ) );

blit( wall2, bufor, 0,0, 0,0, wall2->w, wall2->h);


if( key[KEY_UP] ) liczba = 1; 

if( key[KEY_DOWN] ) liczba = 2; 

if( key[KEY_RIGHT] ) liczba = 3; 

if( key[KEY_LEFT] ) liczba = 4;


if (liczba == 1) { draw_sprite( bufor, ludek1, ludek_x, ludek_y ); }

if (liczba == 2) { draw_sprite( bufor, ludek0, ludek_x, ludek_y ); }

if (liczba == 3) { draw_sprite( bufor, ludek2, ludek_x, ludek_y ); }

if (liczba == 4) { draw_sprite( bufor, ludek3, ludek_x, ludek_y ); }



blit( bufor, screen, 0, 0, 0, 0, 640, 480 );

}




destroy_bitmap( wall );

destroy_bitmap( wall2 );



remove_int( increment_speed );

destroy_bitmap( ludek0 );

destroy_bitmap( ludek1 );

destroy_bitmap( ludek2 );

destroy_bitmap( ludek3 );

destroy_bitmap( bufor );

allegro_exit();

return 0;

}


END_OF_MAIN();

(Razi) #2

Sądząc po tym, że używasz allegro i aż dwie funkcje (jedna main i jedna wymagana przez allegro) to uważam że przed tobą jeszcze dużo nauki samego języka.

A co do problemu: potraktuj go technicznie: jeśli pozycja gracza bliska pozycji NPC i np. naciśnięty jakiś klawisz, ma się coś stać.


(Viton007) #3

Nie powiem, ze nie :slight_smile:

Ale jak mam to sprawdzić?


(Razi) #4

jak? zaprogramować. Pozycja w dwóch wymiarach to 2 zmienne: x i y. Odległość między 2 punktami można wyliczyć z pitagorasa: sqrt( sqr(x1-x2) + sqr(y1-y2) ).

Brakuje ci znajomości samego języka i wiedzy matematycznej żeby się zabrać za taki projekt.


(Viton007) #5

No faktycznie, teraz działa bardzo ładnie. Dzięki.