Difference between revisions of "Field of View / No Mask"
(Created page with "You can create a field of view by checking the distance between the tile to draw and the player. This might involve editing the code for you map drawing library. =Squared.Til...") |
|||
Line 1: | Line 1: | ||
You can create a field of view by checking the distance between the tile to draw and the player. This might involve editing the code for you map drawing library. | You can create a field of view by checking the distance between the tile to draw and the player. This might involve editing the code for you map drawing library. | ||
+ | |||
+ | It could look something like this: | ||
+ | |||
+ | [[File:Field of View No Mask.png|frame]] | ||
=Squared.Tiled= | =Squared.Tiled= |
Revision as of 13:00, 24 May 2024
You can create a field of view by checking the distance between the tile to draw and the player. This might involve editing the code for you map drawing library.
It could look something like this:
Squared.Tiled
for example, something like:
if (Vector2.Distance(new Vector2(x * tileWidth, y * tileHeight), player) < distance)
{
info = _TileInfoCache[index];
batch.Draw(info.Texture, destPos - viewPos, info.Rectangle,
Color.White * this.Opacity, rotation, new Vector2(tileWidth / 2f, tileHeight / 2f),
1f, flipEffect, 0);
}
The if statement above is around the line that draws an individual tile.
Other Libraries
The other libraries all require a more complex draw method in your game, for example Squared.Tiled literally uses Map.Draw(). The other libraries require you to have a draw method like this:
foreach (var layer in map.Layers.OfType<TileLayer>())
{
for (int y = 0, i = 0; y < layer.Height; y++)
for (int x = 0; x < layer.Width; x++, i++)
{
var gid = layer.Data[i];
if (gid == 0)
continue;
else
{
var tileset = map.Tilesets.Single(ts => gid >= ts.FirstGid && ts.FirstGid + ts.TileCount > gid);
var tile = tileset[gid];
Rectangle tilesetRec = new Rectangle(tile.Left, tile.Top, 32, 32);
_spriteBatch.Draw(ts, new Rectangle((int)x*32, (int)y*32, 32, 32), tilesetRec, Color.White);
}
}
}
So this could become something like:
foreach (var layer in map.Layers.OfType<TileLayer>())
{
for (int y = 0, i = 0; y < layer.Height; y++)
for (int x = 0; x < layer.Width; x++, i++)
{
var gid = layer.Data[i];
if (gid == 0)
continue;
else
{
if (Vector2.Distance(new Vector2(x * tileWidth, y * tileHeight), player) < distance)
{
var tileset = map.Tilesets.Single(ts => gid >= ts.FirstGid && ts.FirstGid + ts.TileCount > gid);
var tile = tileset[gid];
Rectangle tilesetRec = new Rectangle(tile.Left, tile.Top, 32, 32);
_spriteBatch.Draw(ts, new Rectangle((int)x*32, (int)y*32, 32, 32), tilesetRec, Color.White);
}
}
}
}