Jump to content
  • Advertisement
Sign in to follow this  
BaneTrapper

Drawing tiles to a screen math problems

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello.
I have successfully stored and drew 4Regions of 25x25Tiles to screen and made camera to move around screen
Here is my function

But what i need is to draw only tiles that are on screen.
I am trying to save performance, cause i want to be efficient
Ani tips or hints would be userfull

Here is my function to draw all 4 region to screen;


void Area::DrawArea(int CamX, int CamY, App* obj_App)
{
int TileID = 0; //Holds TileID;
int RegionID = 0; //Holds RegionID
int surfW = ((*GETP_surf_Tileset())->w / TILE_SIZE); //For SDL_Rect crop
SDL_Rect crop,pos;
crop.w = TILE_SIZE;
crop.h = TILE_SIZE;
(*obj_App->GETP_surf_Screen());
for(int a = 2; a < 6; a++) /*HomeMade math to draw to correct position will went : "x= 0 y = 0", "x = 1, y = 0", "x = 0 y = 1", "x = 1 y = 1"
So we draw to correct place to screen*/
{
for(int y = 0; y < REGION_SIZE/*25*/; y++)
{
for(int x = 0; x < REGION_SIZE/*25*/; x++)
{
if(RegionList[RegionID].TileList[TileID].Layer1 == -1) /* Check if tile loaded failed */
{
TileID++;
continue;
}
crop.x = (RegionList[RegionID].TileList[TileID].Layer1 % surfW) * TILE_SIZE;
crop.y = (RegionList[RegionID].TileList[TileID].Layer1 / surfW) * TILE_SIZE;
pos.x = (x * TILE_SIZE) - CamX + ((a % 2) * 1000);
pos.y = (y * TILE_SIZE) - CamY + (((a-2) / 2) * 1000);
SDL_BlitSurface(surf_Tileset, &crop, *obj_App->GETP_surf_Screen(), &pos);
TileID++;
}
}
TileID = 0; //We set TileID to 0 for next RegionLoop
RegionID ++; //We increment Region for next loop so we draw correct tiles
}
}

Share this post


Link to post
Share on other sites
Advertisement
Figure out which tile column is the first/last one on the screen and same for tile rows, then only loop across those. You can do this by comparing your tile's positions (top-left corner known from pos and width/height known from TILE_SIZE, which gives you the bottom-left corner) with the bounds of your window. Compare coordinates to do this, e.g. go over a tile row, and go "is the x coordinate less than zero, yes, keep going... yes, etc... ah, this one is more than zero, so this is the first tile in each row to be shown on the screen!" and so forth. You can actually also calculate quickly which tiles are the "boundary tiles" with a formula if your tiles are all the same size, but it's best you try and do it the explicit way first so you don't get confused.

Does it make sense? Edited by Bacterius

Share this post


Link to post
Share on other sites

Figure out which tile column is the first/last one on the screen and same for tile rows, then only loop across those. You can do this by comparing your tile's positions (top-left corner known from pos and width/height known from TILE_SIZE, which gives you the bottom-left corner) with the bounds of your window. Compare coordinates to do this, e.g. go over a tile row, and go "is the x coordinate less than zero, yes, keep going... yes, etc... ah, this one is more than zero, so this is the first tile in each row to be shown on the screen!" and so forth. You can actually also calculate quickly which tiles are the "boundary tiles" with a formula if your tiles are all the same size, but it's best you try and do it the explicit way first so you don't get confused.

Does it make sense?


Mhm interesting. But its not quite good approach to what i have currently done.
I am kinda rusty with english.

I am tinkering about 4h so far, Got done with so much math and stuff but its still missing some stuff i cant figure out.
As you are saying i do it like:
Store start location in loop
How much to loop in x , y
But i need to do it 4x times, DONE but i also need to shift tiles for Some amount so they are at correct position... and its complicated ^^.

Thanks on the tip, keep em coming.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!