2d kiremit tabanlı bir oyunda kaydırma için iyi bir yöntem nedir?


9

Fayans ekrana çizmek için D3DXSPRITE sarıcı ile Direct3D kullanıyorum. Çarpışma ve döşeme türü gibi üyeler içeren bir döşeme sınıfı var, sonra fayans örneğin bir dizi var

Karo ızgarası [256] [256];

Hangisi daha iyi bir yöntem olurdu?

Ekranın ortasındaki oynatıcı çizin ve haritanın çizdiği yer ofset.

- Aşağıdaki kamera ile oynatıcıyı hareket ettirin.

İlk yöntemi kullanıyordum, ancak haritanın sol üst kenarına geldiğinizde ve diğer oyuncular / düşmanlar haritadayken ve aynı zamanda hareket ederken gerçekten karmaşıklaşıyor

kamerayı oynatıcıyı takip ettirirsem, sadece bir kaç ekrana sığabilse bile her bir ızgara döşemesi için spriteBatch-> Draw (...) 'i çağırmak zorunda mıyım?

Yanıtlar:


4

Tüm güncellemeleri ve hesaplamaları "gerçek", dünya birimlerinde yapmak ve kamerayı hareket ettirmek en iyisidir. SpriteBatch'ınız kendiliğinden kaldırma gerçekleştirebilir, ancak çok yavaşsa ekranda hangi döşemelerin görüntülenmesi gerektiğini belirlemeye çalışabilir ve yalnızca bunları çizebilirsiniz.


Muhtemelen sadece görünür olan spriteları çizmek için kod yazmak isteyeceksiniz, özellikle de ızgara boyutunuzu artırmanız gerektiğini fark ederseniz.

2

Kamerayı dünya koordinatlarında hareket ettirmek ve karakterinizin dünya çapında hareket etmesini sağlamak, bu soruna yaklaşmanın en kolay yoludur, dünya koordinatlarında çalışmak, bir göreceli koordinatlar sistemi ve aynı zamanda dünya koordinatlarında nerede olduklarını anlar.

2D'de çalıştığınız için başka bir iyi ipucu, sanal bir dünya ızgara sistemi oluşturmak için en kolay yolun bazı uzamsal bölümleme yapmaktır, bu, her bir döşemeyi spriteları ve diğer kaynakları her döşemeye göre ilişkilendirerek tek tek yönetmenize izin verecektir. özünde süreç şöyle olacaktır:

  • döşeme için sınır koordinatlarını ve belirli döşemenin ihtiyaç duyabileceği kaynakları (spritelar, düşmanlar, vb.) tutabilen bir döşeme sınıfı oluşturun.

  • dünyanızın büyüklüğüne karar verin ve tüm ilgili kaynaklarıyla dünyanızın bir kısmını temsil eden her biri bir 2B dizi (bir boyut kullanabilir ve 2B olarak erişebilirsiniz) döşemeleri oluşturun.

  • sadece oyuncunun bulunduğu döşemeden ve komşularından kaynaklar çekin.

Bir ızgara ile, oyuncunun ızgara başlangıcına göre konumuna göre hangi döşemede olduğunu kolayca bulabilirsiniz.

Kamera hakkında bahsettiğiniz problemi çözmek için, oynatıcıyı ve kamerayı, kameranın kenar döşemelerinin merkezinden başka bir yere gitmeyeceği iki bağımsız sistem yapmanız gerekir, böylece oyuncu o karoya seyahat ettiğinde hala tüm karoları dünya koordinatlarına bağlı (yani artık ekranda ortalamıyor), ancak kamera kilitli.


0

Bir yüzey kullanıyorum. Tüm dünyayı ekran dışı bir yüzeyde oluşturuyorum ve x ve y koordinatlarını koruyorum. Bunları oynatıcı hareket ettikçe değiştiriyorum ve her kare x ve y kullanarak yüzeyden backbuffer'a 1028 x 768 dikdörtgen çiziyor.

diğer insanlara gelince onlara bir x ve y veriyorum ve istedikleri gibi dünyanın etrafında hareket etmelerine izin veriyorum, çizerken x ve y'in 1028 x 768 dikdörtgeninde olup olmadığını kontrol ediyorum ve eğer çiziyorsanız .

Oynatıcıyı ekranın ortasında tutuyorum ve dünyanın kenarının ekranın kenarına ulaşıp ulaşmadığını kontrol ediyorum. Bu durumda oyuncu ekranın etrafında dünyanın kenarına ve tekrar merkeze doğru hareket eder, sonra dünya tekrar hareket etmeye başlar. zor görünüyor ve beni biraz zaman aldı ama yapmak kötü değil.

64 x 64 karo kullanıyorum ve şimdiye kadar kullandığım en büyük dünya 50 x 60 karo.

Bu c ++ ile doğrudan x yapılır


1
Bu büyük bir bellek domuz gibi görünüyor. Tüm dünyayı bir ekranın dışına çizmek, dünyanız için birden çok (animasyonlu) katmana sahip olmak ve onu şu anda sahip olduğunuzdan daha fazla genişletmek gibi şeyler yapmaya başladığınızda sizi hafıza sorunlarına sürükleyecektir. Dünya hakkında bilgi tutmak ve sadece çizilmesi gereken parçaları / nesneleri çizmek çok daha iyi olur. Sadece 2 sentim. :)
Richard Marskell - Drackir

@Drackir Sanırım yanlış anladın. sadece dünya ekrandan çekilir, diğer insanlar gibi şeyler ihtiyaç duyulduğunda destek arabelleğinde izlenir ve çekilir. ayrıca kendimi 70 x 70'ten fazla dünya yaptığını görmüyorum. Dünya demek istediğim alan dediğimde, bu bir zindan ya da evin içi bir kasaba olabilir, oyuncu aralarında hareket ettiğinde ekran dışı yüzey yeniden yapılandırılır. evet bellek alır ama modern terrabite sürücülerde 2d fayans ihmal edilebilir hale getirir ve birkaç saniye yükleme düzgün kaydırma ve animasyon için ödemek için küçük bir fiyattır. ama evet daha iyi ve daha zor yollar var :)
Skeith

Yüzey, sabit sürücüde değil GFX kart belleğinde saklanmalıdır. Bununla birlikte, GFX kart belleği çok büyükse, yüzeyleri HD'ye taşıyacaktır, bu da işleri oldukça yavaşlatacaktır. Kuşkusuz, bu şeylerle uğraştığımdan beri bir süre geçti, bu yüzden tam olarak nasıl çalıştığını hatırlamıyorum, ama sanırım çok büyük bir dünya çizmediğiniz sürece sorun olmaz. :)
Richard Marskell - Drackir

@Drackir Bunu bilmek ilginç, hiç böyle düşünmemiştim. Bu şekilde bana dinamik olarak yeni fayanslar çizdiğimde, bu yüzden tamam olduğunu düşünüyorum ama buna bakmak zorunda olduğum için daha yumuşak bir kaydırma verdiğini buldum.
15'te Skeith

Haritaları 31x31 olan bir oyun üzerinde çalışıyordum ama yan yana bağlandılar. Başkasının motorundan çalışmaya çalışıyordum ve oyuncunun bulunduğu haritayı çevreliyorlardı; yani toplam dokuz harita. Her haritanın birkaç (bence 6) katmanı vardı. Yani 31x31x9x6 = 51894 kiremitler, kullanıcı haritaları her değiştirdiğinde çizilir (maks. Elbette; tüm döşemeler doluydu). Bu benim için büyük bir yavaşlama oldu, bu yüzden çizim rutinini sadece oyuncuyu çevreleyen karoları ekranın kenarından 1 karo kadar uzağa çekmek için yeniden yazdım (hareket ederken kısmi karoları işlemek için).
Richard Marskell - Drackir

0

Kodun kiremitli bir dünyanın köşelerinde, hangi çizilmeye çalışılırken ve aynı zamanda kameranın 'dünya dışı' gitmemesini sağlamak için biraz acı çekmesi normaldir. Bu uç durumlar temelde ekran resminden daha büyük bir 2D kiremit tabanlı dünya uygulama konusunda en zorlayıcı şeydir. Yakınlaştırmayı ve imlece yakınlaştırmayı desteklerseniz çok daha karmaşık hale gelir: D

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.