Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Game Mechanics
Gamedevelopment

Bagaimana Kod Raksasa Loot Turun

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Aisyah Arrafah (you can also view the original English article)

Seorang mekanik umum dalam permainan tindakan adalah agar musuh menjatuhkan beberapa jenis barang atau hadiah saat meninggal. Karakter kemudian bisa mengumpulkan uang jarahan ini untuk mendapatkan beberapa keuntungan. Ia adalah mekanik yang diharapkan dalam banyak permainan, seperti RPG, kerana ia memberi insentif pemain untuk menyingkirkan musuh-serta ledakan kecil endorphins apabila mengetahui apa ganjaran segera untuk melakukannya.

Dalam tutorial ini, kami akan mengkaji semula kerja dalam mekanik seperti ini dan lihat bagaimana untuk melaksanakannya, apa saja jenis permainan dan alat / bahasa pengekodan yang mungkin anda gunakan.

Contoh-contoh yang saya gunakan untuk menunjukkan ini telah dibuat menggunakan Construct 2, alat membuat permainan HTML5, tetapi tidak khusus untuknya. Anda sepatutnya dapat melaksanakan mekanik yang sama dengan apa saja bahasa atau alat pengekodan anda.

Contohnya dibuat di r167.2 dan boleh dibuka dan diedit dalam versi percuma perisian. Anda boleh memuat turun versi terbaru Construct 2 di sini (sejak saya mula menulis artikel ini, sekurang-kurangnya dua versi yang lebih baru telah dikeluarkan) dan mengacaukan dengan contoh-contoh sesuai dengan keinginan anda. Contoh fail sumber CAPX dilampirkan pada tutorial ini dalam fail zip.

Mekanik Asas

Apabila kematian musuh (jadi, apabila HP kurang daripada atau sama dengan sifar) fungsi dipanggil. Peranan fungsi ini adalah untuk menentukan sama ada terdapat penurunan atau tidak, dan, jika ya, jenis penurunan itu sepatutnya.

Fungsi ini juga boleh mengendalikan penciptaan perwakilan visual drop, membiaknya pada koordinat skrin bekas musuh.

Pertimbangkan contoh berikut:

Klik butang Slay 100 Beasts. Ini akan melaksanakan proses batch yang menghasilkan 100 binatang rawak, membunuh mereka, dan memaparkan hasilnya bagi setiap binatang (iaitu, sama ada binatang itu jatuh item, dan, jika ya, apa jenis item). Perangkaan di bahagian bawah skrin memaparkan berapa banyak binatang yang menjatuhkan item, dan berapa banyak jenis item yang dijatuhkan.

Contoh ini adalah teks yang ketat untuk menunjukkan logik di sebalik fungsi tersebut, dan untuk menunjukkan bahawa mekanik ini boleh digunakan untuk sebarang jenis permainan, sama ada platformer yang mana anda menginjak musuh, atau penembak pandang atas, atau RPG.

Mari lihat bagaimana demo ini berfungsi. Pertama, binatang dan titisan masing-masing terkandung dalam tatasusunan. Inilah beast array:

Index (X)
Name (Y-0)
Drop rate (Y-1)
Perkara jarang (Y-2)
0 Boar 100 100
1 Goblin 75 75
2 Squire 65 55
3 ZogZog 45 100
4 Owl 15 15
5 Mastodon 35 50

Dan inilah  drops array:

Index (X)
Nama (Y-0)
Perkara jarang (Y-1)
0 Lollipop 75
1 Gold 50
2 Rocks 95
3 Jewel 25
4 Incense 35
5 Equipment 15

Nilai X (lajur Indeks) untuk array bertindak sebagai pengecam unik untuk binatang atau jenis item. Sebagai contoh, binatang indeks 0 adalah Boar. Item indeks 3 adalah Jewel.

Array ini berfungsi sebagai jadual carian untuk kami, yang mengandungi nama atau jenis setiap binatang atau item, serta nilai-nilai lain yang akan membolehkan kami menentukan ketinggian atau kadar penurunan. Dalam pelbagai binatang, terdapat dua lagi lajur selepas nama:

Drop rate  ialah bagaimana binatang itu akan menjatuhkan barang apabila dibunuh. Sebagai contoh, babi akan mempunyai peluang 100% untuk menggugurkan item apabila dibunuh, sedangkan burung hantu akan mempunyai peluang 15% untuk melakukan perkara yang sama.

Rarity mentakrifkan bagaimana perkara yang tidak biasa yang boleh dijatuhkan oleh binatang ini. Sebagai contoh, babi akan cenderung untuk menggugurkan barang-barang yang mempunyai nilai jarang 100. Sekarang, jika kita memeriksa drops array, kita dapat melihat bahawa batuan adalah item dengan langka terbesar (95). (Walaupun nilai jarang yang tinggi, kerana cara saya memprogramkan fungsi ini, semakin banyak bilangan jarang, semakin banyak perkara yang biasa. Ia mempunyai lebih banyak peluang untuk menjatuhkan batu daripada item dengan nilai jarang yang jarang.)

Dan itu menarik untuk kita dari perspektif reka bentuk permainan. Untuk keseimbangan permainan, kami tidak mahu pemain mendapat akses kepada peralatan terlalu banyak atau terlalu banyak item mewah terlalu cepat-jika tidak, watak mungkin terlalu kuat untuk dikalahkan, dan permainan akan kurang menarik untuk dimainkan .

Jadual dan nilai ini hanyalah contoh, dan anda boleh dan harus bermain dengan dan menyesuaikannya dengan sistem permainan dan alam semesta anda sendiri. Ini semua bergantung kepada keseimbangan sistem anda. Sekiranya anda ingin mengetahui lebih lanjut mengenai subjek penyeimbangan, saya cadangkan menyemak siri tutorial ini: Mengimbangi RPG Berasaskan Turn.

Mari kita lihat kod (pseudo) untuk demo:

Pertama, tindakan pengguna: klik pada butang Slay 100 Beasts. Butang ini memanggil fungsi dengan parameter 100, hanya kerana 100 merasakan seperti bilangan musuh yang baik untuk membunuh. Dalam permainan sebenar, lebih-lebih lagi anda akan membunuh binatang-binatang satu demi satu, sudah tentu.

Dari sini, fungsi SlainBeast dipanggil. Tujuannya adalah untuk memaparkan beberapa teks untuk memberi maklum balas pengguna mengenai apa yang berlaku. Pertama, ia membersihkan pemboleh ubah BeastDrops dan array aStats, yang digunakan untuk statistik. Dalam permainan sebenar, tidak mungkin anda memerlukannya. Ia membersihkan Teks juga, supaya 100 baris baru akan dipaparkan untuk melihat hasil kumpulan ini. Dalam fungsi itu sendiri, tiga pembolehubah angka dibuat: BeastType, DropChance, dan Rarity.

BeastType akan menjadi indeks yang kami gunakan untuk merujuk kepada baris tertentu dalam array aBeast; ia pada dasarnya jenis binatang yang pemain harus dihadapi dan dibunuh. Rarity diambil dari array aBeast juga; itu adalah jarang item binatang ini harus jatuh, nilai bidang jarang bidang dalam array aBeast.

Akhirnya, DropChance adalah nombor yang kita pilih secara rawak antara 0 dan 100. (Kebanyakan bahasa pengekodan akan mempunyai fungsi untuk mendapatkan nombor rawak dari julat, atau sekurang-kurangnya untuk mendapatkan nombor rawak antara 0 dan 1, yang kemudiannya boleh didarabkan sebanyak 100.)

Pada ketika ini, kita dapat memaparkan sedikit maklumat pertama kita dalam objek Teks: kita sudah tahu jenis binatang yang telah disembelih dan dibunuh. Jadi, kami menggabungkan nilai semasa Text.text BEAST_NAME dari BeastType semasa yang kami pilih secara rawak, daripada array aBeast.

Seterusnya, kita perlu menentukan sama ada item akan dijatuhkan. Kami berbuat demikian dengan membandingkan nilai DropChance ke nilai BEAST_DROPRATE dari array aBeast. Sekiranya DropChance adalah kurang daripada atau sama dengan nilai ini, kami menjatuhkan item.

(Saya memutuskan untuk pergi untuk 'kurang atau sama dengan' pendekatan, telah dipengaruhi oleh pemain peranan hidup ini menggunakan D & D King Arthur: Pendragon menetapkan peraturan mengenai gulungan dadu, tetapi anda boleh dengan baik kod fungsi yang lain jalan sekitar, memutuskan bahawa titisan akan hanya berlaku apabila 'lebih besar atau sama'. Ia hanya soal nilai numerik dan logik. Walau bagaimanapun, tetap konsisten semua melalui algoritma anda, dan jangan ubah logika separuh-jika tidak, anda boleh menghadapi masalah semasa cuba debug atau mengekalkannya.)

Jadi, dua baris menentukan sama ada sesuatu item jatuh atau tidak. Pertama:

Di sini, DropChance lebih besar daripada DropRate, dan kami menganggap ini bermakna tiada item dijatuhkan. Dari sana, satu-satunya perkara yang dipaparkan adalah penutup ''.'' (hujung penuh) yang berakhir dengan hukuman, ''[BeastType] telah dibunuh.'', sebelum bergerak ke musuh seterusnya dalam kumpulan kami.

Sebaliknya:

Di sini, DropChance adalah kurang daripada atau sama dengan DropRate untuk BeastType semasa, dan dengan itu kita menganggap ini bermakna bahawa item tersebut digugurkan. Untuk berbuat demikian, kami akan menjalankan perbandingan antara Rarity item yang BeastType semasa ''dibenarkan'' untuk jatuh, dan beberapa nilai jarang yang kami tetapkan dalam jadual aDrop.

Kita gelung melalui jadual aDrop, memeriksa setiap indeks untuk melihat sama ada DROP_RATEnya lebih besar atau sama dengan Rarity. (Ingat, secara kontra-intuitif, nilai Rarity yang lebih tinggi adalah, item yang lebih biasa adalah) Bagi setiap indeks yang sepadan dengan perbandingan, kami menolak indeks itu ke dalam array sementara, aTemp.

Pada akhir gelung, kita harus mempunyai sekurang-kurangnya satu indeks dalam array aTemp. (Jika tidak, kita perlu merekabentuk jadual aDrop dan aBeast kami!). Kami kemudian membuat DropType variabel angka yang secara rawak memilih salah satu daripada indeks dari array aTemp; ini akan menjadi barang yang kita jatuhkan.

Kami tambahkan nama item tersebut kepada objek Teks kami, menjadikan kalimat itu menjadi seperti ''BeastType telah dibunuh, menjatuhkan DROP_NAME.'' Kemudian, demi contoh ini, kami menambah beberapa nombor kepada pelbagai statistik kami (dalam array AStats dan dalam BeastDrops).

Akhirnya, selepas 100 pengulangan, kami memaparkan statistik tersebut, bilangan binatang (daripada 100) yang menjatuhkan item, dan bilangan setiap item yang dijatuhkan.

Contoh lain: Menarik Item secara visual

Mari kita pertimbangkan contoh lain:

Tekan Ruang untuk membuat bola api yang akan membunuh musuh.

Seperti yang anda dapat lihat, musuh rawak (dari bestiary of 11) dicipta. Watak pemain (di sebelah kiri) boleh membuat serangan projektil. Apabila peluru melanda musuh, musuh mati.

Dari situ, fungsi yang serupa dengan apa yang telah kita lihat dalam contoh terdahulu menentukan sama ada musuh menjatuhkan beberapa item atau tidak, dan menentukan perkara itu. Kali ini, ia juga mewujudkan perwakilan visual item yang jatuh, dan mengemas kini statistik di bahagian bawah skrin.

Inilah pelaksanaan dalam pseudocode:

Lihat kandungan jadual aEnemy dan aDrop, masing-masing:

Indeks (X)
Nama (Y-0)
Kadar penurunan (Y-1)
Perkara jarang (Y-2)
Nama animasi (Y-3)
0 Healer Female 100 100 Healer_F
1 Healer Male 75 75 Healer_M
2 Mage Female 65 55 Mage_F
3 Mage Male 45 100 Mage_M
4 Ninja Female 15 15 Ninja_F
5 Ninja Lelaki 35 50 Ninja_M
6 Ranger Lelaki 75 80 Ranger_M
7 Townfolk Perempuan 75 15 Townfolk_F
8 Townfolk Male 95 95 Townfolk_M
9 Pahlawan Wanita 70 70 Warrior_F
10 Lelaki Warrior 45 55 Warrior_M
Indeks (X)
Nama (Y-0)
Perkara jarang (Y-1)
0 epal 75
1 Pisang 50
2 Wortel 95
3 Grape 85
4 Empty potion 80
5 Blue potion 75
6 Red potion 70
7 Green potion 60
8 Pink Heart 65
9 Blue pearl 15
10 Rock 100
11 Glove 25
12 Armor 30
13 Jewel 35
14 Topi mage 65
15 Wood shield 85
16 Iron axe 65

Tidak seperti contoh terdahulu, array yang mengandungi data musuh dinamakan aEnemy dan mengandungi satu lagi baris data, ENEMY_ANIM, yang mempunyai nama animasi musuh. Dengan cara ini, apabila membiak musuh, kita boleh melihat dan mengotomatikkan paparan grafik.

Dalam vena yang sama, aDrop kini mengandungi 16 elemen, bukannya enam, dan setiap indeks merujuk kepada bingkai animasi objek-tetapi saya juga boleh mempunyai beberapa animasi, seperti yang dilakukan oleh musuh-musuh, jika item-item yang digugurkan akan dinyalakan .

Kali ini, terdapat lebih banyak musuh dan barang daripada contoh terdahulu. Walau bagaimanapun, anda boleh melihat data mengenai kadar penurunan dan nilai jarang masih ada. Satu perbezaan yang ketara adalah bahawa kita telah memisahkan pemijahan musuh dari fungsi yang mengira jika ada penurunan atau tidak. Ini kerana, dalam permainan sebenar, musuh kemungkinan akan melakukan lebih daripada sekadar menunggu di skrin untuk dibunuh!

Jadi sekarang kita mempunyai fungsi SpawnEnemy dan Drop fungsi yang lain. Drop sangat mirip dengan cara kita mengendalikan 'roll dice' dari drop item kami dalam contoh terdahulu, tetapi mengambil beberapa parameter kali ini: dua daripada ini adalah koordinat X dan Y musuh pada skrin, kerana itulah tempat di mana kita akan mahu menanam item apabila terdapat penurunan; parameter lain ialah EnemyType, supaya kita dapat melihat nama musuh dalam jadual aEnemy, dan nama watak sebagai rentetan, untuk membuatnya lebih pantas untuk menulis maklum balas yang ingin kami berikan kepada pemain.

Logik fungsi Drop sebaliknya serupa dengan contoh terdahulu; Sebilangan besar perubahan ialah cara kami memaparkan maklum balas. Kali ini, bukan hanya memaparkan teks, kami juga menanam objek pada skrin untuk memberi gambaran visual kepada pemain.

(Nota: Untuk menimbulkan musuh pada beberapa kedudukan di skrin, saya menggunakan objek yang tidak kelihatan, Spawn, sebagai rujukan, yang terus bergerak ke kiri dan kanan. Apabila fungsi SpawnEnemy dipanggil, ia mewujudkan musuh pada koordinat semasa objek Spawn, supaya musuh muncul dan pelbagai lokasi mendatar.)

Satu perkara terakhir untuk dibincangkan adalah apabila betul-betul fungsi Drop dipanggil. Saya tidak mencetuskan secara langsung kematian musuh, tetapi selepas musuh telah memudar (animasi kematian musuh). Anda tentu boleh panggil kejatuhan apabila musuh masih kelihatan di skrin, jika anda lebih suka; sekali lagi, itu benar-benar turun ke reka bentuk permainan anda.

Kesimpulan

Pada tahap reka bentuk, apabila musuh jatuh beberapa rampasan memberikan insentif kepada pemain untuk menghadapi dan memusnahkan mereka. Item yang digugurkan membolehkan anda memberikan kuasa, statistik, atau sasaran kepada pemain sama ada secara langsung atau tidak langsung.

Pada tahap pelaksanaan, item menjatuhkan diuruskan melalui fungsi yang dikodkan memutuskan ketika memanggil. Fungsi ini berfungsi untuk menyemak perkara-perkara yang jarang yang harus diturunkan mengikut jenis musuh yang dibunuh, dan juga dapat menentukan di mana untuk memancarkannya pada skrin jika dan bila diperlukan. Data untuk item dan musuh boleh diadakan dalam struktur data seperti array, dan melihat oleh fungsi.

Fungsi ini menggunakan nombor rawak untuk menentukan kekerapan dan jenis titisan, dan pengkod mempunyai kawalan ke atas gulungan rawak tersebut, dan data yang dilihatnya, untuk menyesuaikan perasaan jatuh pada permainan.

Saya harap anda menikmati artikel ini dan mempunyai pemahaman yang lebih baik tentang bagaimana untuk membuat raksasa menjatuhkan raksasa anda dalam permainan anda. Saya tidak sabar-sabar untuk melihat permainan anda sendiri menggunakan mekanik itu.

Rujukan

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.