글쎄 그것은 나에게 분명하지 않습니다. 카메라 수업을 사용하고 있습니까? 카메라 클래스를 사용하여 카메라 클래스를 사용하여 세상을 탐색하면이 일은 결코 일어나지 않아야합니다.
내 프로젝트에 현재 사용하고있는 기본 기능은 다음과 같습니다.
class Camera
{
float zoom;
public float Rotation { get; private set; }
public Vector2 Position { get; private set; }
Matrix transform;
int velocity = 60;
UserInput input;
public float Zoom
{
get { return zoom; }
set { zoom = value; if (zoom < 0.1f) zoom = 0.1f; } // Negative zoom will flip image
}
public Camera(UserInput input)
{
zoom = 1.0f;
Rotation = 0f;
Position = new Vector2(0, 0);
this.input = input;
}
public void MoveCam()
{
if (input.IsKeyHold(Keys.Up))
{
Position += new Vector2(0, -velocity);
}
if (input.IsKeyHold(Keys.Left))
{
Position += new Vector2(-velocity, 0);
}
if (input.IsKeyHold(Keys.Down))
{
Position += new Vector2(0, velocity);
}
if (input.IsKeyHold(Keys.Right))
{
Position += new Vector2(velocity, 0);
}
if (input.IsKeyHold(Keys.OemMinus))
{
Zoom -= .01f * Zoom;
}
else if (input.IsKeyHold(Keys.OemPlus))
{
Zoom += .01f * Zoom;
}
}
public void FollowCam(int xPos, int yPos)
{
Position = new Vector2(xPos * TileData.Width, yPos * TileData.Height);
}
public Matrix TransformMatrix(GraphicsDevice device)
{
transform = Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0)) *
Matrix.CreateRotationX(MathHelper.ToRadians(Rotation)) *
Matrix.CreateRotationY(MathHelper.ToRadians(Rotation)) *
Matrix.CreateRotationZ(MathHelper.ToRadians(Rotation)) *
Matrix.CreateScale(new Vector3(zoom, zoom, 0)) *
Matrix.CreateTranslation(new Vector3(device.Viewport.Width * 0.5f, device.Viewport.Height * 0.5f, 0));
return transform;
}
}
메인에서와 같이 클래스를 인스턴스화하고 이것을 그리기 메소드에 사용하십시오.
batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, null, camera.TransformMatrix(graphicsDevice));
batch.End()
이의 SpriteBatch 이내에 세계 모든 그리기와 GUI/HUD 같은 화면 cooridinates에 그리는 새로운 기본을 사용합니다. 카메라 이동 방법을 사용하여 수동으로 이동하고 잠금을 사용하여 모든 위치에서 잠글 수 있습니다 (업데이트 된 경우 따라야 함).
큰지도가있는 경우 필요한 타일 만 렌더링 할 수 있습니다. 나는지도 클래스에서 이것을 좋아한다 :
public void Draw(SpriteBatch batch, Vector2 camPosition, float camZoom, GraphicsDevice device)
{
float top = (camPosition.Y/TileData.Height) - ((device.Viewport.Height/2)/TileData.Height + 1)/camZoom;
float bottom = (camPosition.Y/TileData.Height) + ((device.Viewport.Height/2)/TileData.Height + 2)/camZoom;
float left = (camPosition.X/TileData.Width) - ((device.Viewport.Width/2)/TileData.Width + 1)/camZoom;
float right = (camPosition.X/TileData.Width) + ((device.Viewport.Width/2)/TileData.Width + 2)/camZoom;
for (int y = (int)top; y < (int)bottom; y++)
{
for (int x = (int)left; x < (int)right; x++)
{
if (y >= 0 && y < map.GetLength(1) && x >= 0 && x < map.GetLength(0))
{
batch.Draw(map[x, y].texture, new Rectangle(x * TileData.Width, y * TileData.Height, TileData.Width, TileData.Height), Color.White);
}
}
}
}
먼저, 각 방향에서 어떤 타일을 그려야하는지 알아 낸다. camZoom을 참고하면 축소 할 때 더 많은 타일을 그릴 수 있습니다. 그런 다음이 "경계"를 for 루프에 사용하면 if 문은 존재하지 않는 타일에 액세스하지 못하게합니다 (범위를 벗어남).
Menno가 제안했듯이 카메라에서이를 처리해야합니다. 여기에 쓴 답변을 살펴보십시오. http://stackoverflow.com/questions/12152662/having-the-background-or-camera-scroll-based-on-charcter-position/12167478#comment16291765_12167478 – Cyral