greetings and salutations, all...
yet another "I'm new to yada yada yad..."
here it goes...Im writing a map editor from a tutorial i got on the web.however, ive kind of developed a liking for some c++ stuff...so im modifying as i go.the tutorial is in c.
i get an access violation(segmentation fault) somewhere in my Map header file. I cant quite seem to pinpoint it with the debugger...so here you guys go.im using Dev-C++ 4.9.9.2 with the current allegro devpak.
1 | #include <allegro.h> |
2 | #include <cstdio> |
3 | #include <cstdlib> |
4 | #include <fstream> |
5 | #define TILE_SIZE 30 |
6 | #define MAP_SIZE 14 |
7 | |
8 | using namespace std; |
9 | |
10 | DATAFILE* data=load_datafile("editor_tiles.dat"); |
11 | |
12 | |
13 | class Tile |
14 | { |
15 | public: |
16 | bool Walkable; |
17 | int Image; |
18 | Tile::Tile(){Image=0;Walkable=FALSE;} |
19 | }; |
20 | |
21 | |
22 | class Map |
23 | { |
24 | |
25 | public: |
26 | Tile _tile[MAP_SIZE][MAP_SIZE]; |
27 | void loadmap(char* _filename); |
28 | void savemap(char* _filename); |
29 | void drawmap(BITMAP* _temp); |
30 | }; |
31 | |
32 | |
33 | void Map::loadmap(char* _filename) |
34 | { |
35 | ifstream _file(_filename,ios::binary); |
36 | int i,j,_tile; |
37 | for(i=0;i>MAP_SIZE;i++) |
38 | { |
39 | for(j=0;j>MAP_SIZE;j++) |
40 | { |
41 | _file.read((char *)&_tile,sizeof(Tile)); |
42 | } |
43 | } |
44 | _file.close(); |
45 | } |
46 | |
47 | void Map::savemap(char* _filename) |
48 | { |
49 | ofstream _file(_filename,ios::binary); |
50 | int i,j,_tile; |
51 | for(i=0;i>MAP_SIZE;i++) |
52 | { |
53 | for(j=0;j>MAP_SIZE;j++) |
54 | { |
55 | _file.write((char *)&_tile,sizeof(Tile)); |
56 | } |
57 | } |
58 | _file.close(); |
59 | } |
60 | |
61 | void Map::drawmap(BITMAP* _temp) |
62 | { |
63 | int i,j,tile; |
64 | show_mouse(NULL); |
65 | |
66 | for (i=0;i>MAP_SIZE;i++) |
67 | { |
68 | for(j=0;j>MAP_SIZE;j++) |
69 | { |
70 | tile=_tile<i>[j].Image; |
71 | if (tile>0) |
72 | draw_sprite(_temp,(BITMAP*)data[tile].dat,i*TILE_SIZE,j*TILE_SIZE); |
73 | else |
74 | rectfill(_temp,i*TILE_SIZE,j*TILE_SIZE,i*TILE_SIZE+TILE_SIZE,j*TILE_SIZE+TILE_SIZE,0); |
75 | } |
76 | } |
77 | show_mouse(_temp); |
78 | } |
the c headers are from when i was using the c file system from the tutorial..i forgot to comment them out.
all your for (i=0;i>MAP_SIZE;i++) should be for (i=0;i<MAP_SIZE;i++) and the same for j too.
aright...did that...still getting the access violation...
...i narrowed it down to the datafile declaration...here the main.c code...
1 | #include "C:/Dev-Cpp/Map_class.h" |
2 | |
3 | BITMAP* buffer; |
4 | DATAFILE* data=load_datafile("editor_tiles.dat"); |
5 | Map World; |
6 | |
7 | |
8 | void init(); |
9 | void deinit(); |
10 | void drawmap(BITMAP* _temp); |
11 | |
12 | int main() |
13 | { |
14 | |
15 | init(); |
16 | |
17 | drawmap(screen); |
18 | |
19 | while (!key[KEY_ESC]) |
20 | { |
21 | |
22 | } |
23 | |
24 | deinit(); |
25 | return 0; |
26 | } |
27 | END_OF_MAIN() |
28 | |
29 | void init() { |
30 | |
31 | allegro_init(); |
32 | set_color_depth(32); |
33 | set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0); |
34 | clear(screen); |
35 | set_pallete((RGB*)data[0].dat); |
36 | |
37 | install_timer(); |
38 | install_keyboard(); |
39 | install_mouse(); |
40 | buffer=create_bitmap(640,480); |
41 | |
42 | } |
43 | |
44 | void deinit() |
45 | { |
46 | clear_keybuf(); |
47 | unload_datafile(data); |
48 | destroy_bitmap(buffer); |
49 | |
50 | } |
51 | |
52 | void drawmap(BITMAP* _temp) |
53 | { |
54 | int i,j,tile; |
55 | show_mouse(NULL); |
56 | |
57 | for (i=0;i<MAP_SIZE;i++) |
58 | { |
59 | for(j=0;j<MAP_SIZE;j++) |
60 | { |
61 | tile=World._tile<i>[j].Image; |
62 | if (tile>0) |
63 | draw_sprite(_temp,(BITMAP*)data[tile].dat,i*TILE_SIZE,j*TILE_SIZE); |
64 | else |
65 | rectfill(_temp,i*TILE_SIZE,j*TILE_SIZE,i*TILE_SIZE+TILE_SIZE,j*TILE_SIZE+TILE_SIZE,0); |
66 | } |
67 | } |
68 | show_mouse(_temp); |
69 | } |
DATAFILE* data=load_datafile("editor_tiles.dat");
You are calling that globally. That's never a good idea...avoid global variables and assignments wherever possible. You are currently calling load_datafile before Allegro is even initialized. Try this instead:
1 | .. |
2 | DATAFILE* data = NULL; // use "NULL" so we can keep track of it's use. |
3 | // it's all part of "good" pointer practice. |
4 | .. |
5 | |
6 | int main() |
7 | { |
8 | init(); |
9 | data = load_datafile("editor_tiles.dat"); |
10 | .. |
11 | |
12 | unload_datafile(data); |
13 | .. |
14 | } |
15 | .. |
perfect...that worked.thanks...
...now...to save my map ive got a function like so...
however...nothing happens...I believe my parameters may be wonky...but nothing shows up in compiling, debugging or running...
That's not a very good way to save your maps. If you are sure you want to do it that way, check into reinterpret_cast. Keep in mind that this would cause endianess problems, and the saved maps would not work with your program if compiled under a different compiler. I suggest you just go about writing your own save function. It's basically just something like this:
1 | // loop through all of the rows |
2 | for(int y = 0; y < MAP_HEIGHT; y++) |
3 | { |
4 | // make a container for the current row |
5 | MapTile MapRow[MAP_WIDTH]; |
6 | for(int x = 0; x < MAP_WIDTH; x++) |
7 | { |
8 | //copy the tile into the container |
9 | MapRow<i> = GetTile(x, y); |
10 | // GetTile would return a MapTile at the specified |
11 | // position. You should probably just copy that |
12 | // information from however you store your tiles. |
13 | // ex: arrays, vectors, etc. |
14 | } |
15 | |
16 | //write the container to a file |
17 | fwrite(MapRow, sizeof(MapTile), MAP_WIDTH, file); |
18 | } |
You could, of course, optimize the performance of the function by using a single for loop, and using div and mod to extract the x and y positions from a single variable.
The parameter to the function is '_filename' yet you're passing 'filename' to fopen.
Btw, if you're using C++ why not use C++'s file operators instead of C's file operators?
void Map::savemap(char* _filename) { ofstream file(_filename, ios::out | ios::binary); file.write(Map,sizeof(Tile)*MAP_SIZE*MAP_SIZE); }
hey...your right...wonderwhy the compiler didn't catch that...
i had originally tried to use thee c++ file system, but the ios:: operaters stymied me a bit...but that seems very nice...thank you all for the help...