AABB çarpışma çözünürlüğü ile ilgili bir sorunum var.
AABB kesişimini önce X eksenini, sonra Y eksenini çözerek çözerim. Bu, bu hatayı önlemek için yapılır: http://i.stack.imgur.com/NLg4j.png
Bir nesne oynatıcıya taşındığında ve oynatıcının yatay olarak itilmesi gerektiğinde mevcut yöntem iyi çalışır. .Gif'te gördüğünüz gibi, yatay çiviler oynatıcıyı doğru şekilde itiyor.
Ancak dikey çiviler oynatıcıya girdiğinde, ilk önce X ekseni hala çözülür. Bu "çivileri asansör olarak kullanmak" imkansız kılar.
Oynatıcı dikey ani hareket ettiğinde (yerçekiminden etkilenir, içine düşer), Y eksenine itilir çünkü başlangıçta X ekseninde üst üste binme yoktur.
Denedim bir şey bu bağlantının ilk cevabında açıklanan yöntem oldu: 2D dikdörtgen nesne çarpışma algılama
Bununla birlikte, sivri uçlar ve hareket eden nesneler, hızlarını değil konumlarını değiştirerek hareket ederler ve Update () yöntemi çağrılana kadar bir sonraki öngörülen konumlarını hesaplamam. Tabii ki bu çözüm de işe yaramadı. :(
AABB çarpışmasını yukarıda açıklanan durumların her ikisinin de amaçlandığı şekilde çalışacağı şekilde çözmem gerekiyor.
Bu benim şu anki çarpışma kaynak kodum: http://pastebin.com/MiCi3nA1
Buna birileri bakarsa çok minnettar olurum, çünkü bu hata motorda baştan beri mevcuttu ve başarılı bir çözüm bulmak için iyi bir çözüm bulmakta zorlanıyorum. Bu ciddi bir şekilde beni geceleri çarpışma koduna bakarak geçirmeme ve "eğlenceli kısma" girmeme ve oyun mantığını kodlamama engelliyor :(
XNA AppHub platform demo'sunda olduğu gibi aynı çarpışma sistemini uygulamaya çalıştım (malzemelerin çoğunu kopyalayıp yapıştırarak). Ancak, "atlama" hatası benim oyunumda meydana gelirken, AppHub demosunda gerçekleşmez. [atlama hatası: http://i.stack.imgur.com/NLg4j.png ]
Atlamak için oyuncunun "onGround" olup olmadığını kontrol et, sonra Velocity.Y'ye -5 ekle.
Oyuncunun Velocity.X'i Velocity.Y'den daha yüksek olduğundan (şemadaki dördüncü panele bakın), onGround, olması gerekmediğinde true olarak ayarlanır ve böylece oyuncunun havada zıplamasını sağlar.
Bunun AppHub demosunda olmayacağına inanıyorum, çünkü oyuncunun Velocity.X'i asla Velocity.Y'den daha yüksek olmayacak, ama hatalı olabilirim.
Bunu önce X ekseninde, sonra Y ekseninde çözerek çözdüm. Ama bu yukarıda belirttiğim gibi sivri uçlarla çarpışmayı berbat ediyor.