Jump to content

Archived

This topic is now archived and is closed to further replies.

pawelk3k

C++ Biblioteka Allegro

Recommended Posts

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

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

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

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

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

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



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...