2D Oyun için Harita Oluşturmanın En İyi Yolu?


16

Özgün "en iyi" anahtar kelime için özür dilerim.

Arkadaşım ve ben bir 2D macera oyunu yaratmaya başladık. Pokemon veya zelda tarzında yukarıdan aşağıya doğru olacak (sadece perspektif). Oyuncumuzun makinemizin bellek yeteneklerini zorlamadan geçebileceği büyük bir dünya haritası oluşturma yöntemlerini tartışıyoruz.

İlk itici gücümüz, büyük bir harita ve içeriğin yükleneceği oynatıcı etrafında bir daire oluşturmaktı. Bunun uzun sürmeyeceğini düşündük ve haritayı bölümlere ayırmaya karar verdik. İlk olarak dört büyük bölümümüz vardı, ancak bunu birçok küçük bölüme ayırabileceğimizi fark ettim.

SNES'den bazı Zelda oynadım ve bir haritanın kaydırılması sırasında içeriğin o zaman yüklenebileceğini gördüm. Demek istediğim, sadece verilerin yüklenmesi için dikdörtgen bir alanı kontrol etmek yerine, haritayı harita bölümünden harita bölümüne geçerken verileri yükleyen ve yükünü kaldıran birçok küçük parçaya ayırıyoruz.

Bugün, oyundaki her ızgara hakkında veri içeren basit bir 2D dizi haritası [WIDTH] [HEIGHT] oluşturmak istediğini ve ihtiyaç duymadığımız veriler için sürekli bir diske kaydet işlemi olduğunu söyledi.

Bu fikirlerden emin değilim ve burada olabileceğimi düşündüm. Konuyla ilgili herhangi bir bağlantı, kaynak veya öğretici ve bunun nasıl verimli bir şekilde yapılacağı ile ilgili sorumuza doğrudan cevaplar çok takdir edilecektir.


Hangi makineyi kullanıyorsunuz?
David Titarenco

Şimdiye kadar SFML kullanan C ++ ile Windows (SFML değişebilir; C ++ değişmez). Taşınabilirlik atmını hedeflemiyoruz.
IAE

2
NES'de eski okul Zelda için gidiyorsanız, sadece 1 ekranlı haritalar kullanılır. Küçük haritalar oyuncuların niyetlerinin kapsamına odaklanmalarına yardımcı olur (örn. Bir zindanda, sadece odanızla ilgileniyorsunuz. Diablo'da canavarlar zeminde yukarı ve aşağı hareket etmediler) ve tüm alanı aradılarsa tamamlanmalarını hissetmelerine izin verin FAllout3 ve Oblivion gibi açık alan oyunları size vermiyor.
Stephen Furlani

Yanıtlar:


27

Öncelikle, harita boyutunuzu tahmin edin. Sadece "büyük bir dünya" nın belleğe sığmayacağını düşünmeyin. Günümüzde, bellekte 10 mb alan bir harita kesinlikle kabul edilebilir ve basit bir çini tabanlı 2D dünyada 10 mb'de LOT doldurabilirsiniz.

Eğer bir varsa gerçekten büyük bir dünya, en sağlam çözüm aslında kullanım haritası parçaları olduğunu. Dünyanızı sabit boyutlu parçalara ayırın (örneğin, 64x64). Oyuncu hareket ettikçe parçaları anında yükleyin, en az bir parça her yöne yüklü tutun (yani, oynatıcının içindeki parçayı ve tüm komşularını yükleyin).

Boşaltma parçaları gelince, birkaç strateji arasından seçim yapabilirsiniz. Hevesli bir şekilde boşaltma, oyuncunun yeterince uzaklaştığı anda tüm parçaları boşaltıp diske kaydettiğiniz anlamına gelir; ancak performansı artırmak için boşaltma işlemini geciktirebilirsiniz (herhangi bir disk erişimi olduğu için yığından tasarruf etmek maliyetli bir işlemdir).


6
Bazı açıklayıcı matematik: 10MB Tile * s, her tarafta 1619 karo içeren bir kare alır. Orijinal Zelda haritaları uzun tarafta 256 taş ve kısa taraftakinin yarısından azdı - bu nedenle haritanız bu bellek kullanımı ile ilk Zelda'dan 36x daha büyük olabilir. Gerçekten bu kadar çok içerik hazırlamaya hazır mısınız ? (Hayır)

@ user744 Bu yorum inanılmaz derecede yanıltıcı. Bir harita oluşturmak için fayans işaretçilerinden daha fazlasına ihtiyacınız vardır. Döşemelerin içerdiği verileri de depolamanız gerekir. Her 2B oyunun önceden belirlenmiş miktarda sabit karoları yoktur.
Jeroen

5

Şahsen, haritayı TileEd gibi belirlenmiş bir döşeme editörü kullanarak inşa ederdim . Bu yaklaşım birkaç fayda sağlar:

  • Daha az kaynak kullanır. Potansiyel olarak sonsuz bir harita oluşturmak için dizinler içeren bir döşeme sayfası ve veri dosyası yüklemeniz yeterlidir.
  • Haritanızı gerçekten küçük parçalara ayıracağınızdan (döşeme boyutunuza bağlı olarak), karakter dünya üzerinde hareket ederken kolayca satır / sütun ekleyebilir / kaldırabilirsiniz.
  • Haritanızı açıklayan bir veri dosyasına sahip olmak, arazi bilgilerini de kolayca eklemenizi sağlar. Bu, duvarlar veya göller (yani engeller) veya karakterin hareketinin yavaşlayabileceği bir bataklık gibi farklı karo türlerine izin verir ...
  • Son olarak, döşemeye dayalı bir haritayı düzenlemek ve daha sonra değiştirmek çok daha kolaydır çünkü düzenleyiciyi her zaman tetikleyebilir, bazı şeyleri değiştirebilir ve yeni bir veri dosyası kaydedebilirsiniz.

Gecikmeyi önlemek için oyun sırasında haritanın bitlerini yüklemekten kaçınmanızı öneririm. Daha önce de belirtildiği gibi, döşeme sayfasını bellekte tutabileceğiniz için bu gerekli olmamalıdır. Karakter "dünyanın" başka bir bölümüne girdiğinde, fayans sayfasını farklı bir tanesiyle değiştirebilirsiniz (örneğin, çöl fayanslarıyla değiştirilen kar karoları).

Karoları ekrana bölmek muhtemelen haritanızı oluşturmanın en hızlı yoludur. SFML bilmiyorum, ancak sitelerindeki dokümanlardan Spritesınıfa bakmalı veya sınıfın Copyişlevini kullanmalısınız Image.

Güncelleme: SFML belgelerinden bazılarını okudum ve performans için görüntüleri kesinlikle kullanmak Drawableveya değiştirmek Spriteyerine kullanmalısınız . Görünüşe göre orada bir döşenmiş SFML yükleyici var. Muhtemelen bir şeyi hızlı bir şekilde kurup çalıştırmak için iyi bir yoldur.


1

Haritayı, oyunun anlatmasını istediğiniz hikayeyi anlatmak için gereken boyutta yaparak başlayın. İnsanların oyununuzu oynaması için gereken minimum spesifikasyonla makinede test edin. Çok yavaşsa profil oluşturun ve optimize edin.



-3

Ultima-online'ı (Fallout 3 veya Oblivion) ​​yeniden oluşturmayı planlamıyorsanız, dünyanın kesintisiz olması için bir neden yok. Baldur Kapısı ve Icewind Dale, oyundan uzaklaşmayan etkili haritalar uygulayan iki oyun.

Verilmiş, onlardan daha fazla bilgi işlem beygir gücüne sahipsiniz, bu yüzden yükleme ekranları minimum olmalı, ancak Fallout ve Oblivion bile bazı şeyler için yükleme ekranlarına sahip.

Sana söyleyebileceğim tek şey, benim için 32x32 fayans seti alan ve bir NSImage içine çeken iPhone için küçük bir Obj-C lib yazıyorum. Bu şekilde yaklaşık 10 fps alıyorum ve muhtemelen OpenGL kullanmalıyım, ancak sadece karakter rektiften çıkarsa yeniden çizmem gerekiyor.

Haritayı 9 ekran boyutuna bölmelisiniz (benim için 960x640 blok), bu yüzden karakter orta bloktan çıkarsa, 9 ekranları büyük bir görüntüye (yaklaşık 1.2 MB - çok fazla iPhone 3G'de 20 MB sınırının altındaki oda). Bu oldukça yavaş gerçekleşir (10 fps'den çok daha yavaş), bu nedenle yeniden çizim oyun sırasında fark edilmez.

Muhtemelen bir noktada OpenGL ES'ye geçeceğim, ancak şimdilik iyi çalışıyor.


[DÜZENLE]

Açıklığa kavuşturmama izin ver.

9 ekranlı arka plan için çizim algoritması 0,1 saniye sürer (10 fps düz çıkış). Oynatıcınız tüm ekranı bir saniyenin onda birinden daha kısa bir sürede geçemezse, yeniden çizim oynatma sırasında algılanamaz olmalıdır.


10Fps'nin oyununuz için kabul edilebilir olması, özellikle iPhone gibi güç kısıtlamaları olan bir cihazda bunu iyi bir fikir haline getirmiyor. Sıfır yeniden çizme yapıyor olabilirsiniz, GPU tarafının rasterleştirme işlemine izin vermiş olabilirsiniz ve aslında programın uyku için biraz zaman harcamasına izin verebilirsiniz, böylece telefon ısınmaz veya pil ömründen tükenmez.

@Joe Wreschnig ... ??? Oyuncu ekranı hareket ettirdiğinde talep üzerine çektiğini söyledim, aksi takdirde UIImageView için arka plan görüntüsü yeniden çizilmez , böylece işlem gücünden tasarruf edilir. Yorumunuz bir anlam ifade etmiyor.
Stephen Furlani

Oyununuzun gerektirdiği fps hakkında bir iddiada bulunmuyorum. Diyorum ki, OpenGL böyle bir şey için 60 fps sağlayabilir (gerçekten, statik sahneler ve OpenGL ile "yeniden çizim" hakkında bile konuşmuyorsunuz) - sadece 10 fps'ye ihtiyacınız varsa, OpenGL'yi kullanmak için pil gücünü boşa harcamamanıza izin verir diğer "50 kare". Çizim yönteminiz GPU hızlandırmalı bir dünyada israftır. Bir PC'de muhtemelen sorun yok, ancak bir pili boşaltırken değil.

@Joe, ne dediğini hala bilmiyorum. Bir görüntü çizer. Ardından, oyuncu bir sınıra ulaşıncaya kadar görüntü yalnız bırakılır ve ardından yeni bir görüntü yeniden çizilir. Bu pil ömrünü nasıl boşa harcıyor? Yalnızca istek üzerine "çizer" ve kalan süre UIImageView'ın yerel çizim algoritması kullanılarak çizilir.
Stephen Furlani
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.