Bir shmup seviyesi nasıl saklanır?


12

Bir 2D shmup geliştiriyorum (yani Aero Fighters ) ve bir seviyeyi depolamanın çeşitli yollarının neler olduğunu merak ediyordum. Düşmanların kendi xml dosyalarında tanımlandığını varsayarsak, bir düşman seviye atladığında nasıl tanımlarsınız?

Zamana dayanır mı? Güncellemeler? Mesafe?

Şu anda bunu "seviye zaman" (seviye çalışıyor - duraklatma zaman güncellemez) miktarına göre yaparım. İşte bir örnek (serileştirme XNA tarafından yapılmıştır):

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:level="pekalicious.xanor.XanorContentShared.content.level">
  <Asset Type="level:Level">
    <Enemies>
      <Enemy>
        <EnemyType>data/enemies/smallenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>60</NumberOfSpawns>
        <SpawnOffset>PT0.2S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT20S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/boss1</EnemyType>
        <SpawnTime>PT30S</SpawnTime>
        <NumberOfSpawns>1</NumberOfSpawns>
        <SpawnOffset>PT0S</SpawnOffset>
      </Enemy>
    </Enemies>
  </Asset>
</XnaContent>

Her Düşman öğesi temel olarak belirli düşman türlerinin bir dalgasıdır. Tür EnemyType'ta tanımlanırken SpawnTime, bu dalganın görünmesi gereken "düzey zamanı" dır. NumberOfSpawns ve SpawnOffset, ortaya çıkacak düşman sayısı ve her bir yumurtlama arasında geçen süredir.

Bu iyi bir fikir olabilir ya da daha iyi olanlar olabilir. Emin değilim. Bazı fikir ve fikirleri görmek istiyorum.

Bu konuda iki problemim var: bir düşmanı doğru şekilde yumurtlamak ve seviye editörü yaratmak. Seviye editörü şey tamamen farklı bir sorundur (muhtemelen gelecekte yayınlayacağım: P).

Doğru yumurtlama gelince, sorun değişken bir güncelleme zamanım olduğu gerçeğinde yatıyor ve bu yüzden spawn ofseti çok küçük olduğu için ya da güncelleme biraz daha uzun sürdüğü için bir düşman yumurtasını kaçırmamaya dikkat etmeliyim. . Çoğunlukla bunu düzelttim, ama bana göre sorun seviyeyi nasıl sakladığımla ilgili.

Peki, herhangi bir fikir? Yorumlar?

Şimdiden teşekkür ederim.

Yanıtlar:


4

Bunu yapmanın bir yolu, yumurtlamayı zamanında değil, seyahat edilen yatay mesafeye dayandırmaktır (yandan kaydırma yapıldığı varsayılarak). Düşman dalgalarınızı tetik mesafeli bir kuyrukta saklayabilirsiniz; oynatıcınızın kat ettiği mesafe, kuyruğun önündeki nesnenin tetik mesafesinden büyükse, kuyruğa at ve yumurtla.

Bu çözüm, zamana dayalı bir çözümden ziyade bir grafik seviye editörü ile entegrasyona daha fazla katkıda bulunacaktır. Düşmanlarınız ortaya çıktığında, kaydırma arka planınız boyunca belirli noktaları eşleştirmeyi çok daha kolay hale getirir.


4
Ve eğer küresel olarak veya seviyenin bir bölümü için kaydırma hızını değiştirirseniz, daha sonraki düşmanları doğru yumurtlama pozisyonlarında tutacaktır, çünkü eğer zamana bağlıysa, düşmanlar doğru noktalarda ortaya çıkacaktır.
AttackingHobo

2

Referans olarak PowerManga kodunu incelemenizi öneririm. İki tür düzeyi vardır: her şeyin seviye başlangıcından belirli bir mesafede konumlandırıldığı ve diğer şeylerin rastgele oluşturulduğu yan kaydırma (tyrian benzeri) seviyeleri ve bir dalganın yalnızca ayrıştırıldığı "hareketsiz" seviyeler (à la galaga) bir önceki desenini bitirdikten sonra.

Dalga kalıpları elbette ardışık çerçeve eğrileri ile verimli bir şekilde planlanabilir (wikipedia sayfasının bunu açıklamak için düzgün bir animasyonu vardır).

Eğer son bir yorumda bulunabilseydim, bir LUA betiği gibi oyun programlamasında daha anlamlı, bakımı daha kolay ve daha kullanışlı bir şey lehine XML'i burada tamamen bırakardım.

HTH.


Zaten düşman hareketlerini (xml'de serileştirilmiş) depolamak için bezier eğrilerini kullanıyorum. .NET ve XNA serileştirme / serileştirme için yerleşik desteğe sahip olduğundan çoğunlukla XML kullanıyorum. LUA betiği kulağa hoş geliyor ama daha fazla iş gerektiriyor. Ancak, her zaman kullanmayı planladım, bu yüzden bazı temel motorları bitirdikten sonra kesinlikle ona bakacağım. Finallt, bir öncekinden sonra bir dalga yumurtlama fikri ilginç geliyor.
pek

2
XML, bir araç tarafından oluşturulduğu ve elle düzenlenmediği sürece iyidir. Komut dosyası yazma dilleri özel durumlar (örneğin, patronlar) için yararlı olsa da, bu standart saldırı düzenlerini tanımlamak için tamamen ayrı bir sorundur, değil mi?
bluescrn

0

Prosedürel olarak düşman üretmeyi düşünün. İstediğiniz cevaptan oldukça farklı olduğunu biliyorum ve sorunu dolaylı olarak tamamen çözüyor.

Bunu yapacak olsaydım, her düşman birimine ne kadar zor olduğuna "puan" değeri verirdim, sonra seviyelere birkaç puan atarım - 100 puan yüz 1 puan düşmana veya bir 100 puan düşmana, veya aradaki herhangi bir şey.

Muhtemelen bunu biraz sınırlamanız gerekir, böylece ilk seviyede 100 puanlı bir patron alamazsınız veya minimum sayıda düşmanınız olur ve muhtemelen kalan düşman listesini periyodik olarak yoklamak ve çekmek istersiniz. sonraki ekran.

Formasyonları alarak bir adım daha ileri gidebilirsiniz: konumların ve noktaların toplanması, örn. tek bir satırda (sıra veya sütun) yedi tek noktadan düşman veya iki 3 nokta ile çevrili beş noktadan oluşan düşman.

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.