Dynamic allocation, 3d array, RPG-type level structure

Started by
1 comment, last by microbe-devel 11 years, 6 months ago
Hi there,
before going further, I want to apologize if I dont post in the appropriate section. Sorry for my approximative english too.

Here's the stuff;
I'm developping a game wich will mix classic RPG stage and Shoot'em up stages (not at the same time of course).
I have some trouble to make my map loading function.

I show you how my level are constructed;

first step:
I'm creating a txt file, wich look like this:
level.png

After that, i convert this txt file to an unsigned char array and i put that in a header file.

So i want to have a structure like that:
[source lang="cpp"]typedef struct{
char map_name[50];
int width;
int height;
char*** map_struct;
}rpgMap;[/source]


I can retrive my map_name, and put it in my structure, idem for width and height.

Now my problem:
I'm not familiar with dynamic allocation, here's how i'm allocating my array memory:


[source lang="cpp"]// Create the array in memory
int a = 0; int b = 0;
Map.map_struct = malloc(Map.height*sizeof(char*));
for(a = 0; a < Map.height; a++){
Map.map_struct[a] = malloc(Map.width * sizeof(char*));
for(b=0; b < Map.width; b++){
Map.map_struct[a]= malloc(4 * sizeof(char*)); //The "4" is for "background / foreground / collision / event"
}
}[/source]


I'm not sure if this is correct ...

If someone can help, it would be great. I will need help to fill this array too, but one thing at once ^^



ps: I see that we can attach file ( up to 48Mo ohmy.png ) so if i dont get it, i will create a small project ( main.c, level.c, level.h ) without all the GUI things, only the structure stuffs, to show my problem.


Thanks

smile.png
Advertisement
While your allocation code looks correct to me, you could also simply create a 1D array with the correct size (so that would be Map.height*Map.width*4*sizeof(char)), and then use the following code to access each tile's information:
map_struct[i+4*x+4*Map.width*y] or map_struct[i+4*y+4*Map.height*x]
You have some choice in whether you arrange the data by rows or by columns, but I recommend that you put the data for each tile in one position.
That's sounds good !
I'm gonna put each tile in "one line" so i think this would work:
[s]( x * y ) + ( 4* (x*y-1) ) + Z[/s]
Where x is tile x position, y is y tile position, and z is the row i want to get from the tile !
I will try, thanks !!!

Edit: my calcul was bad :rolleyes:
This work;

((y * (MapWidth - 1) + y + x) * 4) +Z

Where x, y are the tile coordinates ( first tile is 0,0 )
MapWidth is the map number of tiles in width
4 is because one tile contain 4 rows
Z is added to get the rows we want ( 4 rows, 0 -> 3 )

Thanks again !

This topic is closed to new replies.

Advertisement