당신이하고 싶은 것은 꽤 일반적입니다. 이 기술 및 기타 일반적인 기술에 대한 유용한 자습서를 보려면 이 타일 엔진 시리즈를 확인하십시오 .
이전에 이와 같은 작업을 수행하지 않은 경우 시리즈를 시청하는 것이 좋습니다. 그러나 원하는 경우 마지막 자습서 코드를 얻을 수 있습니다. 나중에 수행하는 경우 그리기 방법을 확인하십시오.
간단히 말해서 플레이어 주위의 최소 및 최대 X / Y 지점을 찾아야합니다. 일단 당신은 그것을 각각 반복하고 그 타일을 그립니다.
public override void Draw(GameTime gameTime)
{
Point min = currentMap.WorldPointToTileIndex(camera.Position);
Point max = currentMap.WorldPointToTileIndex( camera.Position +
new Vector2(
ScreenManager.Viewport.Width + currentMap.TileWidth,
ScreenManager.Viewport.Height + currentMap.TileHeight));
min.X = (int)Math.Max(min.X, 0);
min.Y = (int)Math.Max(min.Y, 0);
max.X = (int)Math.Min(max.X, currentMap.Width);
max.Y = (int)Math.Min(max.Y, currentMap.Height + 100);
ScreenManager.SpriteBatch.Begin(SpriteBlendMode.AlphaBlend
, SpriteSortMode.Immediate
, SaveStateMode.None
, camera.TransformMatrix);
for (int x = min.X; x < max.X; x++)
{
for (int y = min.Y; y < max.Y; y++)
{
Tile tile = Tiles[x, y];
if (tile == null)
continue;
Rectangle currentPos = new Rectangle(x * currentMap.TileWidth, y * currentMap.TileHeight, currentMap.TileWidth, currentMap.TileHeight);
ScreenManager.SpriteBatch.Draw(tile.Texture, currentPos, tile.Source, Color.White);
}
}
ScreenManager.SpriteBatch.End();
base.Draw(gameTime);
}
public Point WorldPointToTileIndex(Vector2 worldPoint)
{
worldPoint.X = MathHelper.Clamp(worldPoint.X, 0, Width * TileWidth);
worldPoint.Y = MathHelper.Clamp(worldPoint.Y, 0, Height * TileHeight);
Point p = new Point();
// simple conversion to tile indices
p.X = (int)Math.Floor(worldPoint.X / TileWidth);
p.Y = (int)Math.Floor(worldPoint.Y / TileWidth);
return p;
}
보시다시피 많은 일이 진행되고 있습니다. 매트릭스를 만들 카메라가 필요합니다. 현재 픽셀 위치를 타일 인덱스로 변환해야합니다. 최소 / 최대 포인트를 찾으십시오. )를 그릴 수 있습니다.
튜토리얼 시리즈를 보는 것이 좋습니다. 그는 현재 문제, 타일 편집기를 만드는 방법, 플레이어를 경계 내에서 유지, 스프라이트 애니메이션, AI 상호 작용 등을 다루고 있습니다.
참고로 TiledLib 에는이 기능이 내장되어 있습니다. 코드도 연구 할 수 있습니다.