Yukarı Aşağı RPG Hareketi Düzeltme ile mi?


27

Umarım hepimiz Zelda: Geçmişe Bir Bağlantı oynamış oluruz, lütfen hatalıysam beni düzeltin, ancak bu tür 2D, yukarıdan aşağıya karakter hareketini düzeltme dokunuşuyla taklit etmek istiyorum. Diğer oyunlarda yapıldı, ancak bu referansın en kolay ilgili olacağı kanısındayım. Daha spesifik olarak, bahsettiğim hareket ve düzeltme türü:

  • Yüzen hareket, Pokemon ve hareket pedinin bir dokunuşunun sizi kardinal yönde bir kare hareket ettirdiği diğer oyunlar gibi karo temelli hareketlerle sınırlı değildir. Bu yüzer hareket, köşegen hareket elde edebilmelidir.
  • Batıya doğru yürürseniz ve Kuzey Doğu / Güney Batı tarzında köşegen bir duvara gelirseniz, denetleyicide sola (Batı) soldan devam etseniz bile Güney Batı hareketi ile düzeltilirsiniz. Bu, her iki yönde de düzeltme yapan iki diyagonal için çalışmalıdır.
  • Meydanda bir kapı veya koridorda yürümekten birkaç piksel uzaktaysanız, koridorda veya koridorda yürürken düzeltilir, yani köşeye çarpmak salona / kapıya itmenize neden olur.

Bunu başarmanın etkili yollarını aradım ve şansım olmadı. Açıkçası, NPC'nin hareketinden değil insan karakterinin hareketinden bahsediyorum. Kaynakları bu tür bir hareket için mevcut mu? Bir wiki veya başka bir şeyde açıklanan denklemler veya algoritmalar?

XNA Çerçevesini kullanıyorum, içinde yardımcı olacak bir şey var mı?

Yanıtlar:


23

İlk kurşun noktası kolay. Fayansa dayalı koordinatlar yerine karakterin konumunu dünya veya piksel koordinatlarında saklar ve değiştirirsiniz. Bununla ilgili bir sorun yaşıyorsanız, bunun dünyanız ve kiremit alanınız için kafa karıştırıcı bir temsil seçiminden kaynaklanıyor olabilir, bu yüzden belki bunun hakkında daha fazla ayrıntı göndermelisiniz / ayrı, özel bir soru sormalısınız.

İkinci nokta için, en doğrudan yaklaşım oyuncunun (normalize edilmiş) hareket vektörünü alıp onu duvarın normal vektörüne eklemek, sonra yeniden normalleştirmek olacaktır. Ortaya çıkan vektörün bileşenlerinin işareti duvarın oyuncunun hareketi ile nasıl ilişkili olduğunu gösterirken, vektörün kendisi oyuncunun şimdi hangi yönde hareket edebileceğini gösterir.

Üçüncü nokta için, hem duvar hem de oyuncu için çarpışma dikdörtgenleri olduğunu varsayarak, oyuncunun çarpma dikdörtgeninin duvarın çarpma dikdörtgeni ile ne kadar temas ettiğini belirleyebilmelisiniz. Örneğin, oynatıcı sağa doğru hareket ediyorsa ve dikey bir duvara çarpıyorsa, çarpışma dikdörtgenlerinin Y ekseni uzantılarını karşılaştırırsınız - eğer oyuncunun kapsamı duvarın ölçüsünü bir eşik değeri aşarsa, oyuncunun Y'sinin% 75'ini söyleyin Eksen ölçüsünde, oyuncuyu kapıya doğru "hile yaparsınız".

Burada, nesne modelinizin kodunuzda nasıl göründüğü ve seçtiğiniz teknikleri - büyük ölçüde sorunuzun genelliğinden dolayı çok sayıda varsayımda bulundum. Aynı nedenden dolayı basit (belki de en uygun olmasa da) yaklaşımlar önermeye çalıştım. Bu soruda veya yeni bir soruda daha spesifik bilgiler sağlayabiliyorsanız, daha fazla ayrıntı veya daha iyi bir fikir sunmayı deneyebilirim.


Evet, karakterin etrafında dolaşmak sorun değildi. İnsanların bunun bir gereklilik olduğunu görmesini sağlamak. Bana kilit cevabı verdin: Vektörleri olan fayans! Bunu düşünmediğime inanamıyorum. Teşekkür ederim.
Corey Ogburn,

Zelda'da olabilecek tek bir açı vardı, bu yüzden normal vektörleri hesaplamaya gerek yoktu, kodda sadece özel bir durum vardı.
BlueRaja - Danny Pflughoeft

Bir karoya nasıl vektör verdiğini anlamıyorum. Bu nasıl görünürdü?
test

Bir döşemenin halihazırda grafiği gibi, geçirilebilir olsun veya olmasın, vs. gibi verileri vardır, bu sadece başka bir alandır. Örneğin: struct Tile {vector2 normal; ...} Normalin değeri, karoyu tanımlayan verilerle gelmelidir
Josh,

@JoshPetrie Bu Revisting. Birden çok yönde çarpışan bir döşemenin birden fazla vektöre sahip olması gerekmez mi? Bir döşemenin nasıl tek bir vektöre sahip olabileceğini anladığımdan emin değilim.
test

4

İkinci nokta için olası bir cevap, oyuncunun hareket vektörünü bir nokta ürünü kullanarak duvar vektörü boyunca yansıtmaktır (ab * normalize (b)). Daha sonra, oynatıcıyı duvar yönünde ne kadar hareket ettireceğinizi söyleyen bir vektör elde edersiniz ve eğer oynatıcıyı bu vektör ile hareket ettirirseniz, duvar boyunca bir 'kayma' elde edersiniz. Önceki bir oyun projesinde benim için iyi çalıştı.


3

Josh için harika bir cevap, ancak birkaç öneri ekleyeceğim: - Duvarlara kayma hakkında daha fazla bilgi için sorumu kontrol edin - bu cevabın içinden gerçekten güzel çalışmayı başardım. - Yanılmıyorsam, ekran yukarı yürürken Link en yakın tüm yatay ızgara karesine hizalanmayı kolaylaştıracaktır. Bu sayede kapılara ulaştığınızda, düzgün bir şekilde dizilmiş olmanız daha olasıdır (yanlış olabilir). - Kapıdan geçmeyi kolaylaştırmak için, karakterinizin çarpışma kutusunun kapının genişliğinden çok daha küçük olduğundan emin olun.


Veya çarpışma kutusu belki de bir daire mi?
Oskar Duveborn,

2

Giriş kapısının düzeltilmesi için, kapının çarpışma nesnesini kapının görüntüsünden biraz daha büyük yapabilirsiniz. Bu, Josh tarafından önerilen aynı etkiye yol açar, ancak duvarın çarpışma dikdörtgenine yakınlığını hesaplamak zorunda kalmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.