Building the game world
Since tiles are going to play such a huge role in our game design, it would be greatly helpful to have a separate data structure that all tile information can be localized to. A good place to start is by defining some constants of the tile size, as well as dimensions of the tile sheets that are going to be used. A simple enumeration can be quite helpful when storing this information:
enum Sheet{Tile_Size = 32, Sheet_Width = 256, Sheet_Height = 256};
Here, we make it so all tiles are going to be 32 px wide and 32 px tall and every single tile sheet is going to be 256 px wide and 256 px tall. These constants, obviously, can be changed, but the idea here is to keep them the same during runtime.
To keep our code a little shorter, we can also benefit from a type alias for tile IDs:
using TileID = unsigned int;
The flyweight pattern
Each tile, obviously, has to have a sprite that represents its type graphically speaking. In order to draw a grass tile, we want to adjust the sprite...