-
Notifications
You must be signed in to change notification settings - Fork 7
Tile System
As this is a farming game, players must be able to change the game world around them, creating and modifying objects in the game as they please. For example, a player will be able to create a crop tile in the world through the use of a hoe (see tool wiki), or could water a plant (see plant wiki) with a bucket.
Some entities that the player creates or modifies will be arranged in a tesselating square-grid pattern. The tile system provides the factories and components of such entities, and is intended to work seamlessly with map generation, player tools, and plant behaviors.
Certain entities, such as trees, boulders, plots of land meant for planting crops, etc, are unmoving in the scene, while other entities, such as the player or npcs, are able to move freely through the game area. To simplify the farming and building processes, the placement of unmoving entities are bound to one or more square ‘cells’ within the terrain (these entities will be referred to as ‘terrain entities’).
These terrain entities will share a common entity creation method signature (in sprint 1, this is simply a Vector2
or two float
s representing the location at which to spawn the entity), which is responsible for instantiating an entity at a given grid cell location. The behaviour of certain terrain entities can depend on the type of terrain on which the entity was spawned. For instance, the soil quality of crop tiles depend on what TileType
the crop tile was spawned on (e.g., certain types of terrain tiles will improve the growth rate of certain plants - note this is not implemented as of sprint 1, but is a project for future sprints).
Since terrain entities are bound to one or more grid cells in the game area, the Map
(see Map Generation) will need to know which cells of the map are occupied by terrain entities. When a terrain entity is spawned, the grid cells it occupies are marked as such. Likewise, before spawning a terrain entity, the map’s grids need to be checked to see if they are occupied.
To create a CropTile
at position (x,y), use the following:
TerrainCropTileFactory.createTerrainEntity(x,y);
This will create and register the Crop Tile entity.
As this game engine uses ECS, almost every game object is an Entity
, which has components added to it that add functionality. As most entities have several components attached to them, the factory design pattern is used to collect all relevant information and return a single instance of a class. This significantly simplifies our methods as classes that require the creation of entities only need to provide simple arguments (eg: x and y position) without worrying about ECS related tasks (eg: registering the entity with the EntityService
.
The TerrainCropTileFactory
is an example of such a factory. This factory creates entities that have the CropTileComponent
(see Crop Tiles), which are tiles that house plant entities.
Originally, the team considered an inheritance structure for the terrain entity factories. That is, an abstract ‘terrain entity’ factory from which all terrain entity factories (e.g., the crop tile factory) would inherit was to be created. This was intended to simplify the process of creating terrain entities. However, this idea was scrapped, as static methods (which would create terrain entities) cannot be overridden. Moreover, the benefit was minimal, and a similar result could be achieved by agreeing on a method signature to create the terrain entities (i.e., one that accepts a single Vector2
parameter, and returns an Entity
reference).