• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++][Allegro] Przesuwanie mapy

VPS Starter Arubacloud
0 głosów
342 wizyt
pytanie zadane 6 marca 2017 w C i C++ przez perrymoon Nowicjusz (190 p.)

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.

 

3 odpowiedzi

0 głosów
odpowiedź 6 marca 2017 przez tangarr Mędrzec (154,780 p.)
Dodaj do kodu zmienne przesuniecieX i przesuniecieY. Podczas rysowania mapy zaczynaj iteracje nie od 0 lecz od zdefiniowanych przesunięć.
Dodaj sobie osobne klawisze do zmiany przesunięć i potestuj co się dzieje.
komentarz 6 marca 2017 przez perrymoon Nowicjusz (190 p.)
Właśnie próbowałem to zrobić i tak średnio wychodziło :/ Mógłbyś to pokazać jakoś na kodzie?
0 głosów
odpowiedź 8 marca 2017 przez perrymoon Nowicjusz (190 p.)
Mógłby ktoś na to spojrzeć?
0 głosów
odpowiedź 8 marca 2017 przez obl Maniak (51,280 p.)
komentarz 9 marca 2017 przez perrymoon Nowicjusz (190 p.)
Dalej niezbyt rozumiem w jaki sposób mi to ma mi pomóc? Chodziło mi, żeby ktoś może dał jakieś wskazówki na jakimś przykładzie z kodu jak to zrobić, bo wtedy najłatwiej zrozumieć. Próbowałem różnych rzeczy i nic nie pomaga, gdyż raz wyświetla się czarne tło, raz w ogóle nie chce się skompilować a raz kompiluje się, ale okno jest przezroczyste a gra się nie chce włączyć.

Podobne pytania

0 głosów
1 odpowiedź 491 wizyt
pytanie zadane 7 maja 2015 w C i C++ przez molaki Obywatel (1,700 p.)
0 głosów
1 odpowiedź 336 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Sebastian Plichta Obywatel (1,200 p.)
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 24 grudnia 2018 w C i C++ przez niezalogowany

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...