我正在制作一个测试游戏,希望关卡不断滚动。为了创建这种效果,我建立了一个摄像机类,该摄像机类仅存储vector2位置和枚举方向。它还包含一个公共的“移动”方法,该方法仅以固定的速率更改头寸。然后,当我在绘制时遍历我的瓷砖阵列时使用此位置。这一切都很好。
但是,有人告诉我应该使用Transform矩阵来移动相机,并且在启动spritebatch时应该提供此信息。我有点困惑a。)这是如何工作的?好像我只在spritebatch开始时给它一样,它怎么知道要保持位置变化?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);
}
================================================== ==============================编辑:
首先,感谢craftcraftgames到目前为止的帮助。
我听了这个建议。当我绘制所有瓷砖时,fr从30下降到15左右-可能是因为水平相当大。
因此,我要做的就是应用矩阵并进行更新(如建议的那样),但在绘制过程中,我使用相机位置在图块之间进行循环(即,起始计数器在左图块,结束在右图块)。这一切都很好,我对此很满意:-)
我的新问题在于播放器。显然,由于我现在移动的是摄像机而不是水平仪,因此在位置固定的情况下,玩家会被照相机甩在后面。我想到了两个解决方案,第一个是在绘制播放器时简单地考虑摄像机的位置。即在抽奖功能中,只需将摄像机位置添加到播放器位置即可。第二种是为没有转换的播放器启动一个新的精灵批处理。也就是说,在绘制瓷砖后结束spritebatch,然后在绘制播放器时开始一个新的spritebatch。我知道两者都可以,但是我不能在性能/良好编码方面做到最好?我不确定两次启动批处理对性能有何影响?