Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

pawelk3k

C++ Biblioteka Allegro

Polecane posty

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...