현재 위치가 이동 가능한지 여부를 나타 내기 위해 타일을 사용하는 MonoGame을 사용하는 탑 다운 게임을하고 있습니다. 타일의 크기는 32x32입니다 (이미지도 있음)MonoGame Spritebatch 부분 그리기 전용 TileField
200 x 200 격자는 벽 타일로 채워져 있습니다. (임의 생성기는 경로와 실을 생성해야합니다.) 그러나 모든 화면에 타일이 많으면 많은 타일이 사라집니다. 아래는 위치 (x81 y183) 이후 타일이 그려지지 않은 이미지입니다.
어레이를 채우기 위해 사용되는 코드
그리드상의 벽 타일을두고 타일의 위치는 카메라 위치 사용되는 타일 크기 (32 × 32) 상위 곱 배열 위치의되고public override void Fill(IResourceContainer resourceContainer)
{
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
{
objectGrid[i, j] = new Wall(resourceContainer);
objectGrid[i, j].Parent = this;
objectGrid[i, j].Position = new Vector2(i * TileWidth, j * TileHeight);
}
}
그림을 그릴 때 모든 타일을 반복하여 그립니다. 이것은 Game.Draw 기능
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Yellow);
// TODO: Add your drawing code here
spriteBatch.Begin();
map.Draw(gameTime, spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
map.draw 기능은 기본적으로 각 타일을 그립니다이 함수를 호출에 happends 것입니다. 각 타일에 대한 그리기 호출이 얼마나 많이 발생했는지에 대한 카운터를 두어 보았습니다. 그리기 기능이 40000 번 호출 될 때마다 이는 사용하는 타일의 양입니다. 그것은 그들 모두를 그립니다하지만 난 여전히 화면
public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
{
if (objectGrid[i, j] != null)
{
objectGrid[i, j].Draw(gameTime, spriteBatch);
}
}
}
에 모두 표시되지 않습니다 그래서 이것은 타일을 그리기위한 코드입니다. 현재 이미지가 항상 0이고 GlobalPosition은 타일의 위치 인에서 카메라 위치을 뺀 것입니다.
public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
if (visible)
spriteBatch.Draw(textures[currentImage], GlobalPosition, null, color, 0f, -Center, 1f, SpriteEffects.None, 0f);
}
코드 벽에 사과드립니다. 그것은 모두 나에게 매우 간단하게 보입니다. 그러나 그것이 왜 모든 타일을 그리지 않는지 알 수는 없습니다. 하지 그려진 타일 표시 아직도 16 비트의 다수의 이미지를 그릴 때 monogame 용의 SpriteBatch 여전히 일부 버그 및 오류가
SpriteBatch.Draw 호출에서 -Center는 무엇입니까? – craftworkgames
중심은 스프라이트 크기의 절반입니다. 이는 일반적으로 스프라이트가 왼쪽 상단 위치에서 그려지기 때문입니다. -Center를 사용하면 이미지의 중심이 실제로 위치 자체에 있음을 의미합니다. – M4st3rM1nd
게시 한 코드에서 명백한 버그를 볼 수 없습니다. 어딘가에 있을지도 모릅니다. – craftworkgames