Problem z obsługą pliku textowego i rysowaniem mapy kafelkowej

0

Witam, otóż tworze sobie w ramach nauki jakąś śmieszną gierkę i mam mały problem z rysowaniem mapy kafelkowej po użyciu fstream.
Otóż kiedy chcę wczytać dane z pliku, i używam funkcji .open (przynajmniej z moich testów wyszło że tu leży błąd, mogę się mylić) dalsza część aplikacji ma problem z narysowaniem mapy.

Jak wygląda rysowanie kiedy plik.open() i plik.close() są w komentarzu (rysowanie poprawne):
user image

Jak wygląda kiedy działają (rysowanie niepoprawne):
user image

Plik z kafelkami:
user image

Nie jestem w stanie dojść do tego czemu tak się dzieje..

pliki źródłowe:
main.cpp

#include <allegro.h>
#include <fstream>
#include <tile_prop.h>
#include <map.h>

//zmienne okna
int w_x = 640;
int w_y = 640;

//Zmienne mapy
int map_x=0;
int map_y=0;

//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 init()
{
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT,640,640,0,0);
}

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]%2)*40,
            (map[temp_y+map_y][temp_x+map_x]/2)*40,
            temp_x*40,temp_y*40,40,40);
        };
    };
}

int main()
{
    allegro_init();
    init();
    load_tiles_prop();
    if(no_tilestxt==true)
    {
        textout_ex( screen, font, "Brak pliku tiles_prop.txt! WYCHODZE, 10s", 20, 20, makecol( 255, 0, 255 ), - 1 );
        rest(10000);
        allegro_exit();
        return 0;
    };

    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
    draw_map();
    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();

tile_prop.h

bool no_tilestxt = false;

struct tiles_prop
{
    int id;
    int id_i;
    bool clash;
    bool mob;
    int mob_id;
    int event;
    int event_id;
    int event_val;
    bool spec_event;
    char s_e_val[];
};
tiles_prop tiles_tab[3];

void load_tiles_prop()
{
    std::fstream tiles_file;
    tiles_file.open("tiles_prop.txt", std::ios::in);
    if(!tiles_file.good()) no_tilestxt=true;
    else
    {
        int i=0;
        while(!tiles_file.eof())
        {
            tiles_file>>tiles_tab[i].id;
            tiles_file>>tiles_tab[i].id_i;
            tiles_file>>tiles_tab[i].clash;
            tiles_file>>tiles_tab[i].mob;
            tiles_file>>tiles_tab[i].mob_id;
            tiles_file>>tiles_tab[i].event;
            tiles_file>>tiles_tab[i].event_id;
            tiles_file>>tiles_tab[i].event_val;
            tiles_file>>tiles_tab[i].spec_event;
            tiles_file>>tiles_tab[i].s_e_val;
            i++;
        };
        tiles_file.close();
    };
};

map.h

int tilesize = 40;
int map[16][16] =
{
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0},
    {0,0,0,0,0,3,3,0,1,0,0,0,0,0,0,0},
    {1,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
    {0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0},
    {0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,2,2,0,0,0,0,0,1,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
1

Po pierwsze ogranicz ilość zmiennych globalnych, zupełnie nie da się połapać w kodzie. Jak będziesz ten projekt bardziej rozwijał, to szybko sam nie będziesz w stanie tego opanować. Przy odczytywaniu pliku źle sprawdzasz, czy nie doszedłeś do końca pliku, robisz o jeden obrót pętli za dużo.

Jeszcze te zmienne globalne źle używasz, działa to tylko dlatego, że masz jeden plik .cpp, przy większej ilości będziesz miał problem (lektura na dziś -> extern, lektura na później -> klasy).

0

Faktycznie zagapiłem się i wczytywanie wychodziło mi poza zakres tablicy, dzięki bardzo.

A co do projektu to jest to 1-2 dniowa nauka, stąd wynika trochę niechlujstwa jeśli chodzi o zmienne globalne, ale dzięki postaram się to jeszcze bardziej ograniczyć

@Edit
Um, dzięki, na pewno przejże obydwie :)

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