Kod wczytywania z pliku gryzie się z inicjalizacja klawiatury/trybu graficznego

0

Witam, otóż z niewiadomych mi powodów kod wczytywania danych z pliku gryzie mi się z inicjalizacją klawiatury i/lub trybu graficznego z Allegro, tj. gdy wsadzę wczytywanie z pliku do tablicy przed inicjalizacją wczytanie zostaje wykonane poprawne, a gdy umieszczę kod wczytywania po inicjalizacji nie wczytuje/usuwa mi zawartość ostatnich 10 komórek.

Jedna uwaga do tego, kiedy przepisałem TYLKO wczytywanie do tablicy i inicjalizacje allegro i klawiatury (tj allegro_init() i init() z mojego kodu) wczytanie także wykonało się poprawnie, ale niestety nie jestem w stanie określić co dokładnie powoduje problem..

zawartości plików:
main.cpp

using namespace std;
#include <allegro.h>
#include <cstdlib>
#include <fstream>
#include <string>
#include <iostream>
#include <map.h>
//zmienne okna
int w_x = 640;
int w_y = 640;
//Zmienne mapy
int map_x=0;
int map_y=0;
int dziel=8;
//zmienne gracz
int player_x=0;
int player_y=0;
int player_idxx=0;
int player_idxy=0;
//bitmapy
BITMAP * bufor = NULL; //bufor
BITMAP * tiles = NULL; //kafelki mapy
BITMAP * player = NULL; //gracz

void draw_map()
{
    int temp_x,temp_y;
    for(temp_x=0; temp_x<16; temp_x++)
    {
        for(temp_y=0; temp_y<16; temp_y++)
        {
            blit(tiles,bufor,
                 (map[temp_y+map_y][temp_x+map_x]%dziel)*40,
                 (map[temp_y+map_y][temp_x+map_x]/dziel)*40,
                 temp_x*40,temp_y*40,40,40);
        };
    };
};

void init() // INICJALIZACJA
{
    install_keyboard(); //TO LUB
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT,640,640,0,0); //TO WG MOICH TESTÓW SIĘ GRYZIE
};

int main()
{
    allegro_init();
    init(); //tym <------------------
    map_load(); //kiedy to jest nad /\ to wczytywanie wykonuje się poprawnie, kiedy jest w obecnej pozycji komórki
                     //map[16][6-16] są puste

    bufor = create_bitmap(w_x,w_y);
    tiles = load_bmp("tiles.bmp",default_palette);
    player = load_bmp("player.bmp",default_palette);

    while(!key[KEY_ESC])
    {

        //sterowanie graczem
        if(key[KEY_RIGHT])
        {
                player_x=player_x+40;
                player_idxx++;
        };
        if(key[KEY_LEFT])
        {
                player_x=player_x-40;
                player_idxx--;
        }
        if(key[KEY_UP])
        {
                player_y=player_y-40;
                player_idxy--;
        }
        if(key[KEY_DOWN])
        {
                player_y=player_y+40;
                player_idxy++;
         }

        //rysowanie mapy i mobow
        draw_map();
        masked_blit(bufor,screen,0,0,0,0,w_x,w_y);
        //przygotowanie bufora na rysowanie gracza
        clear_to_color(bufor, makecol( 255, 0, 255 ));
        //rysowanie gracza
        masked_blit(player,bufor,0,0,0,0,40,40);
        masked_blit(bufor,screen,0,0,player_x,player_y,40,40);
        rest(70);
    };
    allegro_exit();
    return 0;
}
END_OF_MAIN();

map.h

int map[16][16];

void map_load()
{
    fstream map_file;
    map_file.open("map1.dat",ios::in);
    int ii=0;
    int jj=0;
    do
    {
        string linia;
        string temp;
        map_file>>linia;
        int size=linia.size();
        for(int k=0; k<size; k++)
        {
            if(linia[k]!=',' && linia[k]!=';') temp=temp+linia[k]; else
            {
                map[ii][jj]=atoi(temp.c_str());
                jj++;
                temp="";
            };
            if(temp[k]==';')
            {
                ii++;
                jj=0;
            };
        };
    }while(!map_file.eof());
    map_file.close();
};

map1.dat

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;
1,1,1,2,4,4,4,4,2,2,1,1,1,1,1,1;
1,1,1,1,4,4,4,4,2,1,1,1,1,1,1,1;
2,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1;
1,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1;
1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1;
1,5,3,5,1,1,1,1,1,1,1,1,1,1,2,1;
1,5,3,5,5,5,5,1,2,1,1,1,1,1,1,1;
1,5,3,3,3,3,5,1,1,1,1,1,1,1,1,1;
1,5,5,5,3,3,5,1,1,1,1,2,1,1,1,1;
1,1,1,5,5,3,5,1,1,1,1,1,1,1,1,1;
1,1,2,1,5,3,5,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;
0
tariel36 napisał(a)

//map[16][6-16] są puste

Jesteś pewien, że o te dokładnie indeksy Ci chodzi?

Mimo prób nie udało mi się odtworzyć tego problemu; wszystko działa jak należy. W czym kompilujesz, i z jakiej wersji allegro korzystasz?

0

ten warunek nigdy nie będzie spełniony:

if(temp[k]==';')

bo średnik nigdy nie jest wkładany do temp (tak budujesz temp).
Użycie map_file.eof() jest standardowym błędem początkującego z STL (zapewne to powoduje kłopoty), eof() zwraca true tylko wtedy, gdy spróbujesz czytać poza plikiem.
Nazwanie zmiennej map to proszenie się o kłopoty (potencjalny konflikt z std::map).
Strasznie przekombinowałeś to wczytywanie!
Powinno być raczej:

void map_load()
{
    fstream map_file;
    map_file.open("map1.dat",ios::in);
    int ii=0;
    string linia;
    while(getline(map_file, linia, ';')) {
        int jj=0;
        stringstream slinia(linia);
        while(slinia>>myMap[ii][jj]) {
             char ch = 0;
             jj++;
             if (slinia >> ch)
                 assert(ch==',');
             if (jj>=16) break;
        }
        ii++;
        if (ii>=16) break;
    }
};
0

Raczej niepotrzebnie wczytujesz pośrednio linię, bez problemu można parsować zawartość od razu:

bool map_load(const char *file_path)
{
    ifstream map_file(file_path);
    if (!map_file) return false;
 
    char separator;
    for (int ii = 0; ii < 16; ii++) {
        for (int jj = 0; ; jj++) {
            map_file >> myMap[ii][jj];
            map_file >> separator;

            if (jj >= 15) break;

            if (separator != ',') return false;
        }
        if (separator != ';') return false;
    }

    return map_file.good();
};

Powyższy sposób ignoruje białe znaki całkowicie.

A tak w ogóle to czemu takiej mapy nie zapiszesz binarnie? Bardziej pasuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1