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

Membina Beat 'Em Up dalam Pembuat Permainan, Bahagian 2: Pertempuran dan Asas Musuh AI

by
Difficulty:IntermediateLength:LongLanguages:

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

Dalam artikel terakhir kami membincangkan cara membuat pemain bergerak dan mengintegrasikan beberapa mekanik tempur asas. Ia permulaan yang baik, tetapi kami masih mempunyai beberapa perkara yang perlu dilakukan sebelum ini mula berasa seperti permainan sebenar.

Artikel ini akan menumpukan mencipta kamera yang dinamik, menjadikan BattleRegions atau berlaku kawasan untuk memerangi, dan memberi musuh keupayaan untuk memulakan pertempuran kembali.

Sama seperti dalam artikel terakhir, pastikan anda memuatkan pek Aset untuk artikel ini sebelum anda memulakan.

Mewujudkan Kamera

Pembuat MenciGame menggunakan Pandangan untuk mengawal bagaimana kamera berkelakuan. Biasanya kami boleh memberitahu pandangan kami untuk mengikuti Pemain dan biarkannya, tetapi akhirnya kamera kami memerlukan kelakuan khas seperti kesan goncang selepas serangan besar. Jika kamera dipasang terus kepada pemain, ini boleh menjadi sangat mencabar untuk dilaksanakan. Sebaliknya, kita akan membuat objek kamera bahawa pandangan akan mengikuti, dan program tingkah laku khas terus ke dalamnya.

Pertama, mari kita import Spit Kamera. Ia terletak di dalam folder Aset yang anda muat turun untuk Tutorial di bawah Imej> SPR_Camera.png.

Nama Sprite Imej Asal
SPR_Camera SPR_Camera.png X = 14, Y = 12

Walaupun kamera tersebut tidak dapat dilihat, pandangan akan mempunyai isu-isu berikut jika ia tidak mempunyai sprite yang berkaitan dengannya, oleh itu, kita mengimport imej ini.

Sekarang mari kita buat objek kamera sebenar.

  1. Klik-kanan pada folder Objek dan pilih Buat Objek.
  2. Namakan objek OBJ_Kamera.
  3. Nyahtanda atribut Terlihatan.
  4. Klik Tambah Acara> Buat.
  5. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  6. Tambah kod berikut:

Semua kod ini tidak menyediakan objek kamera untuk kami. Pertama ia memberitahu pandangan untuk mengikuti objek kamera. Kemudian ia menetapkan nilai Vborder dan Hborder, yang menentukan seberapa dekat objek kamera boleh sampai ke tepi paparan sebelum paparan mula menatal dengan tahap. Sekiranya anda mahukan kamera / pemain berada di tengah-tengah skrin, Vborder perlu separuh ketinggian skrin permainan, dan Hborder sepatutnya separuh lebar. Akhirnya, menetapkan view_visible kepada benar menjadikan pandangan ini aktif dalam permainan.

Setelah menetapkan nilai tersebut, kami meletakkan kamera pada kedudukan yang sama dengan Pemain, dan mencipta pemboleh ubah TargetX dan TargetY. Pembolehubah ini akan digunakan untuk mengarahkan pergerakan kamera dan memberitahu di mana hendak pergi. Kemudian kita mempunyai pembolehubah Negeri yang akan digunakan untuk mengawal kelakuan kamera. Akhirnya, MoveSpeed ​​menentukan sejauh mana kamera bergerak ke posisi Sasaran.

Kini kami akan menambah kod asas pergerakan ke Peristiwa Langkah.

  1. Dengan objek Kamera yang dipilih, Tambah Peristiwa> Langkah> Langkah.
  2. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  3. Tambah kod berikut:

Acara langkah ini memberitahu kamera untuk mengikuti pemain. Pertama ia menetapkan kedudukan sasaran untuk kedudukan pemain. Kemudian, jika jarak ke kedudukan sasaran lebih besar daripada kelajuan bergerak Kamera, ia mula bergerak ke arah sasaran; jika tidak, ia terkunci ke kedudukan sasaran dan berhenti.

Itu sahaja yang perlu dilakukan Kamera buat masa sekarang, jadi mari membuat objek kamera dalam permainan dan mula mengujinya. Kami hanya boleh menjatuhkan kamera di dalam bilik dengan pemain kami sendiri, tetapi kami akan mempunyai objek Pemain yang membuat kamera sebaliknya. Oleh kerana kamera bergantung pada Pemain untuk berfungsi, mempunyai Pemain yang membuat kamera menghalang kami daripada melupakan kamera pada masa akan datang, dan memastikan tiada masalah dengan pesanan objek dibuat.

  1. Pergi ke objek pemain OBJ_Player.
  2. Buka kod untuk acara Buat.
  3. Pada akhir kod, tambahkan baris kod ini:

Akhirnya, kita perlu mendayakan Pandangan di dalam bilik, jika tidak, Kamera tidak berfungsi.

  1. Pergi ke room0, bilik yang kami buat dalam tutorial lepas.
  2. Pergi ke tab pandangan.
  3. Semak Aktifkan penggunaan Paparan.
  4. Kemudian pilih Lihat 0 dari senarai Lihat, dan tandakan kotak yang menyatakan Terlihat apabila bilik bermula.

Sekiranya anda menguji permainan sekarang, perkara akan kelihatan sama seperti sebelum ini kerana ruangan itu memenuhi keseluruhan pandangannya. Untuk melihat perubahan dalam tindakan ini, kita perlu membuat ruangan lebih luas atau lebih tinggi daripada sekarang.

  1. Pergi ke room0, bilik yang kami buat dalam tutorial lepas.
  2. Pergi ke tab tetapan.
  3. Tetapkan Lebar = 3000.

Sekarang apabila anda pergi dalam permainan, dan anda cuba untuk melepasi Musuh, anda perlu perhatikan bahawa skrol bilik dengan pemain ketika mereka bergerak. Secara teknikal ia menatal dengan kamera, tetapi ia kelihatan seolah-olah mengikuti Pemain kerana itulah yang dilakukan oleh kamera.

Anda juga boleh cuba meningkatkan ketinggian bilik, dan anda akan melihat kesan yang sama.

Kawasan Pertempuran

Dalam pukulan klasik 'em up, pertempuran umumnya terhad kepada kawasan yang satu atau dua skrin besar pada satu masa. Apabila pertarungan bermula, kamera dan pemain menjadi terkunci di kawasan pertempuran yang sedang berlaku, dan tidak boleh meninggalkannya sehingga pertarungan berakhir. Ini menjadikan pertemuan musuh lebih mudah untuk dikawal, AI lebih mudah membina, dan membuat pergaduhan lebih fokus. Jika anda masih tidak pasti apa yang saya bicarakan, lihatlah Let's Play of Crashers Castle, dan tonton apa yang berlaku ketika mereka memasuki pertempuran.

Apabila pertempuran bermula, pergerakan mereka menjadi terhad, dan dalam beberapa kes tingkah laku kamera akan berubah. Ia agak sukar diperhatikan apabila anda tidak mencarinya, tetapi kamera itu cenderung untuk "snap" sedikit ke kawasan pertempuran sebaik pertempuran bermula. Untuk membuat kesan ini dalam permainan kami, kami akan menambahkan objek BattleRegion yang akan bertindak sebagai satu arena untuk pertempuran berlaku. Apabila pemain memasuki BattleRegion, ia akan mengambil alih kamera dan menyekat pergerakan mereka sehingga pertempuran berakhir.

Pertama kita memerlukan Sprite untuk Wilayah Pertempuran kita.

  1. Klik-Kanan Sprite folder dan pilih Create New Sprite.
  2. Namakan spektrum SPR_BattleRegion.
  3. Klik Edit Sprite.
  4. Pergi ke Fail> Baru.
  5. Dalam dialog Baru, tetapkan saiz imej kepada 1024x768, dan tekan OK. Saya memilih saiz imej ini kerana itu adalah resolusi sebenar permainan kami. Oleh kerana BattleRegions akan resizable, mempunyai saiz lalai sebagai saiz skrin akan sangat mudah untuk merancang pertemuan dengan cepat.
  6. Klik-dua kali imej baru untuk membuka editor imej.
  7. Gunakan Cat Bucket untuk mengisi keseluruhan imej dengan satu warna. Kawasan Pertempuran tidak akan kelihatan dalam permainan, jadi anda boleh memilih mana-mana warna yang anda sukai di sini. Hanya pastikan anda memilih warna yang akan mudah dilihat dan jelas ketika tahap mengedit. Saya memilih biru terang.
  8. Gunakan Tanda Centang untuk menyimpan sprite.
  9. Pusat titik pivot.
  10. Tekan OK untuk menyimpan sprite dan keluar dari editor sprite.

Seterusnya kita akan membuat objek Pertempuran Wilayah.

  1. Klik kanan pada objek Objek dan pilih Buat Objek.
  2. Namakan objek OBJ_BattleRegion.
  3. Tetapkan sprite ke SPR_BattleRegion.
  4. Nyahtandai kotak pilihan Visible.
  5. Klik Tambah Acara> Buat.
  6. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  7. Tambah kod berikut:

Ini adalah kod penciptaan kami. Pemboleh ubah IsActive memberitahu kami sama ada BattleRegion telah diaktifkan. Dalam erti lain, ia memberitahu kita ada pertempuran telah bermula, dan ada musuh-musuh rantau ini masih hidup. Ia bermula salah, tetapi akan menjadi benar apabila pemain masuk dan tetap benar sehingga mereka membunuh semua musuh. RegionHeight dan RegionWidth memberi kita pembolehubah untuk mengakses saiz BattleRegion, sedangkan empat pembolehubah selepas itu memberitahu kita tepat di mana tepi.

Kita akhirnya akan memerlukan nilai-nilai ini dengan banyak, jadi dapat dengan mudah merujuk mereka, tanpa melakukan matematik setiap kali, akan menjadi pertolongan besar kemudian. Akhirnya, HasEnemies adalah Boolean mudah yang akan memberitahu kami sama ada rantau ini mempunyai sebarang musuh yang tinggal. Setelah BattleRegion diaktifkan, ia tidak akan dapat disahaktifkan kecuali pemboleh ubah ini palsu.

Seterusnya kami akan menambah beberapa kod untuk mengaktifkan BattleRegion apabila pemain memasuki.

  1. Di OBJ_BattleRegion, klik Tambah Acara> Perlanggaran> OBJ_Player.
  2. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  3. Tambah kod berikut:

Walaupun pernyataan jika dalam kod ini agak panjang, ia sebenarnya hanya menguji dua perkara. Mula-mula ia menguji jika Pemain berada dalam batas BattleRegion, tetapi ia mengabaikan penimbal kecil sekitar 20 piksel di bahagian tepi BattleRegion. Ia melakukan ini untuk memastikan pemain sepenuhnya di dalam rantau ini, dan tidak berdiri di tepi paling, sebelum ia diaktifkan. Perkara kedua yang diperiksa adalah sama ada HasEnemies adalah benar. Jika kedua-duanya adalah benar, ia mengaktifkan BattleRegion.

Akhir sekali, kita perlu menyahaktifkan BattleRegion apabila pertempuran berakhir, dan pastikan HasEnies ditetapkan kepada benar apabila terdapat Musuh di rantau ini. Kita boleh melakukan ini dalam Acara Langkah.

  1. Dalam OBJ_BattleRegion, klik Tambah Acara> Langkah.
  2. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  3. Tambah kod berikut:

Kod ini memeriksa jika terdapat sebarang musuh yang tersisa di dalam bilik, dan jika ada musuh yang berada di dalam BattleRegion. Jika keduanya benar, ia menetapkan HasEnemies menjadi benar; jika tidak, ia menetapkannya salah dan menyahaktifkan BattleRegion.

Perkara terakhir yang perlu anda lakukan ialah menambah BattleRegion ke tahap, dan menguji permainan untuk melihat apa yang berlaku. Apabila anda menambahnya, pastikan bahawa musuh yang anda letakkan berada dalam batas BattleRegion. Anda juga boleh mempunyai pelbagai BattleRegions, tetapi anda harus pastikan mereka tidak bertindih. Anda boleh melihat bagaimana saya menetapkan BattleRegion saya di bawah:

The Battle Region

Mengehadkan Pergerakan Pemain

Jika anda pergi dalam permainan untuk menguji BattleRegion anda, anda mungkin perasan bahawa tiada apa yang berlaku apabila anda memasuki BattleRegion. Itu kerana tiada perubahan atau perubahan kod kamera apabila BattleRegion aktif. Sekarang, mengaktifkan BattleRegion pada dasarnya adalah tindakan yang tidak berguna kerana kita tidak pernah memberitahu mana-mana objek lain untuk melakukan apa-apa tentang bahawa hakikatnya ia aktif. Untuk membetulkannya, kita perlu menyesuaikan pemain dan objek Kamera supaya mereka mengira BattleRegion sempadan apabila ia aktif.

Untuk Pemain, kami ingin memastikan bahawa mereka tidak boleh meninggalkan BattleRegion sehingga semua musuh mereka dikalahkan. Untuk melakukan ini, kita perlu mengubah kod pergerakan itu sendiri.

  1. Pergi ke OBJ_Payer.
  2. Pergi ke Langkah acara Pemain.
  3. Pada permulaan peristiwa Langkah Pemain, tambahkan kod ini:

Kod ini menyimpan BattleRegion terdekat dalam pembolehubah supaya Pemain dapat dengan mudah merujuknya dalam kod pergerakan.

  1. Masih dalam acara Langkah OBJ_Player.
  2. Tambah kod berikut pada permulaan pernyataan IsAttacking, sebelum mana-mana kod yang ada dalam pernyataan itu jika:

Walaupun kod ini kelihatan panjang, ia sangat mudah. Pertama, ia memeriksa ada BattleRegion aktif. Sekiranya, ia melihat kedudukan Potensi Pemain X berdasarkan XSpeed ​​mereka. Sekiranya kelajuan semasa mereka akan meletakkan mereka di luar BattleRegion, atau menyebabkan mereka bertembung dengan objek yang ditandakan Pepejal, ia menetapkan XSpeed ​​ke 0. Kemudian ia melakukan pemeriksaan yang sama untuk YSpeed.

Sekiranya anda masuk dalam permainan dan menguji kod baru ini, pergerakan anda harus terhad kepada batasan BattleRegion sehingga anda membunuh semua Enemies.

Kelakuan Kamera: Pengenalan kepada Mesin Negeri Sembilan

Perkara-perkara yang masih tidak sempurna, walaupun. Walaupun sedemikian rupa Pemain tidak boleh keluar dari BattleRegion, kamera boleh. Kerana ini, jika kita pergi ke pinggir BattleRegion, jelas Pemain memukul dinding yang tidak kelihatan di tengah-tengah skrin, dan tidak boleh bergerak lagi, tetapi bahagian luar BattleRegion masih kelihatan.

The visible Battle Region

Sudah tentu lebih baik jika kamera dibatasi dengan cara yang sama seperti Pemain, dan ia tidak boleh bergerak ke lokasi di mana anda akan melihat melewati tepi BattleRegion. Untuk melakukan itu, kami akan menubuhkan Mesin Negeri Sembilan, atau FSM, yang akan membolehkan kami untuk menentukan bagaimana kamera berkelakuan berdasarkan keadaan semasa permainan.

Mesin Negeri Finite membolehkan anda memisahkan setiap tingkah laku objek ke bahagian-bahagian diskret kod yang dipanggil Negeri. Kemudian, dengan menggunakan Pernyataan Tukar, anda boleh menyemak apa yang menyatakan objek itu, dan jalankan hanya kod yang berkaitan. Ini menjadikan kod anda mudah diikuti dan sangat serba boleh. Ia juga menjadikannya mudah untuk memperluaskan kod, kerana kita boleh membuat Negara-negara baru setiap kali suatu tingkah laku baru diperlukan, daripada merumitkan yang ada jika pernyataan dan kod-dasar.

Untuk kamera kami, kami akan membuat dua Negara: Pemain dan Wilayah. Pemain akan mengikut Pemain seberat mungkin apabila mereka tidak berada di Pertempuran, dan akan melakukan semuanya pada dasarnya kamera kami sekarang. Wilayah akan mengambil alih apabila pemain memasuki BattleRegion aktif, dan akan memastikan kamera tidak dapat bergerak melewati sempadan rantau ini, sambil memastikan pemain memandang setiap saat.

Kita sudah mempunyai pembolehubah Negeri dalam Kamera, sejak kita menciptanya sebelum ini, jadi kita boleh bergerak terus ke bangunan FSM yang sebenarnya.

  1. Pergi ke OBJ_Kamera.
  2. Buka Langkah kod acara.
  3. Gantikan kod yang menetapkan TargetX dan TargetY dengan yang berikut:

Kod ini memaparkan struktur asas Peristiwa Langkah baru. Mula-mula kamera mendapati BattleRegion terdekat dan menyimpannya dalam pembolehubah dipanggil MyBR, sama seperti Pemain. Kemudian pernyataan suis memandang keadaan dan menjalankan kod yang sesuai.

Walaupun ini adalah pernyataan suis yang agak mudah, dan kita boleh mencapai sesuatu yang serupa dengan pernyataan jika, akhirnya kita memerlukan lebih banyak negeri, jadi lebih baik untuk berfikir ke hadapan dan membuat pernyataan suis sekarang.

Pertama, mari tambahkan kod untuk kes Pemain. Tambah kod ini sebagai ganti komen dalam kes Pemain:

Kod ini berkelakuan sama seperti kod yang kita ganti dengan pernyataan suis, dan menetapkan kedudukan Sasaran ke kedudukan Pemain. Selepas itu ia menyemak sama ada BattleRegion aktif. Sekiranya ia, ia beralih kepada negeri Wilayah. Akhirnya, kita mempunyai rehat; pernyataan, yang digunakan dalam pernyataan suis untuk menamatkan kod dan menghalang mana-mana negara lain daripada diproses.

Seterusnya, kami akan menambah tingkah laku bagi keadaan Wilayah. Matlamat negara ini adalah untuk memastikan kamera berada dalam batas BattleRegion sepanjang masa dan memastikan tidak kira di mana pemain masuk dalam rantau ini, mereka akan kelihatan. Untuk berbuat demikian, kami akan menentukan kedudukan minimum dan maksimum X dan Y yang boleh memasangkan kamera sebelum di luar BattleRegion menjadi kelihatan.

Kemudian, jika Pemain berada dalam kawasan minimum/maksimum, kamera akan mengikutinya seperti biasanya, dan jika Pemain keluar dari kawasan itu, ke tepi BattleRegion, kamera masih dapat melihatnya apabila ia mencapai batas minimum/maksimum.

Gantikan komen keadaan Wilayah dengan kod di bawah:

Pertama kod ini menetapkan kedudukan minimum dan maksimum X dan Y untuk kamera, dengan mengambil tepi BattleRegion dan menambah penampan yang separuh ketinggian dan lebar skrin pada semua sisi. Penimbal ini membolehkan kamera untuk mendapatkan sedekat mungkin ke pinggir rantau ini, tanpa membuat apa-apa di luar BattleRegion kelihatan. Anda boleh melihat apa yang saya maksud dalam imej di bawah.

Camera Placement

Dalam hal ini kawasan biru mewakili BattleRegion, dan kotak dengan garis merah mewakili kamera. Kawasan biru gelap adalah penampan, sedangkan kawasan cahaya biru adalah kawasan yang kamera dapat bergerak dengan bebas. Seperti yang dapat anda lihat, pusat kamera sempurna merangkak ke tepi tepi buffer apabila ia berada di pinggir BattleRegion.

Selepas itu, kamera menggunakan fungsi pengapit untuk menetapkan TargetX dan TargetY berdasarkan kedudukan Pemain, minimum, dan maksimum. Akhir sekali, ia menguji untuk melihat sama ada BattleRegion masih aktif, atau sama ada kamera telah mendapat di luar batas BattleRegion, dan menetapkan keadaan kembali kepada Pemain jika sama ada benar.

Kini jika anda masuk dalam permainan untuk menguji BattleRegion, ia harus berkelakuan dengan tepat seperti yang kita mahukan dan lancar peralihan antara negara-negara berlainan apabila BattleRegion menjadi aktif atau tidak aktif.

Cara terbaik untuk melihat kamera dalam tindakan adalah, untuk membuat lebar atau ketinggian BattleRegion lebih besar daripada lebar atau ketinggian skrin. Jika anda tidak mengubah saiz BattleRegion, dan biarkan saiznya sama seperti pandangan kamera, maka kamera tidak akan bergerak sama sekali manakala BattleRegion aktif sejak BattleRegion adalah saiz skrin yang tepat.

Sebaik sahaja anda selesai menguji tingkah laku kamera, anda perlu kembali ke OBJ_BattleRegion dan nyahtandai kotak pilihan Visible. Dengan cara ini BattleRegion tidak akan kelihatan dalam permainan.

Asas Musuh AI

Mengalahkan musuh-musuh yang tidak bersenjata adalah menyeronokkan, tetapi permainan kami memerlukan lebih daripada beg meninju yang dimuliakan untuk menjadi menarik. Sekurang-kurangnya, kita harus memberi mereka keupayaan untuk memukul kita kembali.

Untuk AI kami, kami akan menggunakan Mesin Finite State lain. Negeri-negeri musuh kita boleh termasuk Wandering/Patrol apabila mereka tidak mempunyai sasaran, Beratur ketika mereka bersiap-siap untuk menyerang, atau Idle ketika mereka tidak melakukan apa-apa sama sekali. Negeri-negeri yang akan bermula hari ini adalah Idle, PositionFront, dan PositionBehind.

PositionFront dan PositionBehind tidak akan diselesaikan hari ini, tetapi mereka akan digunakan dalam artikel kemudian untuk menentukan arah mana musuh-musuh akan mendekati Pemain dari.

Sebelum kita mula membina Negara-negara ini, kita perlu mengimport dua animasi baru yang akan kita gunakan untuk Serangan Musuh. Satu adalah untuk Serangan Asas, dan satu untuk Serangan Kuat. Buat dua sprite baru seperti yang dinyatakan di bawah:

Sprite Name Images Origin Position
SPR_EnemyBasicPunch

RedEnemyBasicPunch1.png,

RedEnemyBasicPunch2.png,

RedEnemyBasicPunch3.png,

RedEnemyBasicPunch4.png,

RedEnemyBasicPunch5.png

X = 55, Y = 122
SPR_EnemyStrongPunch
RedEnemyStrongPunch1.png,

RedEnemyStrongPunch2.png,

RedEnemyStrongPunch3.png,

RedEnemyStrongPunch4.png,

RedEnemyStrongPunch5.png
X = 60, Y = 124

Kami juga perlu memberi Enemy pembolehubah Negeri, dan pembolehubah SightRange supaya kami tahu betapa dekatnya mereka harus menjadi Pemain untuk 'notis' mereka.

  1. Pergi ke acara Buat untuk Musuh.
  2. Tambah pembolehubah ini pada akhir kod:

Anda harus sedar bahawa keadaan permulaan untuk musuh tidak aktif. Negeri ini pada hakikatnya akan bertindak sebagai "mati" untuk Musuh. Dengan tidak termasuk kes untuk itu dalam pernyataan suis, kami akan menjamin bahawa sehingga Enemy beralih kepada salah satu "Aktif" negeri mereka, mereka tidak akan mengambil tindakan apa-apa. Dalam keadaan ini, mereka akan beralih kepada keadaan aktif apabila pemain memasuki BattleRegion bahawa mereka berada di dalamnya.

Tukar Kenyataan

Seterusnya kita akan menambah pernyataan Switch, sama dengan yang ada untuk Kamera, ke Peristiwa Langkah Musuh.

Ikut langkah-langkah ini:

  1. Pergi ke acara Langkah untuk Musuh.
  2. Selepas pernyataan jika memeriksa untuk memastikan musuh tidak mati, ganti kod yang menetapkan sprite musuh dengan kod berikut:

Ini adalah shell dasar pernyataan suis kami yang kami akan berkembang dari masa ke masa; Walau bagaimanapun, ia masih memberi kita gambaran yang baik tentang bagaimana pernyataan suis akhir akan berfungsi. Sekarang banyak kod ini hanya komen, tetapi kami akan menggantikannya tidak lama lagi, seperti yang telah kami lakukan sebelum ini.

Sebelum pernyataan Switch sebenarnya berjalan, Enemy memeriksa adakah mereka harus bertukar ke keadaan yang berbeza dari yang mereka sedang aktif. Kemudian, kami beralih kepada penyataan suis itu sendiri.

Negara pertama adalah negeri Idle, yang pada dasarnya hanya menghidupkan Enemy dan memeriksa adakah mereka harus secara rawak cuba menyerang. Oleh itu jika pemain berlaku untuk menjalankannya, ada kemungkinan mereka akan menyerang sebagai Pemain lulus. Negeri kedua dan ketiga adalah mod serangan sebenar kami. Negeri-negeri ini memberitahu Enemy untuk meletakkan sama ada di hadapan atau di belakang pemain dan bersedia untuk menyerang.

Sekarang negara kita tidak melakukan apa-apa kerana mereka hanya komen, tetapi jika anda melihat dengan teliti komen, anda perlu melihat sesuatu yang menarik. Beberapa tindakan, seperti "menghidupkan musuh" dan "semak untuk melihat jika musuh harus menyerang", diulang oleh pelbagai negeri. Oleh kerana blok kod ini diperlukan beberapa kali, kami akan membuat acara adat untuk mengendalikan tindakan ini untuk kami. Dengan cara ini kita tidak perlu mengetik semula perkara yang sama berulang kali.

Memilih Negeri/Kelakuan Baru

Perkara pertama yang dilakukan oleh langkah kami adalah menyemak untuk mengetahui sama ada Enemy perlu mengubah tingkah laku mereka, jadi perkara pertama yang akan kami lakukan ialah membuat Peristiwa yang boleh melihat status semasa Pemain dan keadaan permainan, untuk melihat apa yang harus dilakukan oleh Musuh.

Untuk mendapatkan idea bagaimana Musuh akan menentukan apa yang perlu dilakukan seterusnya, lihat rajah Negeri di bawah:

State Diagram of the Enemy AI

Rajah ini menerangkan bagaimana lelaran pertama Enemy AI kami akan berfungsi. Untuk meletakkannya semata-mata, Musuh akan bermula di Negeri Idel apabila pertempuran bermula. Jika Musuh berada dalam SightRange of the Player, mereka akan secara rawak beralih ke PositionBehind atau PositionFront.

Ini adalah AI yang cukup mudah, tetapi kami akan memperluaskannya apabila kami terus ke dalam siri ini.

Untuk membuat acara, ikuti langkah berikut:

  1. Di OBJ_Enemy, pilih Tambah Acara> Lain-lain> Ditetapkan Pengguna> Pengguna 0.
  2. Tambah Tindakan Kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Seperti yang anda lihat, acara ini menggunakan pernyataan suis untuk mencapai apa yang saya jelaskan di atas. Mula-mula ia menghasilkan pemboleh ubah rawak yang dipanggil MyAction yang akan digunakan untuk memilih Negeri baru dalam keadaan di mana terdapat banyak pilihan yang sah. Kemudian, dalam peralihan suis, jika State Enemy is Idle, dan Player berada dalam SightRange, mereka mempunyai peluang 50% beralih ke PositionBehind, dan peluang 50% beralih ke PositionFront.

Buat masa ini, itulah yang perlu kita lakukan.

Sekarang masuk ke acara Langkah lagi, dan gantikan komen yang mengatakan // Pilih keadaan baru berdasarkan ... dengan kod berikut:

Kami sangat dekat mempunyai kod kerja, tetapi kami masih perlu menambah kod yang mengaktifkan musuh di BattleRegion apabila pertempuran bermula. Ikuti langkah-langkah berikut untuk berbuat demikian:

  1. Dalam OBJ_BattleRegion, pilih Tambah Acara> Perlanggaran> OBJ_Enemy.
  2. Tambah Tindakan Kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Kod ini berjalan apabila terdapat perlanggaran antara musuh dan BattleRegion, dan ia memeriksa sama ada BattleRegion adalah Aktif, dan sama ada musuh tidak aktif. Jika kedua-dua perkara itu benar, ia mengaktifkan musuh dengan menetapkan keadaan mereka kepada Idle.

Sekiranya anda masuk dalam permainan sekarang, kod itu akan berfungsi secara teknikal, tetapi ia tidak akan memberi kesan yang nyata. Ini kerana negara-negara sebenarnya hanya komen yang menjelaskan apa yang mereka lakukan, dan bukannya kod sebenar.

Untuk mengesahkan bahawa ia berfungsi, dan melihatnya dalam tindakan, kami akan menambahkan kod debug ini buat sementara waktu hingga akhir Peristiwa Gila Enemy menarik acara.

Kod ini akan menulis State Enemy di bawah Sprite in-game mereka, dan membuatnya segera jelas apa yang sedang berlaku.

Kini apabila anda memasuki BattleRegion, anda harus melihat perubahan keadaan musuh dari Tidak aktif, ke Idle, dan kemudian dengan segera ke PositionFront atau PositionBehind.

menyerang

Memilih keadaan adalah permulaan yang baik, tetapi pertempuran kembali memerlukan musuh untuk memeriksa sama ada mereka berada dalam lingkungan pemain, dan sama ada mereka bersedia untuk menyerang. Untuk ini kita akan menggunakan pembolehubah yang disebut AttackRange, dan satu yang disebut Aggressiveness. AttackRange hanya memberitahu kita sejauh mana musuh perlu melakukan serangan, sedangkan Aggressiveness akan bermula pada 0, dan perlahan meningkat berdasarkan keadaan Enemy negeri. Semakin tinggi ia mendapat, semakin besar kemungkinan Enemy menyerang, dan menggunakan serangan yang lebih kuat apabila mereka melakukannya.

Untuk menambah pembolehubah ini, kembali ke dalam Enemy buat acara, dan tambahkan kod ini pada akhir acara:

Sekarang, untuk membuat serangan kita berfungsi, kita perlu menambah tiga lagi peristiwa kepada Enemy: satu peristiwa yang menentukan masa untuk menyerang, satu peristiwa yang melakukan serangan, dan satu peristiwa yang mengeset semula keadaan musuh selepas serangan itu. Mari kita mulakan dengan acara ini untuk memeriksa sama ada mereka harus menyerang:

  1. Dalam objek Musuh, pilih Tambah Acara> Lain-lain> Ditakrifkan Pengguna> Pengguna 1.
  2. Tambah Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Acara ini sangat mudah. Mula-mula ia memeriksa sama ada musuh berada di atas tanah, kerana mereka tidak mempunyai serangan udara. Kemudian ia memeriksa apakah pemain cukup dekat untuk menyerang berdasarkan jarak di antara mereka, dan apakah mereka berada pada Layer yang sama. Jika mereka cukup dekat untuk menyerang, dan musuh berada di lapangan, peningkatan agresif mereka, dan mereka mempunyai peluang untuk menyerang.

Sekarang mari kita buat serangan itu sendiri, supaya kita mempunyai peristiwa untuk memanggil apabila Musuh memutuskan untuk menyerang.

  1. Dalam objek Musuh, pilih Tambah Acara> Lain-lain> Ditetapkan Pengguna> Pengguna 2.
  2. Tambah Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Untuk acara ini, selagi pemain tidak mati, kod itu menghasilkan nombor rawak yang disebut AttackChance. Nombor ini digunakan dengan Aggressiveness musuh untuk menentukan sama ada musuh harus menggunakan serangan ringan atau serangan kuat. Sekiranya Aggressiveness dan AttackChance kedua-duanya agak tinggi, musuh menggunakan Serangan Kuat; jika tidak, mereka menggunakan Serangan Cahaya.

Selepas itu, ia menetapkan kelajuan musuh untuk 0 supaya mereka tidak bergerak ketika mereka menyerang, menetapkan keadaan musuh untuk Menyerang, mengeset semula agresif mereka, dan sepadan dengan sifat asas serangan ke sifat yang bersamaan musuh.

Sebelum kita pergi lagi, mari kita lihat bagaimana keadaan berfungsi setakat ini. Masuk ke Acara Langkah untuk musuh dan gantikan semua komen komen // Periksa untuk melihat apakah musuh harus menyerang dengan kod berikut:

Sekarang masuk ke dalam permainan, dan berdiri di dekat musuh selama beberapa saat. Dapatkan terus menentang mereka dan lihat apa yang berlaku. Mereka sepatutnya mula menyerang, dan, apabila mereka melakukannya, anda perlu memerhatikan Negeri dan animasi mereka. Jika anda tidak pasti berapa dekatnya anda harus menggunakannya sebagai gambar rujukan:

The position of the enemy

Anda harus perhatikan bahawa apabila musuh mula menyerang, mereka tidak akan pernah berhenti. Animasi itu seolah-olah berjalan selama-lamanya, dan Negara mereka tidak pernah menjadi Idle lagi. Ini kerana animasi musuh dan Negeri tidak pernah ditetapkan semula selepas serangan bermula; ia serupa dengan masalah yang kami ada bersama pemain. Jika anda berfikir tentang bagaimana kod diproses, maka perkara terakhir yang kami lakukan dengan animasi musuh adalah memilih salah satu daripada dua serangan itu, dan perkara terakhir yang kami lakukan dengan Negara mereka ditetapkan untuk 'Menyerang'. Walaupun serangan kami berfungsi sekarang, tanpa ketiga peristiwa yang saya nyatakan di atas, Enemy tidak pernah ''meneutralkan'' dan mengembalikan semula ke Idle.

Cara paling mudah untuk menetapkan semula Musuh adalah dengan menambah acara End Animation. Acara ini akan dijalankan setiap kali animasi selesai, dan akan memeriksa jika keadaan Enemy ditetapkan untuk Menyerang. Jika ya, ia bermakna mereka harus bertukar kepada keadaan lalai, dan menukar animasi. Jadi dalam senario di atas, momen animasi serangan pertama berakhir, ia akan menjalankan acara ini dan menetapkan semula semuanya supaya gelung itu tidak dimulakan semula.

  1. Dalam objek Musuh, pilih Tambah Acara> Lain-lain> Akhir Animasi.
  2. Tambah  Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Seperti yang saya katakan, kod tersebut memeriksa jika Enemy's State adalah ''Menyerang'', dan jika demikian ia menetapkan semula Negeri mereka kepada Idle.

Sekarang masuk ke dalam permainan lagi, dan lihat apa yang berlaku apabila anda melakukan perkara yang sama seperti dahulu. Anda kini perlu melihat semula Negeri sekiranya anda menonton teks di bawah Musuh, tetapi animasi masih akan kekal selama-lamanya. Masalahnya ialah kita masih belum menambah sebarang kod untuk menghidupkan Enemy berdasarkan Negara mereka. Inilah yang akan kami lakukan seterusnya.

Mengubah Musuh

Satu-satunya animasi yang kita perlukan sekarang ialah untuk Musuh untuk beralih ke Spit Idle selepas serangan mereka berakhir. Walaupun kami hanya boleh menambah kod ini pada acara Endapan Animasi, atau bahkan ke kes Idle di Acara Langkah, kami akhirnya akan memerlukan kawalan yang lebih tepat terhadap animasi Enemy.

Oleh sebab itu, kami akan membuat Acara baru yang khusus untuk menangani animasi. Sebenarnya, jika anda melihat semula pada Perjumpaan Langkah kami, anda akan melihat dalam kod komen bahawa kami sudah mempunyai beberapa tempat untuk meletakkan acara animasi ini sebaik sahaja kami membuatnya.

  1. Dalam objek Musuh, pilih Tambah Acara> Lain-lain> Ditetapkan Pengguna> Pengguna 3.
  2. Tambah Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Pada masa ini, semua kod ini tidak ditetapkan animasi Enemy ke Idle tidak kira apa keadaan mereka. Akhirnya, kami akan menambah kod yang menubuhkan Animasi Berjalan apabila mereka bergerak, dan juga beberapa animasi khusus yang hanya digunakan untuk acara tertentu.

Sekarang kita hanya perlu kembali ke Acara Peristiwa, dan menggantikan semua contoh komentar // Hatikan musuh dengan kod berikut:

Jika anda kembali ke permainan pada ketika ini, anda harus melihat bahawa isu animasi kami diselesaikan, dan musuh sedang menukar keadaan dengan betul.

Menambah Bar Kesihatan

Sekarang serangan Enemy kami kelihatannya berfungsi, tetapi anda mungkin dapat melihat masalah jika anda membiarkan mereka memukul anda beberapa kali. Tidak kira berapa lama anda berdiri di sebelah musuh dan biarkan mereka memukul anda, anda sepatutnya tidak mati. Lebih-lebih lagi, kami tidak tahu sama ada anda sudah kehilangan kesihatan. Oleh kerana ini penting untuk mengesahkan bahawa serangan musuh berfungsi, inilah yang akan kami lakukan seterusnya.

Sebelum kita dapat mengetahui mengapa anda tidak mati, kita perlu tahu sama ada anda terluka, jadi mari tambah Bar Kesihatan untuk pemain. Untuk melakukan ini, kami akan memberi pemain satu acara GUI Draw.

  1. Dalam objek Musuh, pilih Tambah Acara> Draw> Draw GUI.
  2. Tambah Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:

Kod ini tidak banyak dilakukan, tetapi ia harus memberi kita bar kesihatan asas untuk watak kita. Pertama ia menarik segi empat tepat hitam yang mudah digunakan sebagai garis besar bagi Bar Kesihatan. Selepas itu, ia menggambar persegi panjang untuk bertindak sebagai latar belakang apabila Pemain telah kehilangan kesihatan. Akhir sekali, jika pemain masih mempunyai kesihatan, ia menarik bar hijau untuk kesihatan itu sendiri.

Lebar bar hijau ditetapkan dengan mendaratkan lebar maksimum 242 piksel bar kesihatan oleh fraksi CurrentHP / MaxHP. Dengan cara ini bar kesihatan Hijau akan sentiasa bersaiz mengikut kadar berdasarkan jumlah kesihatan yang telah ditinggalkan pemain.

Jika anda pergi dalam permainan sekarang, anda akan melihat bar Kesihatan di sudut kiri atas:

The HealthBar in the top-left corner of the dashboard

Jika anda pergi ke Enemy sekali lagi dan mula diserang, kini harus jelas bahawa anda sedang merosakkan.

Menetapkan semula IsHit Pemain

Walaupun kita tahu Pemain yang dipukul, perkara-perkara masih tidak sempurna. Pergi dalam permainan, dan cuba menyerang Enemy atau bergerak selepas anda terkena salah satu serangan mereka. Walaupun kawalan anda berfungsi dengan sempurna sebelum dipukul, ketika anda merosakkan, anda tidak dapat bergerak atau menyerang lagi.

Ini berlaku kerana kod serangan pemain dalam Pengguna Ditakrifkan 2, dan kod pergerakan mereka dalam peristiwa Langkah kedua memerlukan IsHit untuk salah. Anda boleh melihat Pengguna Ditetapkan 2 di bawah:

IsHit in the Attack Event

Tidak seperti dengan Musuh kami, walaupun, selepas Pemain terkena, kami tidak pernah menetapkan semula pemboleh ubah IsHit. Jadi, mari tambah peristiwa penggera untuk melakukannya.

Jika anda melihat kembali pada kod perlanggaran OBJ_ATK untuk Pemain, anda akan melihat bahawa kami sudah mempunyai beberapa kod di tempat untuk menjalankan acara penggera dan mencetuskan Pemain.

Existing StunLength code

Jadi satu-satunya perkara yang perlu kita lakukan pada ketika ini ialah menambah beberapa kod untuk menetapkan semula IsHit, dan memberi pemain animasi IsHit.

  1. Dengan OBJ_Player, pilih Tambah Acara> Penggera> Penggera 3.
  2. Tambah Tindakan kuasa > Kod> Jalankan Kod.
  3. Tambah kod berikut:
  1. Dengan OBJ_Player, pergi ke langkah acara.
  2. Buka kod untuk Langkah acara.
  3. Tambahkan pernyataan yang lain pada akhir pernyataan jika yang mengendalikan kod pergerakan Pemain.

Kod pergerakan anda sekarang akan kelihatan seperti ini, dengan bahagian baru yang digariskan dalam warna merah:

Updated Player Movement code

Sekarang apabila anda masuk dalam permainan, anda tidak sepatutnya mempunyai sebarang masalah menyerang atau bergerak, selepas anda diserang.

Membunuh Pemain

Sekarang bahawa Pemain semakin rosak, permainan ini benar-benar bermula bersama, tetapi kami masih mempunyai satu lagi isu untuk ditangani. Jika anda berdiri di hadapan musuh terlalu lama, akhirnya anda akan kehabisan kesihatan, dan apabila anda melakukannya, anda mungkin akan melihat ralat seperti ini:

Error Message show on Player Death

Mesej ralat penyahkulasakan boleh menjadi sedikit seni, tetapi ini sebenarnya cukup jelas. Kesalahan ini merujuk kepada peristiwa langkah OBJ_Camera, dan secara khusus ia mengatakan bahawa peristiwa langkah mengalami masalah mendapatkan akses ke objek OBJ_Player. Ini berlaku kerana objek Pemain tidak lagi wujud. Jika anda melihat semula pada acara langkah Player kami, anda akan melihat bahawa Player segera memanggil instance_destroy () apabila CurrentHP kurang daripada 0.

Existing Death Code

Ini bermakna bahawa saat pemain mati, objek Pemain dimusnahkan, dan Kamera tidak lagi dapat mengikutinya.

Oleh itu, mari tambahkan beberapa kod untuk menyelesaikan kesilapan ini dan berikan pemain keupayaan untuk mencuba semula apabila mereka mati.

Untuk membetulkan isu Kamera, kami akan menetapkan keadaan Kamera kepada 'Mati' apabila Pemain mati. Dengan cara ini, tiada satu lagi keadaan kamera yang lain akan dijalankan, dan kamera tidak akan cuba mengakses mana-mana pembolehubah Pemain. Kita boleh dengan mudah memusnahkan kamera apabila kita memusnahkan Pemain, tetapi melakukan itu akan menghalang kita daripada memanipulasi kamera selepas Pemain mati, jadi saya mendapati lebih baik untuk mempunyai keadaan mati sebenar, sekiranya kita mahu menambah animasi yang sejuk atau kesan kemudian.

  1. Di OBJ_Player, pergi ke Langkah acara.
  2. Dalam kod untu Langkah acara, gantikan kod tersebut dalam pernyataan lain yang diserlahkan di atas dengan kod berikut:

Sekarang jika anda pergi dalam permainan dan biarkan Pemain mati, anda tidak sepatutnya mempunyai sebarang ralat mesej  Di sisi lain, walaupun mereka mati, Pemain segera hilang, dan menjadi mustahil untuk melakukan apa-apa, kerana pemain tidak pernah menghidupkan semula, dan kami tidak mempunyai skrin Game Over.

Untuk membetulkannya, kami akan memberikan animasi kematian pemain itu, dan menyediakan penggera asas yang akan memulakan semula permainan 3 saat selepas pemain mati. Ini akan menjadi lebih menarik, dan membenarkan permainan diteruskan. Akhirnya kami akan menambah skrin Game Over dan juga meningkatkan animasi kematian, tetapi pada masa ini, ini harus menjadi alternatif yang baik.

Pertama mari kita import sprite.

Nama Sprite Imej Kedudukan Asal
SPR_PlayerDead

PlayerDead.png

X = 72, Y = 67

Kini kami akan membuat satu perubahan terakhir pada acara yang membunuh Pemain.

  1. Di OBJ_Player, pergi ke langkah acara.
  2. Dalam kod untuk acara Langkah acara, gantikan kod instance_destroy () dengan yang berikut:

Perkara terakhir yang perlu kita lakukan untuk ini adalah membuat acara penggera yang akan memulakan semula permainan.

  1. Di OBJ_Player, pergi ke Tambah Acara> Penggera> Penggera 1.
  2. Tambah Kawalan Tindakan> Kod> Jalankan Kod.
  3. Tambah kod berikut:

Sekarang apabila anda masuk dalam permainan dan biarkan diri anda terbunuh, anda harus melihat kematian pemain ''animasi'' bermain, dan permainan harus dimulakan semula selepas 3 saat. Ia tidak sempurna, tetapi ia adalah permulaan yang baik.

The Players Death Animation

Memperbaiki Hit Musuh

Perkara terakhir yang akan kita lakukan ialah membetulkan masalah yang dicipta oleh penambahan Pernyataan Tukar ke Peristiwa Langkah Musuh. Jika anda pergi dalam permainan dan menyerang Musuh, anda akan melihat bahawa mereka tidak lagi terkejut apabila mereka dipukul. Apabila kami menambah pernyataan suis, kami menindih semula kod itu, dan dengan itu kami menghapuskan kesan ini. Malangnya, acara animasi yang kami buat beberapa minit yang lalu akan menjadikan ini sangat mudah untuk ditambah kembali.

Daripada pengekodan sistem yang sama sekali baru, atau mengubahsuai FSM untuk mengendalikan pembolehubah IsHit yang kami buat dalam tutorial terakhir, kami akan membuat Negeri baru, dan menggantikan pembolehubah ini dengan Negara tersebut. Perkara pertama yang akan kami lakukan adalah membuang pemboleh ubah IsHit dari kejadian Buat, kerana kami tidak lagi memerlukannya.

Padamkan baris kod ini dari Buat Acara.

Seterusnya, kami akan masuk ke objek Attack dan mengeditnya supaya ia menetapkan Negara untuk Hit, daripada membuat IsHit benar.

  1. Pergi ke ATK objek.
  2. Buka acara perlanggaran OBJ_Enemy.
  3. Gantikan baris kod yang menetapkan IsHit = true; dengan kod berikut:

Sekarang kita perlu membuat sedikit perubahan kepada objek Enemy. Mula-mula kita perlu mengubah suai kod penggera yang mengesetkan status Enemy, supaya ia mengubah semula Negeri dan bukannya pembolehubah IsHit.

  1. Pergi ke objek Enemy.
  2. Buka penggera 0 acara.
  3. Gantikan kod dengan yang berikut:

Kami juga perlu menambah keadaan ''Hit'' pada peralihan suis dalam acara animasi.

  1. Pergi ke objek Enemy.
  2. Buka Defined Pengguna 3.
  3. Tambah kes baru kepada penyataan Suis dengan kod berikut:

Akhirnya, kita perlu menambah kes Hit ke dalam pernyataan suis Langkah Peristiwa juga, supaya acara animasi akan berjalan apabila musuh berada di negara Hit.

  1. Pergi ke objek Enemy.
  2. Buka acara Langkah.
  3. Tambah kes baru kepada penyataan Suis dengan kod berikut:

Selepas semua itu, jika anda kembali ke permainan, musuh-musuh sepatutnya terkejut apabila anda menyerang mereka.

Kesimpulan

Walaupun pertempuran kita masih memerlukan banyak kerja, sejak pemain akhirnya memerlukan Acara Stun sendiri, dan musuh-musuh dapat bergerak, itu permulaan yang baik.

Dalam tutorial seterusnya, kita akan menangani serangan musuh dan serangan combo.

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.