レベルを常にスクロールさせるテストゲームを作成しています。この効果を作成するために、vector2の位置と列挙方向を保存するだけのカメラクラスを確立しました。また、単に移動する位置を固定レートで変更する「移動」するパブリックメソッドも含まれています。次に、描画時にタイルの配列をループするときにこの位置を使用します。これはすべて正常に動作します。
ただし、カメラを移動するには変換行列を使用する必要があり、スプライトバッチを開始するときにこれを指定する必要があると言われました。私は少し混乱していますa。)これがどのように機能するのですか?スプライトバッチが開始されたときにのみそれを与えているかのように、どのように位置を変更し続けることがわかりますか?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前後に落ちました-おそらくレベルがかなり大きいからです。
だから私がやったことは、マトリックスを適用し、更新で移動することです(提案されています)が、描画ではタイルをループするためにカメラ位置を使用します(つまり、左のカウンターを開始し、右のタイルで終了します)。これはすべてうまく機能し、私はそれで満足です:-)
私の新しい問題はプレーヤーにあります。明らかに、レベルではなくカメラを動かしているので、その位置が固定されたままであるため、プレーヤーはカメラに取り残されます。この問題に対する2つの解決策を考えました。1つ目は、プレーヤーを描くときにカメラの位置を単純に考慮することです。つまり、描画機能では、カメラの位置をプレーヤーの位置に追加するだけです。2つ目は、変換のないプレーヤーの新しいスプライトバッチを開始することです。つまり、タイルを描画した後にスプライトバッチを終了し、プレーヤーを描画するときに新しいタイルを開始します。私は両方が機能することを知っていますが、パフォーマンス/優れたコーディングの点でどちらが優れているのかは気にしませんか?バッチを2回起動した場合のパフォーマンスへの影響はわかりませんか?