pawelk3k Posted July 10, 2011 Report Share Posted July 10, 2011 Witajcie od paru dni piszę swoją drugą grę (pierwsza była w TP7 ^^) Oczywiście podczas tego projektu napotkałem pewne problemy lecz o nich później. Załadowałem mapę bitową jako tło i mniejszą imitującą ludzika. Wszystko szło zgodnie z planem. Ludzikiem po mapie steruję za pomocą "strzałek" na klawiaturze. Wszystko było by dobrze lecz mój ludzik jeździ po miejscach na mojej mapie na których jest nie mile widziany >.> Moglibyście dać jakieś rady albo po prostu powiedzieć jak temu zaradzić ? Chciałbym zrobić schodki po których mój ludzik mógłby się wspinać można je nazwać "martwymi punktami".Podejrzewam ze wystarczy zrobić tak by zmienna w pewnym miejscach nie przekraczała pewnych wartości lecz nie wiem jak to napisać. Oto mój cały kodzik sorki za to ze nie jest poukładany jak trzeba #include <allegro.h> int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 125, 125, 125 ) ); BITMAP * mapa = NULL; mapa = load_bmp( "mapa.bmp", default_palette ); if( !mapa ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka mapa !" ); allegro_exit(); return 0; } blit( mapa, screen, 0, 0, 0, 0, mapa->w, mapa->h ); BITMAP * ludek = NULL; ludek = load_bmp( "ludek.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int ludek_x = 100, ludek_y = 100; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) ludek_x--; if( key[ KEY_RIGHT ] ) ludek_x++; if( key[ KEY_UP ] ) ludek_y--; if( key[ KEY_DOWN ] ) ludek_y++; rest(5); masked_blit( ludek, screen, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); } destroy_bitmap( ludek ); allegro_exit(); return 0; } END_OF_MAIN(); Link to comment Share on other sites More sharing options...
t3tris Posted July 10, 2011 Report Share Posted July 10, 2011 Nie do końca jestem pewien, czy Cię dobrze zrozumiałem, ale rzuć okiem na to, może pomoże. #include <allegro.h> #include <iostream> #include <utility> #include <set> using namespace std; int main() { int ilosc; // ilosc punktow, w ktorych masz schody set< pair<int,int> > schody;//tu bedziesz trzymal wspolrzedne schodow. W secie chyba bedzie najlepiej, bo c++ // implementuje to jako drzewo binarne, wiec wyszukuje sie w log2 n // poza tym nie pozwala dwukrotnie wrzucic tych samych elementow int tablica[ilosc][2]; // stad wrzucisz beda wrzucane dane do seta. Uzupelnienie tej tablicy danymi pozostawiam Tobie ;p for(int i=0;i<ilosc;i++){ // uzupelniamy seta pair<int,int> nowy(tablica[i][0],tablica[i][1]); schody.insert(nowy); } allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 125, 125, 125 ) ); BITMAP * mapa = NULL; mapa = load_bmp( "mapa.bmp", default_palette ); if( !mapa ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka mapa !" ); allegro_exit(); return 0; } blit( mapa, screen, 0, 0, 0, 0, mapa->w, mapa->h ); BITMAP * ludek = NULL; ludek = load_bmp( "ludek.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int ludek_x = 100, ludek_y = 100; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ){ pair<int,int> szukany (x-1,y); if(schody.find(szukany) == schody.end()){ //jezeli nie znalazl, to znaczy, ze tam mozna sie ruszyc ludek_x--; } else{ continue; //w tym przypadku on po prostu nie pozwoli Ci się ruszyć na to pole. //jezeli chcesz, zeby cos tam robil, to wywolaj tu po prostu jakas funkcje. } } if( key[ KEY_RIGHT ] { pair<int,int> szukany (x+1,y); if(schody.find(szukany) == schody.end()){ ludek_x++; } else{ continue; } } if( key[ KEY_UP ] ){ pair<int,int> szukany (x,y-1); if(schody.find(szukany) == schody.end()){ ludek_y--; } else{ continue; } } if( key[ KEY_DOWN ] ){ pair<int,int> szukany (x,y+1); if(schody.find(szukany) == schody.end()){ ludek_y++; } else{ continue; } } rest(5); masked_blit( ludek, screen, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); } destroy_bitmap( ludek ); allegro_exit(); */ return 0; } END_OF_MAIN(); // ??? Link to comment Share on other sites More sharing options...
Herobrine Posted July 11, 2011 Report Share Posted July 11, 2011 Widzę że kod żywcem wzięty z easykodera (nie ty t3tris) Popatrz tam może na lekcje o wykrywaniu kolizji i mapach kafelkowych to rozwiążesz swój problem. P.S nie polecam Allegro, jest wolne i ograniczone Link to comment Share on other sites More sharing options...
bartexsz Posted July 19, 2011 Report Share Posted July 19, 2011 Allegro jest dobre na początek póki nie urosną ambicje. Jak dla mnie metoda z porównywaniem współrzędnych była zbyt długa w implementacji przy dużej liczbie obiektów. Polecam zrobić coś takiego: -tworzysz dodatkową bitmapę. -rysujesz obiekty na które nie możesz wejść -w allegro jest funkcja sprawdzająca czy na podanych współrzędnych jest jakiś pixel.(domyślnie na nowej bitmapie pixele są "puste") przy ruchu sprawdź nią ramkę ludzika. Niestety nie pamiętam nazwy tej funkcji teraz. Link to comment Share on other sites More sharing options...
P_aul Posted July 19, 2011 Report Share Posted July 19, 2011 Nie sposób nie zauważyć, że używasz starej biblioteki allegro. Wyszła niedawno piątka, która jest szybsza i lepiej zorganizowana (acz nadal nie wiedzą chłopaki co to namespace...) Po zabawie z nią trochę umiarkowanie polecam. Link to comment Share on other sites More sharing options...
Herobrine Posted July 20, 2011 Report Share Posted July 20, 2011 Ja raczej poleciłbym SDL, świetny lib. A co do problemu, będziesz używac mapy kafelkowej ? Wtedy mógłbyś porównywać pozycje gracza z kaflem na który się wybierasz, i jeżeli można na niego wejść to postać by się przesunęła, a jeżeli nie to nie. Link to comment Share on other sites More sharing options...
Sebekkot Posted July 21, 2011 Report Share Posted July 21, 2011 Allegro jest dobre na początek póki nie urosną ambicje. Jak dla mnie metoda z porównywaniem współrzędnych była zbyt długa w implementacji przy dużej liczbie obiektów. Polecam zrobić coś takiego: -tworzysz dodatkową bitmapę. -rysujesz obiekty na które nie możesz wejść -w allegro jest funkcja sprawdzająca czy na podanych współrzędnych jest jakiś pixel.(domyślnie na nowej bitmapie pixele są "puste") przy ruchu sprawdź nią ramkę ludzika. Niestety nie pamiętam nazwy tej funkcji teraz. Ta funkcja to getpixel przykład: if( getpixel(jakasbitmapa,23,45)==makecol(255,65,11) ) { twoje instrukcje do wykonania po wykryciu kolizji } Link to comment Share on other sites More sharing options...