레벨을 계속 스크롤하고 싶은 테스트 게임을 만들고 있습니다. 이 효과를 만들기 위해 단순히 vector2 위치와 열거 방향을 저장하는 카메라 클래스를 만들었습니다. 또한 고정 된 속도로 위치를 변경하는 '이동'에 대한 공개 방법도 포함되어 있습니다. 그런 다음 그릴 때 타일 배열을 반복 할 때이 위치를 사용합니다. 이 모든 것이 잘 작동합니다.
그러나 변환 매트릭스를 사용하여 카메라를 이동해야하며 스프라이트 배치를 시작할 때이를 제공해야한다는 말을 들었습니다. 나는 약간 혼란 스럽다.) 어떻게 작동합니까? 스프라이트 배치가 시작될 때만주는 것처럼 마치 위치를 계속 바꾸는 것을 어떻게 알 수 있습니까? b.) 타일을 반복 할 때 카메라 위치가 여전히 필요한 이유는 무엇입니까?
현재로서는 작동시킬 수 없지만 작동 방식을 완전히 이해하지 못해 놀라운 것은 아닙니다. 현재 내 시도 (따라 오는 코드)에서 그려진 타일이 변경되어 카메라 위치가 변경되지만 뷰포트의 위치는 변경되지 않습니다 (예 : 카메라 원점). 나는 그것이 어떻게 사용되어야하는지에 대한 조언 / 지침을 정말로 고맙게 생각할 것입니까?
카메라:
class Camera {
// The position of the camera.
public Vector2 Position {
get { return mCameraPosition; }
set { mCameraPosition = value; }
}
Vector2 mCameraPosition;
public Vector2 Origin { get; set; }
public float Zoom { get; set; }
public float Rotation { get; set; }
public ScrollDirection Direction { get; set; }
private Vector2 mScrollSpeed = new Vector2(20, 18);
public Camera() {
Position = Vector2.Zero;
Origin = Vector2.Zero;
Zoom = 1;
Rotation = 0;
}
public Matrix GetTransform() {
return Matrix.CreateTranslation(new Vector3(mCameraPosition, 0.0f)) *
Matrix.CreateRotationZ(Rotation) *
Matrix.CreateScale(Zoom, Zoom, 1.0f) *
Matrix.CreateTranslation(new Vector3(Origin, 0.0f));
}
public void MoveCamera(Level level) {
if (Direction == ScrollDirection.Up)
{
mCameraPosition.Y = MathHelper.Clamp(mCameraPosition.Y - mScrollSpeed.Y, 0, (level.Height * Tile.Height - level.mViewport.Height));
}
}
수평:
public void Update(GameTime gameTime, TouchCollection touchState) {
Camera.MoveCamera(this);
}
public void Draw(SpriteBatch spriteBatch) {
//spriteBatch.Begin();
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, mCamera.GetTransform());
DrawTiles(spriteBatch);
spriteBatch.End();
}
게임-레벨 내에서 드로우를 호출합니다.
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
===================================================== =============================== 편집 :
먼저, 지금까지 도와 주신 공예품 게임에 감사드립니다.
나는 제안을 가지고 놀았습니다. 모든 타일을 그릴 때 fr은 30에서 15로 약 15 수준으로 늘어났습니다. 아마도 레벨이 상당히 크기 때문일 것입니다.
그래서 내가 한 것은 매트릭스를 적용하고 업데이트로 이동하는 것입니다 (제안대로)하지만 그릴 때 카메라 위치를 사용하여 타일을 반복합니다 (즉, 왼쪽의 시작 카운터와 오른쪽 타일의 끝). 이 모든 것이 잘 작동하고 행복합니다 :-)
내 새로운 문제는 플레이어에 있습니다. 분명히 레벨이 아닌 카메라를 움직일 때 플레이어는 위치가 고정 된 채로 캠에 의해 남겨집니다. 이 문제에 대한 두 가지 해결책을 생각했습니다. 첫 번째는 플레이어를 그릴 때 카메라 위치를 단순히 고려하는 것입니다. 즉, 그리기 기능에서 단순히 카메라 위치를 플레이어 위치에 추가하십시오. 두 번째는 변형이없는 플레이어를위한 새로운 스프라이트 배치를 시작하는 것입니다. 즉, 타일을 그린 후 스프라이트 배치를 끝내고 플레이어를 그릴 때 새 타일을 시작하십시오. 둘 다 작동하지만 알고 있지만 성능 / 좋은 코딩 측면에서 더 나은 꼬리를 만들 수는 없습니까? 배치를 두 번 시작하면 성능에 어떤 영향이 있는지 잘 모르겠습니다.