Bagaimana cara menyimpan level shmup?

12

Saya sedang mengembangkan 2D shmup (yaitu Aero Fighters ) dan saya bertanya-tanya apa saja berbagai cara untuk menyimpan level. Dengan asumsi bahwa musuh didefinisikan dalam file xml mereka sendiri, bagaimana Anda mendefinisikan ketika musuh memunculkan di tingkat?

Apakah ini didasarkan pada waktu? Pembaruan? Jarak?

Saat ini saya melakukan ini berdasarkan "level waktu" (jumlah waktu level berjalan - jeda tidak memperbarui waktu). Berikut ini sebuah contoh (serialisasi dilakukan oleh XNA):

<?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>

Setiap elemen Musuh pada dasarnya adalah gelombang tipe musuh tertentu. Jenisnya didefinisikan dalam EnemyType sedangkan SpawnTime adalah "level waktu" yang muncul oleh gelombang ini. NumberOfSpawns dan SpawnOffset adalah jumlah musuh yang akan muncul dan waktu yang dibutuhkan antara masing-masing spawn.

Ini bisa jadi ide bagus atau mungkin ada yang lebih baik di luar sana. Saya tidak yakin. Saya ingin melihat beberapa pendapat dan ide.

Saya memiliki dua masalah dengan ini: menelurkan musuh dengan benar dan membuat editor level. Masalah editor level adalah masalah yang sama sekali berbeda (yang mungkin akan saya posting di masa depan: P).

Adapun pemijahan dengan benar, masalahnya terletak pada kenyataan bahwa saya memiliki waktu pembaruan variabel dan jadi saya perlu memastikan saya tidak melewatkan musuh karena spawn offset terlalu kecil, atau karena pembaruan membutuhkan waktu lebih lama . Saya agak memperbaikinya untuk sebagian besar, tetapi bagi saya sepertinya masalahnya adalah bagaimana saya menyimpan level.

Jadi, ada ide? Komentar?

Terima kasih sebelumnya.

pek
sumber

Jawaban:

4

Salah satu cara untuk melakukan ini adalah dengan mendasarkan bibit tidak tepat waktu tetapi pada jarak horizontal yang ditempuh (dengan asumsi sidescrolling). Anda dapat menyimpan gelombang musuh Anda dalam antrian dengan jarak pemicu; ketika jarak pemain Anda bepergian lebih besar dari jarak pemicu objek di depan antrian, keluarkan dari antrian dan keluarkan.

Solusi ini akan lebih mengarah pada integrasi dengan editor level grafis daripada solusi berbasis waktu. Itu akan membuatnya jauh lebih mudah untuk mencocokkan titik-titik tertentu di sepanjang latar belakang bergulir Anda dengan ketika musuh muncul.

Tagihan
sumber
4
Dan sebagai bonus jika Anda mengubah kecepatan gulir, baik secara global, atau untuk bagian level, itu akan membuat musuh di kemudian hari dalam posisi spawn yang benar, karena jika berdasarkan waktu, musuh akan muncul di tempat yang benar.
AttackingHobo
2

Saya sarankan Anda mempelajari kode PowerManga sebagai referensi. Mereka memiliki dua jenis level: level sisi-bergulir (seperti tyrian) di mana segala sesuatu diposisikan pada jarak tertentu dari level awal dan hal-hal lain dihasilkan secara acak, dan level "diam" (à la galaga) di mana satu gelombang hanya diurai setelah yang sebelumnya selesai polanya.

Pola gelombang tentu saja dapat secara efisien direncanakan oleh kurva bezier berturut-turut (halaman wikipedia memiliki animasi yang rapi untuk menjelaskannya)

Jika saya dapat memberikan komentar terakhir, saya akan sepenuhnya meninggalkan XML di sini demi sesuatu yang lebih ekspresif, lebih mudah untuk dipertahankan dan lebih berguna dalam pemrograman game seperti skrip LUA.

HTH.


sumber
Saya sudah menggunakan kurva bezier untuk menyimpan gerakan musuh (yang juga berseri dalam xml). Saya terutama menggunakan XML karena .NET dan XNA memiliki dukungan bawaan untuk serialisasi / deserialisasi. Skrip LUA kedengarannya bagus tetapi akan membutuhkan lebih banyak pekerjaan. Namun, saya selalu berencana menggunakannya, jadi setelah saya menyelesaikan beberapa mesin dasar, saya pasti akan memeriksanya. Akhirnya, gagasan memunculkan gelombang setelah yang sebelumnya terdengar menarik.
pek
2
XML baik-baik saja, asalkan dihasilkan oleh alat, dan tidak diedit dengan tangan. Sementara bahasa scripting mungkin berguna untuk kasus-kasus khusus (misalnya bos), itu masalah yang sepenuhnya terpisah untuk mendefinisikan pola serangan standar, bukan?
bluescrn
0

Pertimbangkan untuk menghasilkan musuh secara prosedural. Saya tahu ini sangat berbeda dari jawaban yang Anda inginkan, dan itu secara tidak langsung menyelesaikan masalah sepenuhnya.

Jika saya melakukan ini, saya akan menugaskan setiap unit musuh nilai "poin" dari betapa sulitnya, kemudian menetapkan level beberapa poin - 100 poin bernilai seratus musuh 1 poin, atau satu musuh 100 poin, atau apa pun di antara keduanya.

Anda mungkin perlu membatasi ini sedikit sehingga Anda tidak mendapatkan bos 100 poin di tingkat pertama, atau bahwa Anda memiliki sejumlah minimum musuh, dan Anda mungkin ingin secara berkala polling daftar musuh kiri dan tarik yang berikutnya di layar.

Anda dapat mengambil langkah lebih jauh dengan memiliki formasi: koleksi posisi dan poin, misalnya. tujuh musuh satu poin dalam satu baris (baris atau kolom), atau lima poin diapit oleh dua 3 poin.

ashes999
sumber