• 13
• 15
• 27
• 9
• 9

# Can't clip tiles without crashing

This topic is 1357 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

typedef struct tiles {
int x, y;
int w, h;
} TILES;

TILES *tiles_i;

int clip_tiles() {
int y, x;
tiles_across = tileset_i->w / 16;
tiles_down = tileset_i->h / 16;
printf("%d,%d,%d\n",tiles_across, tiles_down, tiles_across * tiles_down);
tiles_i = malloc(sizeof(int) * tiles_across * tiles_down);
for( y = 0; y < tiles_down; y++ ) {
for( x = 0; x < tiles_across; x++ ) {
tiles_i[(y * tiles_across) + x].x = 16;
tiles_i[(y * tiles_across) + x].y = 16;
tiles_i[(y * tiles_across) + x].w = 16;
tiles_i[(y * tiles_across) + x].h = 16;

printf("%d\n",(y * tiles_across) + x);
}
}
}


Hello,

I am trying to clip tiles, but the game keep crashing when I run this code. At the moment, I just have every value set at 16, though that will change. tiles_across is 9, and tiles_down is 6, so tiles_across times tiles_down should be 54, right? And when I malloc tiles_i, it should have an array of 54 right? When I set the those tables manually, like:

tiles_i[53].x = 16;
tiles_i[53].y = 16;
tiles_i[53].w = 16;
tiles_i[53].h = 16;


then the game does not crash (on the side note I can go from 0 to any number past 53), though when I print (y * tiles_across) + x, it goes from 0 to 53, so that formula should not be the issue. The way my levels are parsed, 0 means nothing is there, and any number but 0 corresponds to a tile on the tilesheet. However since I know 0 means no tiles, the tile placing object has been adjusted accordingly (it's given an ID number for the tile, it just subtracts 1 to find the correct tiles_i).

Do you have an idea as to why my game crashes when I parse tiles like this? Thanks

EDIT:

I fixed it with sizeof(TILES), I got another issue at the bottom

Also, but any chance, do you think someone could help me figure out a way to parse a tile sheet, if the tiles inside are not touching eachother? like instead of this:

[attachment=22378:tile.PNG]

it's this

[attachment=22379:tile_spaced_margin.PNG]

also that's not the tilesheet I am talking about at the top

Edited by DrNicholas

##### Share on other sites

It appears that, by "clip tiles," you mean that you want each tile structure to contain the pixel coordinates of some region of the texture.

If so, then set the tile x & y coordinates to the appropriate corner of each region, and set the width and height parameters to the width/height of the desired region.

E.g., using the second image you posted, assuming the upper left-hand corner is ( 0,0 ), the width/height of each colored rectangle is (for instance) 16, and the blank "gap" between colored rectangles is 2 pixels:

int gapWidth = 2;

int rectWidth = 16;

int rectHeight = 16;

// upper left rectangle runs from pixel locations 0 through 15 in both x and y directions

tile 0: x=0, y=0, w = rectWidth, h = rectHeight (upper left corner)

// the upper left corner of the colored rectangle on the upper right - the brown one -

// pixel numbers in x direction -> grey rectangle 0-15, gap 16-17, brown rectangle 18-33

tile 1: x = rectWidth + gapWidth, y = 0, w = rectWidth, h = rectHeight (brown)

// etc.

tile 2: x = 0, y = rectHeight + gapWidth, w = ..., h = ... (pink)

tile 3: x = rectWidth + gapWidth, y = rectHeight + gapWidth, w = ..., h = ... (green)

##### Share on other sites

You're repeating yourself a lot in this code, and the readability is not very good, i suggest caching those values into variables or consts.

Example:

tiles_i[(y * tiles_across) + x].x = 16;
tiles_i[(y * tiles_across) + x].y = 16;
tiles_i[(y * tiles_across) + x].w = 16;
tiles_i[(y * tiles_across) + x].h = 16;
printf
("%d\n",(y * tiles_across) + x);

could be replaced by

const TileSize = 16;

...

int Index = (y * tiles_across) + x)

tiles_i(Index).x = TileSize;

tiles_i(Index).y = TileSize;

tiles_i(Index).z = TileSize;

tiles_i(Index).w = TileSize;

Even better would be using a vector class, and overload the = operator

tiles[Index] = TileSize; // Set all four values at once

Mine look like this. Notice i didn't think about overloading the = operator with a float, but it would take 30 seconds to add one, or i could use the Set() method.

Edited by Vortez

##### Share on other sites

Thanks Buckeye. And to Vortez, I did the index thing, but I don't know how to set it all at once with different coordinates. The tilesize is read from the file it parses.

I have another problem. My level file is like this:

return {
....
layers = {
{
....
data = {
....
}
},
{
....
data = {
....
}
},
{
....
data = {
....
}
}
}
}


I know how to get into the first data table:

lua_getfield(L, -1, "layers");
lua_rawgeti(L, -1, 1);
lua_getfield(L, -1, "data");
lua_pop(L, 1);


that code will get me into the layers table, and then into the first data table, and then pop takes me out of that data table, but I am not sure where it takes me to then. How do I get into the other data tables? Thanks

Edited by DrNicholas

##### Share on other sites

And to Vortez, I did the index thing, but I don't know how to set it all at once with different coordinates.

You dont have to have a vector class to do this, that was just a suggestion, you could roll up a function for this, for example.

void SetTile(TILES *pTile, int x, int y, int TileSize)
{
pTile->x = x;
pTile->y = y;
pTile->w = TileSize;
pTile->h = TileSize;
}



Calculating the x and y coordinate shouldn't be too difficult. I'll let you figure it out.

As for the lua part, i can't help you on that, haven't done that sort of thing yet.

Edited by Vortez

##### Share on other sites

Ah okay. So I may ave figured out the issue with getting other tile layers to show. lua_rawgeti(L, -1, z); with z representing the data table I want (1, 2, or 3) will grab the data from one of those tables. However I am having an issue now.

    lua_getfield(L, -1, "layers");
lua_rawgeti(L, -1, 1);
lua_getfield(L, -1, "data");
int i;
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_back2[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 1);
lua_rawgeti(L, -1, 2);
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_back1[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 1)


shouldn't this run correctly? I cannot get it to, it crashes at this part

    lua_rawgeti(L, -1, 2);
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_back1[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 1)


namely the lua_rawgeti(L, -1, 2); part. Any ideas on fixing this? Thanks

##### Share on other sites

EDIT: (edit button wasn't working for me at the time of this typing, so if an admin wants to add it to my previous post go ahead)

This system appears to work for now:

		lua_getfield(L, -1, "layers");
lua_rawgeti(L, -1, 1);
lua_getfield(L, -1, "data");
int i;
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_back2[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 3);
lua_getfield(L, -1, "layers");
lua_rawgeti(L, -1, 2);
lua_getfield(L, -1, "data");
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_back1[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 3);
lua_getfield(L, -1, "layers");
lua_rawgeti(L, -1, 3);
lua_getfield(L, -1, "data");
for( i = 0; i < lvl_width * lvl_height; i++ ) {
lua_rawgeti(L, -1, i + 1);
level_fore[i] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pop(L, 3);


just doesn't feel very optimized