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):
Jak wygląda kiedy działają (rysowanie niepoprawne):
Plik z kafelkami:
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}
};