Witam,
Chciałbym się poradzić jak mógłbym wprowadzić do tego kodu:
#include <iostream>
#include <fstream>
#include <allegro5/allegro5.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
using namespace std;
const int szer=800,wys=600,rozmiar_bitmapy=20;
void odswiez_bitmapy_terenu(int mapa[30][40], ALLEGRO_BITMAP *teren[4], int x, int y);
void rysuj_mape_terenu(int mapa [30] [40], ALLEGRO_BITMAP *teren[4]);
void wczytaj_mape_terenu(int mapa [30][40], int numer_mapy);
void wczytaj_bitmapy_terenu(ALLEGRO_BITMAP *teren[4]);
void wczytaj_bitmapy_czolgu(ALLEGRO_BITMAP *czolg[8],char kolor);
void ruch_gracza(int &x,int &y,int &numer_bitmapy);
int main()
{
al_init();
al_install_keyboard();
al_init_primitives_addon();
al_init_image_addon();
ALLEGRO_DISPLAY *okno = al_create_display(szer,wys);
ALLEGRO_KEYBOARD_STATE klawisz;
ALLEGRO_BITMAP *czolg[8],*bitmapa,*teren[4];
int mapa[30][40];
wczytaj_mape_terenu(mapa,1);
int numer_bitmapy=0;
wczytaj_bitmapy_czolgu(czolg,'g');
wczytaj_bitmapy_terenu(teren);
rysuj_mape_terenu(mapa,teren);
bitmapa=czolg[numer_bitmapy];
int x=10,y=10;
al_convert_mask_to_alpha(bitmapa,al_map_rgb(255,0,255));
for(int i=0;i<8;i++)al_convert_mask_to_alpha(czolg[i],al_map_rgb(255,0,255));
while(!al_key_down(&klawisz,ALLEGRO_KEY_ESCAPE))
{
al_get_keyboard_state(&klawisz);
// al_clear_to_color(al_map_rgb(0,255,0));
odswiez_bitmapy_terenu(mapa,teren,x,y);
ruch_gracza(x,y,numer_bitmapy);
bitmapa=czolg[numer_bitmapy];
al_draw_bitmap(bitmapa,x,y,0);
al_flip_display();
al_rest (0.005);
}
al_destroy_display(okno);
return 0;
}
void ruch_gracza(int &x, int &y,int &numer_bitmapy)
{
ALLEGRO_KEYBOARD_STATE klawisz;
al_get_keyboard_state(&klawisz);
if(al_key_down(&klawisz,ALLEGRO_KEY_RIGHT) && x+rozmiar_bitmapy<szer)
{
x++;
numer_bitmapy=2;
}
if(al_key_down(&klawisz,ALLEGRO_KEY_LEFT) && x>0)
{
x--;
numer_bitmapy=6;
}
if(al_key_down(&klawisz,ALLEGRO_KEY_UP) && y>0)
{
y--;
numer_bitmapy=0;
}
if(al_key_down(&klawisz,ALLEGRO_KEY_DOWN) && y+rozmiar_bitmapy<wys)
{
y++;
numer_bitmapy=4;
}
if(al_key_down(&klawisz,ALLEGRO_KEY_UP) && al_key_down(&klawisz,ALLEGRO_KEY_RIGHT))numer_bitmapy=1;
if(al_key_down(&klawisz,ALLEGRO_KEY_UP) && al_key_down(&klawisz,ALLEGRO_KEY_LEFT))numer_bitmapy=7;
if(al_key_down(&klawisz,ALLEGRO_KEY_DOWN) && al_key_down(&klawisz,ALLEGRO_KEY_RIGHT))numer_bitmapy=3;
if(al_key_down(&klawisz,ALLEGRO_KEY_DOWN) && al_key_down(&klawisz,ALLEGRO_KEY_LEFT))numer_bitmapy=5;
}
void wczytaj_bitmapy_czolgu(ALLEGRO_BITMAP *czolg[8],char kolor)
{
char nazwa[13] = {'d','a','t','a','/','#','t','#','.','p','n','g'};
nazwa [5]=kolor;
for (int i=0;i<8;i++)
{
nazwa[7]=i+48;
czolg[i]=al_load_bitmap(nazwa);
}
}
void wczytaj_bitmapy_terenu(ALLEGRO_BITMAP *teren[4])
{
teren[0] = al_load_bitmap("data/teren01.png");
teren[1] = al_load_bitmap("data/teren02.png");
teren[2] = al_load_bitmap("data/teren03.png");
teren[3] = al_load_bitmap("data/teren04.png");
}
void wczytaj_mape_terenu(int mapa [30][40], int numer_mapy)
{
char nazwa [24] = {'d','a','t','a','/','m','a','p','a','_','t','e','r','e','n','u','_','#','#','.','t','x','t'};
nazwa [17]=numer_mapy/10+48;
nazwa [18]=numer_mapy-(numer_mapy/10)*10+48;
ifstream plik(nazwa);
int i=0,j=0;
while(!plik.eof())
{
plik >> mapa[i][j];
j++;
if(j>=40)
{
j=0;
i++;
}
}
}
void rysuj_mape_terenu(int mapa [30] [40], ALLEGRO_BITMAP *teren[4])
{
for(int i=0;i<30;i++)
for(int j=0;j<40;j++)
switch(mapa[i][j])
{
case 1: al_draw_bitmap(teren[0],j*rozmiar_bitmapy,i*rozmiar_bitmapy,0);
break;
case 2: al_draw_bitmap(teren[1],j*rozmiar_bitmapy,i*rozmiar_bitmapy,0);
break;
case 3: al_draw_bitmap(teren[2],j*rozmiar_bitmapy,i*rozmiar_bitmapy,0);
break;
case 4: al_draw_bitmap(teren[3],j*rozmiar_bitmapy,i*rozmiar_bitmapy,0);
break;
}
}
void odswiez_bitmapy_terenu(int mapa[30][40], ALLEGRO_BITMAP *teren[4], int x, int y)
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
switch(mapa[y/rozmiar_bitmapy+j][x/rozmiar_bitmapy+i])
{
case 1: al_draw_bitmap(teren[0],(x/rozmiar_bitmapy+i)*rozmiar_bitmapy,(y/rozmiar_bitmapy+j)*rozmiar_bitmapy,0);
break;
case 2: al_draw_bitmap(teren[1],(x/rozmiar_bitmapy+i)*rozmiar_bitmapy,(y/rozmiar_bitmapy+j)*rozmiar_bitmapy,0);
break;
case 3: al_draw_bitmap(teren[2],(x/rozmiar_bitmapy+i)*rozmiar_bitmapy,(y/rozmiar_bitmapy+j)*rozmiar_bitmapy,0);
break;
case 4: al_draw_bitmap(teren[3],(x/rozmiar_bitmapy+i)*rozmiar_bitmapy,(y/rozmiar_bitmapy+j)*rozmiar_bitmapy,0);
break;
}
}
Możliwość przesuwania mapy na przykład z tego kodu:
while( !key[ KEY_ESC ] )
{
while( speed > 0 )
{
if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) )
{
scrollX--; mapa_x--;
}
else if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--;
if(( key[ KEY_RIGHT ] ) &&( mapa_x < 40 * 20 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) )
{
scrollX++; mapa_x++;
}
else if( key[ KEY_RIGHT ] &&( ludek_x <( SCREEN_W - ludek->w ) ) ) ludek_x++;
if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) )
{
scrollY--; mapa_y--;
}
else if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--;
if(( key[ KEY_DOWN ] ) &&( mapa_y < 40 * 25 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) )
{
scrollY++; mapa_y++;
}
else if(( key[ KEY_DOWN ] ) &&( ludek_y <( SCREEN_H - ludek->h ) ) ) ludek_y++;
speed--; }
Wiadomo zmienne i tak dalej trzeba byłoby pozmieniać, ale coś mi nie działa. Kod na przesuwanie mapy wziąłem z internetu. No chyba, że macie jakiś krótszy sposób na ogarnięcie tego. Ogólnie chodzi o to, że jeżeli jadę sobie obiektem w przypadku mojej gry czołgiem to po dojechaniu do jakieś odległości od końca bitmapy ona się przesuwa dalej czyli jakby się rysuje dalsza jej część lub po prostu przesuwa sama mapa kaflowa. Macie jakieś pomysły, bo poradniki też przerobiłem, ale coś mi nie wychodzi.