Saya membuat game uji di mana saya ingin levelnya terus bergulir. Untuk membuat efek ini, saya telah membuat kelas kamera yang hanya menyimpan posisi vektor2 dan arah enum. Ini juga berisi metode publik untuk 'bergerak' yang hanya mengubah posisi pada tingkat yang tetap. Saya kemudian menggunakan posisi ini ketika memutar melalui array ubin saya saat menggambar. Ini semua berfungsi dengan baik.
Namun, saya telah diberitahu bahwa saya harus menggunakan matriks Transform untuk menggerakkan kamera, dan bahwa saya harus menyediakan ini ketika saya memulai spritebatch. Saya agak bingung a.) Bagaimana cara kerjanya? seolah-olah saya hanya memberikannya ketika spritebatch dimulai, bagaimana ia tahu untuk terus mengubah posisi? b.) Mengapa melakukannya karena saya masih memerlukan posisi kamera ketika saya melewati ubin?
Saat ini saya tidak bisa membuatnya bekerja, tetapi itu tidak mengejutkan karena saya tidak sepenuhnya mengerti bagaimana ini dimaksudkan untuk bekerja. Saat ini dalam upaya saya (kode untuk mengikuti) ubin ditarik perubahan yang berarti posisi kamera berubah, tetapi posisi viewport tetap tidak berubah (yaitu pada asal kamera). Saya akan sangat menghargai beberapa saran / bimbingan tentang bagaimana seharusnya digunakan?
Kamera:
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));
}
}
Tingkat:
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();
}
Game - cukup panggil undian dalam level:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== Edit:
Pertama, terima kasih craftworkgames atas bantuan Anda sejauh ini.
Saya bermain-main dengan saran itu. Ketika saya benar-benar menggambar semua ubin, fr memangkas sekitar 15 dari 30 - mungkin karena levelnya cukup besar.
Jadi apa yang telah saya lakukan adalah menerapkan matriks dan bergerak dalam pembaruan (seperti yang disarankan) tetapi dalam menggambar saya menggunakan posisi kamera untuk perulangan melalui ubin (yaitu mulai counter di kiri dan berakhir di ubin kanan). Ini semua bekerja dengan baik dan saya senang dengan itu :-)
Masalah baru saya terletak pada pemain. Jelas karena saya sekarang memindahkan kamera daripada level, pemain akan tertinggal oleh kamera saat posisinya tetap. Saya telah memikirkan dua solusi untuk masalah ini, yang pertama adalah hanya mempertimbangkan posisi kamera saat menggambar pemain. Yaitu di fungsi undian cukup menambahkan posisi kamera ke posisi pemain. Yang kedua adalah memulai batch sprite baru untuk pemain yang tidak memiliki transformasi. yaitu mengakhiri spritebatch setelah menggambar ubin lalu mulai yang baru saat menggambar pemain. Saya tahu keduanya akan bekerja, tetapi saya tidak bisa membuat kepala yang lebih baik dalam hal kinerja / pengkodean yang baik? Saya tidak yakin apa implikasi kinerja dari memulai batch dua kali?