Seviyenin sürekli kaydırılmasını istediğim bir test oyunu yapıyorum. Bu efekti oluşturmak için sadece bir vector2 pozisyonu ve bir enum yönü saklayan bir kamera sınıfı oluşturdum. Ayrıca, konumu sabit bir hızda değiştiren 'hareket ettirmek' için genel bir yöntem içerir. Daha sonra çizim yaparken fayans dizimde döngü yaparken bu konumu kullanıyorum. Tüm bunlar iyi çalışıyor.
Ancak, kamerayı hareket ettirmek için bir Transform matrisi kullanmam gerektiği ve spritebatch'ı başlattığımda bunu sağlamam gerektiği söylendi. Biraz kafam karıştı.) Nasıl çalışır? sanki sadece spritebatch başladığında veriyorum pozisyon değiştirmeyi nasıl bilebilir? b.) Fayanslarda dolaşırken neden kamera pozisyonuna hala ihtiyacım olduğu gibi?
Şu anda işe yarayamıyorum, ama bunun nasıl çalıştığını tam olarak anlamadığım için sürpriz değil. Şu anda denememde (takip edilecek kod) çizilen karolar değişiyor, bu da kameraların konumunun değiştiği anlamına geliyor, ancak görünümün konumu değişmeden kalıyor (yani kamera orijininde). Gerçekten nasıl kullanılması gerektiği konusunda bazı tavsiye / rehberlik takdir ediyorum?
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));
}
}
Seviye:
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();
}
Oyun - sadece beraberlik seviyesi içinde çağırır:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== DÜZENLEME:
Öncelikle, şimdiye kadarki yardımlarınız için el sanatları oyunlarına teşekkür ederiz.
Öneri ile oynadım. Tüm karoları çizdiğimde, fr 30'dan 15'e kadar tanklandı - muhtemelen seviyeler oldukça büyük.
Yaptığım şey matrisi uygulamak ve güncellemede (önerildiği gibi) hareket etmektir, ancak çizimde kameraların döşemeleri arasında döngü yapmak için kullanıyorum (yani soldaki sayacı başlat ve sağ döşemede son). Her şey iyi çalışıyor ve bundan memnunum :-)
Yeni sayım oyuncuda. Görünüşe göre şimdi seviyeden ziyade kamerayı hareket ettirdiğimde, oyuncu pozisyonu sabit kalırken kamera tarafından geride bırakılıyor. Bu soruna iki çözüm düşündüm, birincisi, oynatıcıyı çizerken kameraların konumunu düşünmektir. Yani, çizim işlevinde kamera konumunu oynatıcı konumuna eklemeniz yeterlidir. İkincisi, dönüşümü olmayan oyuncu için yeni bir sprite partisi başlatmak. fayansları çizdikten sonra komut satırını sonlandırın, ardından oynatıcıyı çizerken yeni bir tane başlatın. İkisinin de işe yarayacağını biliyorum, ancak performans / iyi kodlama açısından daha iyi olacak kuyrukların başlarını yapamıyorum? Partiyi iki kez başlatmaktan kaynaklanan performans etkilerinin ne olduğundan emin değilim?