Jump to content

  • Log In with Google      Sign In   
  • Create Account


Segmentation fault while rendering map


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 sandorlev   Members   -  Reputation: 193

Like
0Likes
Like

Posted 13 December 2012 - 11:15 AM

I'm trying to render a map with a moving camera and I get a segmentation fault every time I start moving down. Here is the code:

	void Map::Render(SDL_Surface* tileSet, SDL_Surface* display) const
	{
		const int tileSize = Tile::GetTileSize();
		Vector2D cameraLocation = Camera::control.GetLocation();

		//Checking boundaries
		if (cameraLocation.x < 0)
			cameraLocation.x = 0;

		else if (cameraLocation.x > width * tileSize)
			cameraLocation.x = width * tileSize;

		if (cameraLocation.y < 0)
			cameraLocation.y = 0;

		else if (cameraLocation.y > height * tileSize)
			cameraLocation.y = height * tileSize;

		Vector2D first;
		first.x = (int)cameraLocation.x / tileSize;
		first.y = (int)cameraLocation.y / tileSize;

		Vector2D offset;
		offset.x = (int)cameraLocation.x % tileSize;
		offset.y = (int)cameraLocation.y % tileSize;

		for (int y=0; y<height; y++)
		{
			for (int x=0; x<width; x++)
			{
				//Segmentation fault happens here
				const int index = \
					rows[y + first.y].columns[x + first.x].GetTileID();

				Rectangle srcRect = Tile::GetSourceRect(index);
				const int xOffset = x * tileSize - offset.x;
				const int yOffset = y * tileSize - offset.y;
				Surface::Blit(xOffset, yOffset, srcRect, tileSet, display);
			}
		}
	}

The segmentation fault happens at the GetTileID() function. Additional data:

width = 50;
height = 200;
tileSize = 96;

//Variable values when the segmentation fault happens
cameraLocation.x = 10;
cameraLocation.y = 100;


first.x = 0;
first.y = 1;

offset.x = 10;
offset.y = 4;


x = 9;
y = 198;

xOffset = 854;
yOffset = 19004;


Sponsor:

#2 santa01   Members   -  Reputation: 307

Like
0Likes
Like

Posted 13 December 2012 - 12:12 PM

Sorry, I am not convenient with SDL, but I can recommend you to split the problematic line into pieces to simplify debugging.
You can evaluate:
rows[y + first.y]
columns[x + first.x]
GetTileID();
separately to see what gives you SIGSEGV.

Also I would be interesting to see what are the classes for rows and columns objects and if the values passed to their [] operator are valid.

#3 BeerNutts   Crossbones+   -  Reputation: 2197

Like
1Likes
Like

Posted 13 December 2012 - 12:31 PM

Assuming rows has height indices, I believe the problem is related to setting first.y to the last tile (if you are at the bottom, first.y will be height), and then adding numbers to height, and attempting to access row at a value past height.

So, when you do this:
for (int y=0; y<height; y++) {
...
  const int index = 
			    rows[y + first.y].columns[x + first.x].GetTileID();
After the 1st loop, y will be 1, y+first.y = height+1, which is out of bounds of the array rows. You need to re-think how to display the map.
My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS