XNA 4.0'da 2D bir platform oyunu yazıyorum. Oyundaki platformlar eğimli çizgiler. Bu çizgileri Line class'ında tanımladım. Her Line'ın iki ucunu bir Vector2 belirliyor (bilmeyenler için Vector2 v = new Vector2(float, float)). Her şey iyi güzel, sonra oyuna bir kamera ekledim yani oyuncu ekranın kıyılarına geldiğinde kamera ilerleyecek. Daha doğrusu oyuncu duracak, oyuncunun hareket hızıyla platformlar ters yönde ilerleyecek. Yazdığım kamera kodunun prensibi bu. Neyse.
for (int i = 0; i < lineList.Count<Line>(); i++)
{
lineList[i].left -= camMovement;
lineList[i].right -= camMovement;
}
playerpos -= camMovement;
koduyla döngü halinde platformları hareket ettiriyor ve oyuncuyu durduruyorum. Sorun şu ki bir Line'ın iki vektörünü (left ve right) farklı miktarlarda değiştiriyor. Oyuncu hareket ettikçe küçük olan bu fark birikip oyunun saçmalamasına, platformların eğim değiştirmesine sebep oluyor. Bana kalırsa bu iki vektörün ayrı satırlarda değiştirilmesinden kaynaklanıyor, ama emin değilim. Bir yol gösterecek coder sözlükçü var mı ahali?

Bu kadar kısıtlı kod örneğiyle yardımcı olacak varsa helal olsun diyorum.
Bence problem bir yerde farkında olmadan yuvarlanmış bir değer kullanılması.


Evet kod örneğini az verdim ama left ve right'ın ayrı ayrı ele alındığı tek yer burası. Sorun burda olmalı diye düşünüyorum. Tek satırda değiştirmek için camVector diye bi line yaptım:
Line camVector = new Line(camMovement, camMovement);
for (int i = 0; i < lineList.Count<Line>(); i++)
{
lineList[i] -= camVector;
}
Tahmin edebileceğiniz gibi camMovement da bir Vector2. Buradaki sorun da Line classının Vector2 gibi eklenebilir veya çıkarılabilir bir class olmaması. Nasıl o hale getirebilirim bilmiyorum.


left ve right dediğin Vector2 değil mi? X,Y fieldlarını neden kullanmadın? Benim anladığım şöyle bir şey lazım sana: (Oyuncu sağa doğru gidiyor diye tahmin ediyorum)
for(vs)
{
lineList[i].left.X -= camMovement
lineList[i].right.X -= camMovement
}
yanlış mıyım?


@kta camMovement float değil, left ve right gibi o da Vector2. Soruda verdiğim kodda zaten senin dediğin gibi bi şey yaptım yani. Sanırım program üstte söyledğilm gibi ...[i].left'ten camMovement'ı çıkarana kadar camMovement değişiyor, bu nedenle ...[i].right'tan farklı bir değer eksiltiyor. Önceden de dediğim gibi tek satırda halletmem lazım bunu sanırım. Fikri olan?


eleman her yöne gidebiliyorsa da o zaman
lineList[i].left.X -= camMovement.X
dene bi. Direk vektör üzerinde çıkarma işlemi yapınca ne verir bilemedim. Hatta compile bile olmaması lazım diye tahmin ediyorum aslında ama?
not: Line üzerinde addVector2D gibi bir method yazarsan daha kolay olut. İlla line üzernde çıkarma işlemi yapmam gerek diyorsan operator overload yapman lazım.


sorunun dediğiniz sebepten kaynaklanıp kaynaklanmadığını öğrenmek için sırasını değiştirip denediniz mi peki?
lineList[i].right -= camMovement;
lineList[i].left -= camMovement;
yani iki durum için de farklı yönde kayma olması lazım dediğinize göre.
lineList'in boyutu ki sizin oyunda anladığım kadarıyla oyunun background'ı oluyor çok çok büyükse bu dediğiniz olabilir.
xna'de draw method'un update method ile düzgün çalışabilmesi için çeşitli senkron ayarları vardı bildiğim kadarıyla onları da düzgün bir şekilde ayarladığınızdan emin olun.
forums.create.msdn.com
msdn.microsoft.com
draw thread gibi çalıştığından bitmeden tekrar çalışıyor olabilir filan. bu da daha for döngüsündeyken for döngüsünde kullandığı değişkenleri etkileyebilir.


Debug yaptığım bölümde toplam 5 line var ve bu sorun sadece 800*300 noktasında başlayıp 2000*800 noktasında biten line'da gerçekleşiyor. Ki kendisi de bölümdeki en uzun line. Buradan da sorunun line'ın boyutuyla ilgili olduğu ortaya çıkıyor. Sorun tek satırda çıkarma yapmada da değil, çünkü
for (int i = 0; i < lineList.Count<Line>(); i++)
{
lineList[i] = new Line(lineList[i].left - camMovement, lineList[i].right - camMovement);
}
döngüsüyle de değişen bir şey olmadı. Soru çok uzamasın diye burada bitiriyorum, cevap yazanların hepsini yararı oldu, teşekkür ederim.
