Advertisement
  1. Code
  2. Coding Fundamentals
  3. Game Development

Membangun Beat 'Em Up di Game Maker, Bagian 2: Combat dan Basic Enemy AI

Scroll to top
Read Time: 31 min

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

Dalam artikel terakhir kita membahas bagaimana membuat pemain bergerak dan mengintegrasikan beberapa mekanisme tempur dasar. Ini adalah awal yang baik, tetapi kami masih memiliki beberapa hal yang harus dilakukan sebelum ini mulai terasa seperti game nyata.

Artikel ini akan fokus pada pembuatan kamera yang dinamis, membuat BattleRegions atau area untuk pertempuran berlangsung, dan memberi musuh kemampuan untuk mulai menyerang balik. 

Sama seperti di artikel sebelumnya, pastikan Anda mengunduh paket Aset untuk artikel ini sebelum Anda memulai. 

Menciptakan Kamera

Game Maker menggunakan Views untuk mengontrol bagaimana perilaku kamera. Biasanya kita bisa mengatakan pandangan kita untuk mengikuti Player dan berhenti di situ, tetapi pada akhirnya kamera kita akan memerlukan perilaku khusus seperti efek goyangan setelah serangan hebat. Jika kamera terpasang langsung ke pemain, ini bisa sangat menantang untuk diterapkan. Sebaliknya, kita akan membuat objek kamera yang akan diikuti oleh pandangan, dan memprogram perilaku khusus langsung ke dalamnya.

Pertama, mari impor Kamera sprite. Ini terletak di folder Aset yang Anda unduh untuk Tutorial di bawah Images > SPR_Camera.png.

Sprite Name Gambar Asal
SPR_Camera SPR_Camera.png X = 14, Y = 12

Meskipun kamera tidak terlihat, tampilan akan mengalami masalah jika tidak memiliki sprite yang terkait dengannya, jadi itulah mengapa kami mengimpor gambar ini.

Sekarang mari kita buat objek kamera yang sebenarnya.

  1. Klik kanan folder Object dan pilih Create Object.
  2. Nama objek OBJ_Camera.
  3. Hapus centang pada atribut Visible.
  4. Klik Add Event > Create.
  5. Tambahkan Aksi Control > Code > Execute Code.
  6. Tambahkan kode berikut:
1
view_object[0] = OBJ_Camera;
2
 
3
 view_vborder[0] = 384;
4
 view_hborder[0] = 512;
5
 
6
 view_visible[0] = true;
7
 
8
 x = OBJ_Player.x;
9
 y = OBJ_Player.y;
10
 
11
 TargetX = x;
12
 TargetY = y;
13
 
14
 State = "Player";
15
 
16
 MoveSpeed = 15;

Semua kode ini tidak mengatur 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 bisa sampai ke tepi tampilan sebelum tampilan mulai bergulir dengan level. Jika Anda ingin kamera / pemain tetap berada di tengah layar, Vborder harus setengah tinggi layar permainan, dan Hborder harus setengah lebar. Akhirnya, pengaturan view_visible ke true membuat tampilan ini aktif dalam game.

Setelah menetapkan nilai-nilai itu, kami menempatkan kamera pada posisi yang sama dengan Player, dan membuat variabel TargetY dan TargetY. Variabel-variabel ini akan digunakan untuk mengarahkan pergerakan kamera dan memberi tahu ke mana harus pergi. Kemudian kita memiliki variabel State yang akan digunakan untuk mengontrol perilaku kamera. Akhirnya, MoveSpeed menentukan seberapa cepat Kamera bergerak ke posisi Target.

Sekarang kita akan menambahkan gerakan kode dasar ke Step Event.

  1. Dengan objek Camera dipilih, Add Event > Step > Step.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
TargetX = OBJ_Player.x;
2
 TargetY = OBJ_Player.y;
3
 
4
 if(distance_to_point(TargetX,TargetY) < MoveSpeed){
5
 
6
     x = TargetX;
7
     y = TargetY;
8
     speed = 0;
9
 
10
 }else{
11
 
12
     move_towards_point(TargetX,TargetY,MoveSpeed);
13
 
14
 }

Peristiwa langkah ini memberitahu kamera untuk mengikuti pemain. Pertama, mengatur posisi target ke posisi pemain. Kemudian, jika jarak ke posisi target lebih besar dari kecepatan gerakan Kamera, ia mulai bergerak menuju target; jika tidak, akan terkunci ke posisi target dan berhenti.

Itu semua Kamera perlu lakukan untuk saat ini, jadi mari kita membuat objek kamera dalam game dan mulai mengujinya. Kami hanya bisa menjatuhkan kamera di ruangan dengan pemain itu sendiri, tetapi kami akan memiliki objek Player membuat kamera sebagai gantinya. Karena kamera bergantung pada Player untuk berfungsi, membuat Player membuat kamera mencegah kita melupakan kamera di masa depan, dan memastikan tidak ada masalah dengan urutan objek dibuat.

  1. Pergi ke objek pemain OBJ_Player.
  2. Buka kode untuk acara Create.
  3. Di bagian paling akhir kode, tambahkan baris kode ini:
1
MyCamera = instance_create(x,y,OBJ_Camera);

Akhirnya, kita perlu mengaktifkan Views di dalam ruangan, jika tidak, Kamera tidak akan berfungsi.

  1. Pergilah ke room0, ruangan yang kami buat di tutorial terakhir.
  2. Pergi ke views tab.
  3. Centang Enable the use of Views.
  4. Kemudian pilih View 0 dari daftar Lihat, dan centang kotak yang bertuliskan Visible when room starts.

Jika Anda menguji gim ini sekarang, semuanya akan terlihat sama seperti sebelumnya karena ruangan itu dengan sempurna memenuhi tampilan. Untuk melihat perubahan dalam aksi ini, kita perlu menjadikan ruangan lebih luas atau lebih tinggi daripada sekarang.

  1. Pergilah ke room0, ruangan yang kami buat di tutorial terakhir.
  2. Pergi ke tab settings.
  3. Atur Width = 3000.

Sekarang ketika Anda masuk dalam game, dan Anda mencoba untuk melewati Musuh, Anda harus memperhatikan bahwa ruangan bergulir dengan pemain saat mereka bergerak. Secara teknis itu bergulir dengan kamera, tetapi tampaknya seolah-olah mengikuti Player karena itulah yang dilakukan kamera.

Anda juga dapat mencoba meningkatkan Ketinggian ruangan, dan Anda akan melihat efek yang sama.

Wilayah Pertempuran

Dalam beat klasik, pertempuran umumnya terbatas pada area yang satu atau dua layar besar pada satu waktu. Ketika pertarungan dimulai, kamera dan pemain menjadi terkunci di daerah tempat pertempuran terjadi, dan tidak bisa meninggalkannya sampai pertarungan selesai. Hal ini membuat pertemuan musuh lebih mudah untuk dikendalikan, AI lebih mudah dibangun, dan membuat pertarungan lebih terfokus. Jika Anda masih tidak yakin apa yang saya bicarakan, lihatlah Let's Play of Castle Crashers ini, dan perhatikan apa yang terjadi ketika mereka memasuki pertempuran.

Ketika pertempuran dimulai, gerakan mereka menjadi terbatas, dan dalam beberapa kasus, perilaku kamera akan berubah. Agak sulit untuk diperhatikan ketika Anda tidak mencarinya, tetapi kamera cenderung "sedikit" sedikit ke area pertempuran begitu pertempuran dimulai. Untuk membuat efek ini di permainan kami, kami akan menambahkan objek BattleRegion yang akan bertindak sebagai semacam arena pertempuran berlangsung. Setelah pemain memasuki BattleRegion , itu akan mengambil alih kamera dan membatasi gerakan mereka sampai pertempuran berakhir.

Pertama kita membutuhkan Sprite untuk Wilayah Pertempuran kami.

  1. Klik kanan folder Sprite dan pilih Create New Sprite.
  2. Nama sprite SPR_BattleRegion.
  3. Klik Edit Sprite.
  4. Buka File > New.
  5. Di dialog Baru, atur ukuran gambar ke 1024x768, dan tekan OK. Saya memilih ukuran gambar ini karena itu adalah resolusi aktual permainan kami. Karena BattleRegions akan dapat diubah ukurannya, memiliki ukuran default adalah ukuran layar akan sangat mudah untuk merancang pertemuan dengan cepat.
  6. Klik dua kali gambar baru untuk membuka editor gambar.
  7. Gunakan Paint Bucket untuk mengisi seluruh gambar dengan satu warna. Wilayah Pertempuran tidak akan terlihat dalam game, jadi Anda dapat memilih warna yang Anda inginkan di sini. Pastikan saja Anda memilih warna yang mudah dilihat dan terlihat jelas saat mengedit level. Saya memilih warna biru cerah.
  8. Gunakan Tanda Centang untuk menyimpan sprite.
  9. Ketengahkan pivot point.
  10. Tekan OK untuk menyimpan sprite dan keluar dari editor sprite.

Selanjutnya kita akan membuat objek Wilayah Pertempuran.

  1. Klik kanan folder Objek dan pilih Buat Objek.
  2. Nama objek OBJ_BattleRegion.
  3. Setel sprite ke SPR_BattleRegion.
  4. Hapus centang pada kotak centang Visible.
  5. Klik Add Event > Create.
  6. Tambahkan Aksi Control > Code > Execute Code.
  7. Tambahkan kode berikut:
1
IsActive = false;
2
 
3
 RegionHeight = sprite_height; 
4
 RegionWidth = sprite_width;
5
 
6
 LeftEdge = x-RegionWidth/2;
7
 RightEdge = x+RegionWidth/2;
8
 TopEdge = y-RegionHeight/2;
9
 BottomEdge = y+RegionHeight/2;
10
 
11
 HasEnemies = false;

Ini adalah kode kreasi kami. Variabel IsActive memberitahu kita apakah BattleRegion telah diaktifkan.Dengan kata lain, ia memberi tahu kita apakah pertempuran telah dimulai, dan apakah musuh di wilayah itu masih hidup. Ini mulai salah, tetapi akan menjadi benar ketika pemain masuk dan tetap benar sampai mereka membunuh semua musuh. RegionHeight dan RegionWidth memberi kita variabel untuk mengakses ukuran BattleRegion, sementara empat variabel setelah itu memberi tahu kita persis di mana ujung-ujungnya.

Kami akan berakhir membutuhkan banyak nilai ini, jadi bisa dengan mudah mereferensikannya, tanpa mengerjakan matematika setiap waktu, akan sangat membantu nantinya. Akhirnya, HasEnemies adalah Boolean sederhana yang akan memberi tahu kita apakah wilayah tersebut memiliki musuh yang masih hidup. Setelah BattleRegion diaktifkan, itu tidak akan dapat menonaktifkan kecuali jika variabel ini salah.

Selanjutnya kita akan menambahkan beberapa kode untuk mengaktifkan BattleRegion ketika pemain masuk.

  1. Di OBJ_BattleRegion, klik Add Event > Collision > OBJ_Player.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
if(point_in_rectangle(OBJ_Player.x, OBJ_Player.y, LeftEdge+abs(OBJ_Player.sprite_width)/2+10, TopEdge+20, RightEdge-abs(OBJ_Player.sprite_width)/2-10, BottomEdge-20) && HasEnemies == true){
2
 
3
     IsActive = true;
4
 
5
 }

Sementara pernyataan if dalam kode ini cukup panjang, sebenarnya hanya menguji dua hal. Pertama itu menguji apakah Player berada dalam batas-batas BattleRegion, tetapi mengabaikan buffer kecil sekitar 20 piksel di tepi bagian dalam BattleRegion. Ini dilakukan untuk memastikan bahwa pemain sepenuhnya berada di dalam kawasan, dan tidak berdiri di tepi paling depan, sebelum diaktifkan. Hal kedua yang diperiksa adalah apakah HasEnemies benar. Jika keduanya benar, itu mengaktifkan BattleRegion.

Akhirnya kita perlu menonaktifkan BattleRegion ketika pertempuran berakhir, dan pastikan bahwa HasEnemies diatur menjadi benar ketika ada Musuh di wilayah tersebut. Kita dapat melakukan ini di Acara Langkah.

  1. Di OBJ_BattleRegion, klik Add Event > Step.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
if(instance_exists(OBJ_Enemy) && point_in_rectangle(OBJ_Enemy.x, OBJ_Enemy.y,LeftEdge,TopEdge,RightEdge,BottomEdge)){
2
 
3
     HasEnemies = true;
4
 
5
 }else{
6
 
7
     HasEnemies = false;
8
     IsActive = false;
9
 
10
 }

Kode ini memeriksa apakah ada musuh yang tersisa di ruangan itu, dan jika ada musuh yang berada di dalam BattleRegion. Jika keduanya benar, itu membuat HasEnemies menjadi benar; jika tidak, itu membuatnya salah dan menonaktifkan BattleRegion.

Hal terakhir yang harus Anda lakukan adalah menambahkan BattleRegion ke level, dan uji game untuk melihat apa yang terjadi. Saat Anda menambahkannya, pastikan bahwa musuh yang Anda tempatkan berada dalam batas-batas BattleRegion. Anda juga dapat memiliki beberapa BattleRegions, tetapi Anda harus memastikan mereka tidak tumpang tindih. Anda dapat melihat bagaimana saya mengatur BattleRegion saya di bawah ini:

The Battle RegionThe Battle RegionThe Battle Region

Membatasi Gerakan Pemain

Jika Anda pergi dalam permainan untuk menguji BattleRegion Anda, Anda mungkin memperhatikan bahwa tidak ada yang terjadi ketika Anda memasuki BattleRegion. Itu karena tidak ada pergerakan atau kode kamera berubah ketika BattleRegion aktif. Saat ini, mengaktifkan BattleRegion pada dasarnya adalah tindakan yang tidak berguna karena kita tidak pernah mengatakan salah satu dari objek lain untuk melakukan sesuatu tentang fakta bahwa itu aktif. Untuk memperbaikinya, kita perlu menyesuaikan Player dan objek Camera sehingga mereka memperhitungkan batas-batas BattleRegion ketika aktif.

Untuk Player, kami ingin memastikan bahwa mereka tidak dapat meninggalkan BattleRegion sampai semua musuh mereka dikalahkan. Untuk melakukan ini, kita perlu memodifikasi kode gerakan itu sendiri.

  1. Pergi ke OBJ_Payer.
  2. Pergi ke acara Langkah Pemain.
  3. Pada awal acara Langkah Pemain, tambahkan kode ini:
1
var MyBR = instance_nearest(x,y,OBJ_BattleRegion);

Kode ini menyimpan BattleRegion terdekat dalam variabel sehingga Pemutar dapat dengan mudah merujuknya dalam kode gerakan.

  1. Masih dalam even OBJ_Player's Step.
  2. Tambahkan kode berikut di awal pernyataan IsAttacking if, sebelum kode apa pun yang ada dalam pernyataan if tersebut:
1
if(MyBR.IsActive == true){
2
     if(point_in_rectangle(x+XSpeed*SpeedMod, y, MyBR.LeftEdge+35, MyBR.TopEdge, MyBR.RightEdge-35, MyBR.BottomEdge)==false ||  place_free(x+XSpeed*SpeedMod, y)==false){
3
         XSpeed = 0;
4
     }  
5
     
6
     if(point_in_rectangle(x, y+YSpeed*SpeedMod, MyBR.LeftEdge+35, MyBR.TopEdge, MyBR.RightEdge-35, MyBR.BottomEdge)==false || place_free(x, y+YSpeed*SpeedMod)==false){
7
         YSpeed = 0;
8
     }
9
 }

Meskipun kode ini terlihat panjang, itu sangat sederhana. Pertama, memeriksa apakah BattleRegion aktif.Jika ya, kemudian melihat posisi X potensial Player berdasarkan XSpeed mereka. Jika kecepatan mereka saat ini akan menempatkan mereka di luar dari BattleRegion, atau menyebabkan mereka bertabrakan dengan objek bertanda Solid, ia menetapkan XSpeed ke 0. Kemudian ia melakukan pemeriksaan yang sama untuk YSpeed.

Jika Anda masuk ke dalam game dan menguji kode baru ini, gerakan Anda akan menjadi terbatas pada batas-batas BattleRegion sampai Anda membunuh semua Musuh.

Perilaku Kamera: Pengantar Finite State Machines

Namun, semuanya masih belum sempurna. Meskipun Player tidak bisa keluar dari BattleRegion, kamera bisa. Karena itu, jika kita pergi ke tepi BattleRegion, jelas Player akan menyentuh dinding tak terlihat di tengah layar, dan tidak bisa bergerak lebih jauh, tetapi bagian luar BattleRegion masih terlihat.

The visible Battle RegionThe visible Battle RegionThe visible Battle Region

Jelas akan lebih baik jika kamera dibatasi dengan cara yang sama seperti Player, dan itu tidak bisa pindah ke lokasi di mana Anda akan melihat melewati tepi BattleRegion. Untuk melakukan itu, kita akan membuat Finite State Machine, atau FSM, yang akan memungkinkan kita mendikte bagaimana perilaku kamera berdasarkan keadaan permainan saat ini.

Hingga Mesin Negara memungkinkan Anda memisahkan masing-masing perilaku objek ke dalam bagian-bagian terpisah dari kode yang disebut Negara. Kemudian, dengan menggunakan Pernyataan Beralih, Anda dapat memeriksa apa yang menyatakan objek tersebut, dan hanya menjalankan kode yang relevan. Ini membuat kode Anda mudah diikuti dan sangat serbaguna. Ini juga membuat memperluas kode menjadi mudah, karena kita dapat membuat Negara baru kapan saja diperlukan perilaku baru, daripada memperumit pernyataan if dan basis kode kita yang sudah ada.

Untuk kamera kami, kami akan membuat dua Negara: Pemain dan Wilayah. Player akan mengikuti Player sedekat mungkin ketika mereka tidak dalam Battle, dan akan melakukan pada dasarnya semua yang dilakukan kamera kita sekarang. Region akan mengambil alih ketika pemain memasuki BattleRegion yang aktif, dan akan memastikan kamera tidak dapat bergerak melewati batas wilayah, sambil menjaga pemain tetap terlihat sepanjang waktu.

Kami sudah memiliki variabel Negara di Kamera, mulai dari saat kami membuatnya lebih awal, sehingga kami dapat langsung masuk ke gedung FSM yang sebenarnya.

  1. Pergi ke OBJ_Camera.
  2. Buka kode even Step.
  3. Ganti kode yang menetapkan TargetX dan TargetY dengan yang berikut:
1
MyBR = instance_nearest(x,y,OBJ_BattleRegion);
2
 
3
 switch State{
4
 
5
     case "Player":
6
 
7
     //This code will determine the target position when the camera is following the player, and check if the Camera's state should switch to Region

8
     
9
     case "Region":
10
     //This code will determine the target position when the camera is locked into the BattleRegion, and check if the camera's state should switch to Player

11
 
12
 }

Kode ini menjabarkan struktur dasar dari Event Step baru. Pertama kamera menemukan BattleRegion terdekat dan menyimpannya dalam variabel yang disebut MyBR, sama seperti Player. Kemudian pernyataan switch melihat keadaan dan menjalankan kode yang sesuai.

Meskipun ini adalah pernyataan switch yang cukup sederhana, dan kita bisa mencapai sesuatu yang mirip dengan pernyataan if, akhirnya kita akan membutuhkan lebih banyak status, jadi ada baiknya untuk berpikir ke depan dan membuat pernyataan switch sekarang.

Pertama, mari tambahkan kode untuk kasus Player. Tambahkan kode ini sebagai pengganti komentar di kotak Player:

1
TargetX = OBJ_Player.x;
2
 TargetY = OBJ_Player.y;
3
 
4
 if(MyBR.IsActive == true){
5
     State = "Region";
6
 }
7
 break;

Kode ini berperilaku persis sama dengan kode yang kami ganti dengan pernyataan switch, dan menetapkan posisi Target ke posisi Player. Setelah itu memeriksa apakah BattleRegion aktif. Jika ya, beralih ke status Region. Akhirnya, kami memiliki waktu break; pernyataan, yang digunakan dalam pernyataan switch untuk mengakhiri kode dan mencegah negara lain dari diproses.

Selanjutnya, kami akan menambahkan perilaku untuk negara Wilayah. Tujuan dari kondisi ini adalah untuk menjaga kamera dalam batas-batas BattleRegion setiap saat dan memastikan bahwa tidak peduli di mana Player masuk dalam wilayah tersebut, mereka akan terlihat. Untuk melakukan itu, kami akan menentukan posisi X dan Y minimum dan maksimum yang bisa masuk ke kamera sebelum bagian luar BattleRegion terlihat.

Kemudian, jika Player berada di dalam area minimum/maksimum, kamera akan mengikuti mereka seperti biasanya, dan jika Player keluar dari area itu, ke tepi BattleRegion, kamera akan tetap dapat melihat mereka. ketika menyentuh batas minimum/maksimum.

Ganti komentar negara Region dengan kode di bawah ini:

1
var MinX = OBJ_BattleRegion.LeftEdge+512;
2
 var MaxX = OBJ_BattleRegion.RightEdge-512;
3
 
4
 var MinY = OBJ_BattleRegion.TopEdge+384;
5
 var MaxY = OBJ_BattleRegion.BottomEdge-384;   
6
 
7
 TargetX = clamp(OBJ_Player.x,MinX,MaxX);
8
 TargetY = clamp(OBJ_Player.y,MinY,MaxY);
9
 
10
 if(MyBR.IsActive == false || distance_to_object(OBJ_BattleRegion) > 0){
11
      State = "Player";
12
 }
13
 
14
 break;

Pertama kode ini menetapkan posisi X dan Y minimum dan maksimum untuk kamera, dengan mengambil tepi BattleRegion dan menambahkan buffer yang setengah tinggi dan lebar layar di semua sisi. Penyangga ini memungkinkan kamera sedekat mungkin ke tepi wilayah, tanpa membuat apa pun di luar BattleRegion terlihat. Anda dapat melihat apa  yang saya maksud pada gambar di bawah ini.

Camera PlacementCamera PlacementCamera Placement

Dalam hal ini area biru mewakili BattleRegion, dan kotak dengan garis merah mewakili kamera. Area biru gelap adalah penyangganya, sedangkan area biru muda adalah area di mana kamera dapat bergerak bebas. Seperti yang Anda lihat, pusat kamera dengan sempurna menabrak tepi buffer ketika berada di tepi dari BattleRegion.

Setelah itu, kamera menggunakan fungsi klem untuk mengatur TargetX dan TargetY berdasarkan posisi Player, minimum, dan maksimum. Akhirnya, tes ini untuk melihat apakah BattleRegion masih aktif, atau apakah kamera telah berada di luar batas BattleRegion, dan mengembalikan keadaan ke Player jika memang benar.

Sekarang jika Anda pergi dalam game untuk menguji BattleRegion, ia harus berperilaku persis seperti yang kita inginkan dan lancar transisi antara negara-negara yang berbeda ketika BattleRegion menjadi aktif atau tidak aktif.

Cara terbaik untuk melihat Kamera dalam aksi, adalah untuk membuat lebar atau tinggi BattleRegion lebih besar dari lebar atau tinggi layar. Jika Anda tidak mengubah ukuran BattleRegion, dan membiarkannya dengan ukuran yang sama dengan tampilan kamera, maka kamera tidak akan bergerak sama sekali ketika BattleRegion aktif sejak BattleRegion persis sama dengan ukuran layar.

Setelah Anda selesai menguji perilaku kamera, Anda harus kembali ke OBJ_BattleRegion dan hapus centang pada kotak centang Visible. Dengan cara ini, BattleRegion tidak akan terlihat dalam game.

Dasar Musuh AI

Memukuli musuh yang tak berdaya adalah hal yang menyenangkan, tetapi permainan kami membutuhkan lebih dari sekadar tas-tas tinju yang dimuliakan agar menarik. Paling tidak, kita harus memberi mereka kemampuan untuk menyerang kita kembali.

Untuk AI kami, kami akan menggunakan Finite State Machine lainnya. Negara-negara musuh kita bisa termasuk Wandering/Patroli ketika mereka tidak memiliki target, Mengantre ketika mereka bersiap-siap menyerang, atau Menganggur ketika mereka tidak melakukan apa-apa. Negara-negara yang akan kita mulai hari ini adalah Menganggur, Posisi, dan Kedudukan.

PositionFront dan PositionBehind tidak akan selesai hari ini, tetapi mereka akan digunakan di artikel selanjutnya untuk menentukan ke arah mana musuh akan mendekati Player.

Sebelum kita mulai membangun Amerika Serikat ini, kita perlu mengimpor dua animasi baru yang akan kita gunakan untuk Serangan Musuh. Satu akan untuk Serangan Dasar, dan satu untuk Serangan Kuat.Buat dua sprite baru seperti yang tercantum di bawah ini: 

Sprite Name Gambar Posisi Awal
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

Kita juga perlu memberikan variabel Enemy a State, dan variabel SightRange sehingga kita tahu seberapa dekat mereka harus dengan Player untuk "pemberitahuan" mereka.

  1. Pergi ke event Create untuk Musuh.
  2. Tambahkan variabel-variabel ini di akhir kode:
1
State = Inactive;
2
 SightRange = 350;

Anda harus memperhatikan bahwa kondisi awal untuk musuh tidak aktif. Negara ini pada dasarnya akan bertindak sebagai negara "off" untuk Musuh. Dengan tidak menyertakan kasus untuk itu dalam pernyataan switch, kami akan menjamin bahwa hingga Musuh beralih ke salah satu status "Aktif" mereka, mereka tidak akan mengambil tindakan apa pun. Dalam hal ini, mereka akan beralih ke keadaan aktif ketika Player memasuki BattleRegion yang mereka hadapi.

Perubahan Statement

Selanjutnya kita akan menambahkan pernyataan Switch, mirip dengan yang untuk Kamera, ke Event Langkah Musuh.

Ikuti langkah ini:

  1. Pergi ke event Step untuk Musuh.
  2. Setelah pernyataan if yang memeriksa untuk memastikan musuh tidak mati, ganti kode yang mengatur sprite musuh dengan kode berikut:
1
//Choose a new state based on the current situation.

2
 
3
 switch (State){
4
 
5
     case "Idle":
6
         //animate the enemy,

7
         //check to see if the enemy should attack

8
         break;
9
 
10
     case "PositionFront":
11
         SideMod = 1;
12
         //Find Target position

13
         //Move there

14
         //animate the enemy, 

15
         //check to see if the enemy should attack

16
         break;
17
 
18
     case "PositionBehind":
19
         SideMod = -1;
20
         //Find Target position

21
         //Move there

22
         //animate the enemy, 

23
         //check to see if the enemy should attack

24
         break;
25
 }
26
 
27
 

Ini adalah shell dasar dari pernyataan switch kami yang akan kami kembangkan seiring waktu; Namun, itu masih memberi kita ide yang bagus tentang bagaimana pernyataan switch akhir akan bekerja. Saat ini banyak kode ini hanyalah komentar, tetapi kami akan segera menggantinya, seperti yang telah kami lakukan sebelumnya.

Sebelum pernyataan Switch benar-benar berjalan, Musuh memeriksa apakah mereka harus beralih ke keadaan yang berbeda dari yang sedang mereka gunakan. Kemudian, kita beralih ke pernyataan switch itu sendiri.

Negara bagian pertama adalah keadaan nganggur, yang pada dasarnya hanya menjiwai Musuh dan memeriksa apakah mereka harus secara acak mencoba menyerang. Jadi jika Player kebetulan menjalankannya, ada kemungkinan mereka akan menyerang saat Player lewat. Negara bagian kedua dan ketiga adalah mode serangan kita yang sebenarnya. Negara-negara ini memberitahu Musuh untuk memposisikan baik di depan atau di belakang pemain dan bersiap untuk menyerang.

Saat ini, Negara kita tidak melakukan apa-apa karena itu hanya komentar, tetapi jika Anda melihat lebih dekat pada komentar, Anda harus memperhatikan sesuatu yang menarik. Beberapa tindakan, seperti "menghidupkan musuh" dan "memeriksa untuk melihat apakah musuh harus menyerang", diulang oleh beberapa negara bagian. Karena blok kode ini akan diperlukan beberapa kali, kami akan membuat acara khusus untuk menangani tindakan ini bagi kami. Dengan cara ini kita tidak perlu mengetik ulang hal yang sama berulang kali.

Memilih State/Perilaku Baru

Hal pertama yang dilakukan event langkah kami adalah memeriksa untuk melihat apakah Musuh harus mengubah perilakunya, jadi hal pertama yang akan kami lakukan adalah membuat Peristiwa yang dapat melihat status Player saat ini, dan keadaan game, untuk melihat apa yang harus dilakukan musuh.

Untuk mendapatkan gambaran tentang bagaimana Musuh akan menentukan apa yang harus dilakukan selanjutnya, lihatlah diagram Negara di bawah ini:

State Diagram of the Enemy AIState Diagram of the Enemy AIState Diagram of the Enemy AI

Diagram ini menjelaskan bagaimana iterasi pertama dari Enemy AI kami akan berfungsi. Sederhananya, Musuh akan mulai di Negara Menganggur begitu pertempuran dimulai. Jika Musuh berada dalam SightRange dari Player, mereka akan secara acak beralih ke PositionBehind atau PositionFront.

Ini adalah AI yang cukup sederhana, tetapi kami akan memperluasnya saat kami masuk lebih jauh ke dalam seri.

Untuk membuat acara, ikuti langkah-langkah berikut:

  1. Di OBJ_Enemy, pilih Add Event > Other > User Defined > User 0.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
///Choose a State

2
 
3
 var MyAction = floor(random(100));
4
 
5
 switch(State){
6
     
7
     case "Idle":
8
         if(distance_to_object(OBJ_Player) < SightRange){
9
             if(MyAction <= 50){
10
                 State = "PositionBehind";
11
             }else{
12
                 State = "PositionFront";
13
             }
14
         }
15
         break;
16
 }

Seperti yang Anda lihat, acara ini menggunakan pernyataan switch untuk mencapai apa yang saya jelaskan di atas. Pertama ini menghasilkan variabel acak yang disebut MyAction yang akan digunakan untuk memilih Negara baru dalam situasi di mana ada beberapa opsi yang valid. Kemudian, dalam pernyataan switch, jika Negara Musuh Idle, dan Player dalam SightRange, mereka memiliki 50% kemungkinan untuk beralih ke PositionBehind, dan 50% kemungkinan beralih ke PositionFront.

Untuk saat ini, hanya itu yang perlu kita lakukan.

Sekarang masuk ke dalam acara Langkah lagi, dan ganti komentar yang mengatakan //Choose a new state based on... dengan kode berikut:

1
event_user(0);//Choose a State

Kami sangat dekat dengan memiliki kode kerja, tetapi kami masih perlu menambahkan kode yang mengaktifkan musuh dalam BattleRegion ketika pertempuran dimulai. Ikuti langkah-langkah ini untuk melakukannya:

  1. Di OBJ_BattleRegion, pilih Add Event > Collision > OBJ_Enemy.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
if(IsActive == true){
2
     if(other.State == "Inactive"){
3
         other.State = "Idle";
4
     }
5
 }

Kode ini berjalan setiap kali ada tabrakan antara musuh dan BattleRegion, dan ini memeriksa apakah BattleRegion aktif, dan apakah musuh tidak aktif. Jika kedua hal itu benar, ia akan mengaktifkan musuh dengan mengatur status mereka ke Idle.

Jika Anda masuk dalam game sekarang, kode ini secara teknis akan berfungsi, tetapi tidak akan memiliki efek yang terlihat. Ini karena Negara yang sebenarnya masih hanya berkomentar menjelaskan apa yang mereka lakukan, dan bukan kode sebenarnya. 

Untuk memverifikasi bahwa itu berfungsi, dan melihatnya dalam tindakan, kami akan menambahkan kode debug ini untuk sementara waktu pada akhir Draw Event Musuh. 

1
draw_text(x,y,State);

Kode ini akan menulis Status Musuh di bawah Sprite mereka di dalam game, dan membuatnya segera jelas apa yang terjadi.

Sekarang ketika Anda memasuki BattleRegion, Anda harus melihat perubahan status musuh dari Tidak Aktif, menjadi Menganggur, dan kemudian langsung ke PositionFront atau PositionBehind.

Menyerang

Memilih negara adalah awal yang baik, tetapi melawan balik membutuhkan musuh untuk memeriksa apakah mereka dalam jangkauan pemain, dan apakah mereka siap menyerang. Untuk ini kita akan menggunakan variabel yang disebut AttackRange, dan yang disebut Aggressiveness. AttackRange hanya memberitahu kita seberapa dekat musuh harus melakukan serangan, sedangkan Aggressiveness akan dimulai pada 0, dan perlahan-lahan meningkat berdasarkan pada state Musuh. Semakin tinggi, semakin besar kemungkinan musuh akan menyerang, dan menggunakan serangan yang lebih kuat ketika menyerang.

Untuk menambahkan variabel-variabel ini, kembali ke Create Event Musuh, dan tambahkan kode ini ke akhir acara:

1
Aggressiveness = 0;
2
 AttackRange = sprite_width/2+OBJ_Player.sprite_width/2;

Sekarang, untuk membuat serangan kami bekerja, kita perlu menambahkan tiga peristiwa lagi ke Musuh: satu peristiwa yang menentukan kapan menyerang, satu peristiwa yang melakukan serangan, dan satu peristiwa yang mengatur ulang keadaan musuh setelah serangan. Mari kita mulai dengan acara untuk memeriksa apakah mereka harus menyerang:

  1. Di objek Enemy, pilih Add Event > Other > User Defined > User 1.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
///Check Attack Chances

2
 
3
 if(OnGround == true){
4
 
5
     if(distance_to_object(OBJ_Player) <= AttackRange && abs(y-OBJ_Player.y) < LayerSize){
6
 
7
         Aggressiveness += .02;
8
 
9
         if(random(1) < Aggressiveness*.03){
10
 
11
             event_user(2);//Attack Event

12
 
13
         }
14
 
15
     }
16
 
17
 }

Acara ini sangat sederhana. Pertama ia memeriksa apakah musuh ada di tanah, karena mereka tidak memiliki 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 ada di tanah, agresivitas mereka meningkat, dan mereka memiliki kesempatan untuk menyerang.

Sekarang mari kita buat serangan itu sendiri, sehingga kita memiliki acara untuk dipanggil ketika Musuh memutuskan untuk menyerang.

  1. Di objek Enemy, pilih Add Event > Other > User Defined > User 2.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
///Attack Event

2
 if(OBJ_Player.CurrentHP > 0){
3
 
4
     AttackChance = random(100); 
5
 
6
     if((Aggressiveness>.75 && AttackChance>= 90) || (Aggressiveness>1 && AttackChance>= 75)){
7
 
8
         sprite_index = SPR_EnemyStrongPunch;
9
         MyAttack = instance_create(x,y,ATK_StrongPunch);
10
 
11
     }else{
12
 
13
         sprite_index = SPR_EnemyBasicPunch;
14
         MyAttack = instance_create(x,y,ATK_BasicPunch);
15
 
16
     }
17
     
18
     speed = 0;
19
     State = "Attacking";
20
     Aggressiveness = 0;
21
     MyAttack.depth = depth;
22
     MyAttack.image_xscale = image_xscale;
23
     MyAttack.image_speed = image_speed;
24
     MyAttack.Owner = "Enemy";
25
     
26
 }

Untuk acara ini, selama pemain tidak mati, kode menghasilkan nomor acak yang disebut AttackChance. Nomor ini digunakan dengan Aggressiveness musuh untuk menentukan apakah musuh harus menggunakan serangan ringan atau serangan kuat. Jika Aggressiveness dan AttackChance keduanya relatif tinggi, musuh menggunakan Serangan Kuat; jika tidak mereka menggunakan Light Attack.

Setelah itu, ia mengatur kecepatan musuh ke 0 sehingga mereka tidak bergerak ketika mereka menyerang, mengatur status musuh untuk Menyerang, mengatur ulang agresivitas mereka, dan mencocokkan sifat dasar serangan ke sifat yang sesuai dari musuh.

Sebelum kita melangkah lebih jauh, mari kita lihat bagaimana semuanya berjalan sejauh ini. Pergilah ke Acara Langkah untuk musuh dan ganti semua contoh komentar //Check to see if the enemy should attack dengan kode berikut:

1
event_user(1)//Check Attack Chances Event

Sekarang masuk ke permainan, dan berdiri di dekat musuh selama beberapa detik. Lawan mereka dan lihat apa yang terjadi. Mereka akhirnya harus mulai menyerang, dan, begitu mereka melakukannya, Anda harus mengawasi Negara mereka dan animasi mereka. Jika Anda tidak yakin seberapa dekat Anda dengan mereka, gunakan gambar ini sebagai referensi:

The position of the enemyThe position of the enemyThe position of the enemy

Anda harus memperhatikan bahwa sekali musuh mulai menyerang, mereka sepertinya tidak pernah berhenti. Animasi tampaknya berlangsung selamanya, dan Negara mereka tidak pernah menjadi Idle lagi. Ini karena animasi musuh dan Negara tidak pernah diatur ulang setelah serangan dimulai; ini mirip dengan masalah yang kami miliki dengan Pemain. Jika Anda berpikir tentang bagaimana kode diproses, maka hal terakhir yang kami lakukan dengan animasi musuh adalah memilih salah satu dari dua serangan, dan hal terakhir yang kami lakukan dengan Negara mereka adalah mengaturnya untuk "Menyerang". Meskipun Serangan kami bekerja sekarang, tanpa ketiga dari kejadian yang saya sebutkan di atas, Musuh tidak pernah "menetralkan" dan me-reset kembali ke Menganggur.

Cara termudah untuk mereset Enemy adalah dengan menambahkan event Animation End. Acara ini akan berjalan setiap kali animasi selesai, dan akan memeriksa apakah keadaan Musuh diatur ke Menyerang. Jika demikian, itu berarti mereka harus beralih kembali ke keadaan default, dan beralih animasi. Jadi dalam skenario kami di atas, saat animasi serangan pertama mereka berakhir, ia akan menjalankan acara ini dan menyetel ulang semuanya sehingga perulangan tidak dimulai ulang.

  1. Di objek Enemy, pilih Add Event > Other > Animation End.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
///ResetAttackingStatus

2
 
3
 if(State == "Attacking" && OnGround == true){
4
 
5
     State = "Idle";
6
 
7
 }

Seperti yang saya katakan, kode memeriksa apakah Negara Musuh itu "Menyerang", dan jika demikian itu me-reset Negara mereka ke Menganggur.

Sekarang pergilah ke permainan lagi, dan lihat apa yang terjadi ketika Anda melakukan hal yang sama seperti sebelumnya. Anda seharusnya sekarang melihat Negara diatur ulang jika Anda menonton teks di bawah Musuh, tetapi animasi akan tetap loop selamanya. Masalahnya adalah bahwa kita masih belum menambahkan kode untuk menghidupkan Musuh berdasarkan Negara mereka. Itu yang akan kita lakukan selanjutnya.

Menganimasi Musuh

Satu-satunya animasi yang kita butuhkan saat ini adalah untuk Musuh untuk beralih kembali ke Sprite diam setelah serangan mereka berakhir. Sementara kita hanya bisa menambahkan kode ini ke acara Animation End, atau bahkan ke kasus Idle di Step Event, kita pada akhirnya akan membutuhkan kontrol yang lebih tepat terhadap animasi Musuh.

Karena itu, kami akan membuat Peristiwa baru lainnya secara khusus untuk menangani animasi. Bahkan, jika Anda melihat kembali pada Acara Langkah kami, Anda akan melihat di kode komentar bahwa kami sudah memiliki beberapa tempat untuk membuat acara animasi ini setelah kami membuatnya.

  1. Di objek Enemy, pilih Add Event > Other > User Defined > User 3.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
///Animate the Enemy

2
 switch(State){
3
 
4
     case "Idle":
5
         sprite_index = SPR_EnemyIdle;
6
         break;
7
         
8
     case "PositionFront":
9
     case "PositionBehind":
10
         sprite_index = SPR_EnemyIdle;
11
         break;
12
 
13
 }

Saat ini, semua kode ini mengatur animasi Musuh untuk Menganggur tidak peduli apa negara mereka.Akhirnya, kami akan menambahkan kode yang mengatur Animasi Berjalan ketika mereka sedang bergerak, dan bahkan beberapa animasi khusus yang hanya berlaku untuk acara tertentu.

Sekarang kita hanya perlu kembali ke Langkah Peristiwa, dan mengganti semua contoh komentar //Animate the enemy dengan kode berikut:

1
event_user(3);//Animate the Enemy

Jika Anda kembali ke permainan pada titik ini, Anda harus melihat bahwa masalah animasi kami terpecahkan, dan musuh berpindah negara dengan benar.

Menambahkan Bar Kesehatan

Saat ini serangan Musuh kami tampaknya berfungsi, tetapi Anda mungkin melihat masalah jika Anda membiarkan mereka memukul Anda beberapa kali. Tidak peduli berapa lama Anda berdiri di samping musuh dan membiarkan mereka memukul Anda, Anda sepertinya tidak mati. Di atas itu, kita bahkan tidak tahu apakah Anda kehilangan kesehatan. Karena ini sangat penting untuk memverifikasi bahwa serangan musuh bekerja, inilah yang akan kita lakukan selanjutnya.

Sebelum kita tahu mengapa Anda tidak sekarat, kita perlu tahu apakah Anda bahkan terluka, jadi mari tambahkan Health Bar untuk pemain. Untuk melakukan ini, kita akan memberikan Player a Draw GUI event.

  1. Di objek Enemy, pilih Add Event > Draw > Draw GUI.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
draw_set_alpha(1);
2
 draw_set_color(c_black);
3
 draw_rectangle(18,18,264,42,false);
4
 
5
 draw_set_color(c_maroon);
6
 draw_rectangle(20,20,262,40,false);
7
 
8
 if(CurrentHP > 0){
9
 
10
     draw_rectangle_colour(20,20,20+242*(CurrentHP/MaxHP),40,c_green,c_lime,c_lime,c_green,false);
11
 
12
 }

Kode ini tidak banyak berfungsi, tetapi kode ini harus memberi kita bar kesehatan dasar untuk karakter kita. Pertama ia menggambar persegi panjang hitam sederhana untuk digunakan sebagai garis besar untuk Bar Kesehatan. Setelah itu, ia menggambar persegi panjang merah marun untuk bertindak sebagai latar belakang ketika Player telah kehilangan beberapa kesehatan. Akhirnya, jika pemain masih memiliki kesehatan, ia menarik bar hijau untuk kesehatan itu sendiri.

Lebar bar hijau diatur dengan mengalikan lebar maksimum bar kesehatan 242 piksel dengan fraksi CurrentHP / MaxHP. Dengan cara ini bar kesehatan Green akan selalu berukuran proporsional berdasarkan pada jumlah kesehatan yang dimiliki pemain.

Jika Anda masuk dalam game sekarang, Anda akan melihat bilah Kesehatan di sudut kiri atas: 

The HealthBar in the top-left corner of the dashboardThe HealthBar in the top-left corner of the dashboardThe HealthBar in the top-left corner of the dashboard

Jika Anda pergi ke Musuh lagi dan mulai diserang, sekarang harus jelas bahwa Anda mengambil kerusakan. 

Mengatur ulang IsHit Player

Terlepas dari kenyataan bahwa kami tahu Player sedang dipukul, hal-hal masih belum sempurna. Pergilah dalam game, dan cobalah menyerang Musuh atau bergerak setelah Anda terkena salah satu serangan mereka. Meskipun kontrol Anda bekerja dengan sempurna sebelum dipukul, saat Anda mengambil kerusakan, Anda tidak lagi dapat bergerak atau menyerang.

Ini terjadi karena kode penyerang Player di User Defined 2, dan kode pergerakannya di event Langkah keduanya IsHit harus salah. Anda dapat melihat Ditetapkan Pengguna 2 di bawah ini:

IsHit in the Attack EventIsHit in the Attack EventIsHit in the Attack Event

Berbeda dengan Musuh kami, meskipun, setelah Pemain mendapat untung, kami tidak pernah me-reset IsHit variabel mereka. Jadi mari tambahkan acara alarm untuk melakukannya.

Jika Anda melihat kembali kode tabrakan OBJ_ATK untuk Player, Anda akan melihat bahwa kita sudah memiliki beberapa kode di tempat untuk menjalankan acara alarm dan setrum pada Player.

Existing StunLength codeExisting StunLength codeExisting StunLength code

Jadi satu-satunya hal yang harus kita lakukan saat ini adalah menambahkan beberapa kode untuk direset IsHit, dan memberikan Player animasi IsHit.

  1. Dengan OBJ_Player, pilih Add Event > Alarm > Alarm 3.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut:
1
IsHit = false;
  1. Dengan OBJ_Player, buka even Step.
  2. Buka kode untuk even Step.
  3. Tambahkan pernyataan lain ini di akhir pernyataan if yang menjalankan kode gerakan Player.
1
else if(IsHit == true){
2
     sprite_index = SPR_PlayerHit;
3
 }

Kode Gerakan Anda seharusnya sekarang terlihat seperti ini, dengan bagian baru yang diberi garis merah: 

Updated Player Movement codeUpdated Player Movement codeUpdated Player Movement code

Sekarang ketika Anda masuk dalam game, Anda seharusnya tidak memiliki masalah menyerang atau bergerak, setelah Anda diserang.

Membunuh Player 

Sekarang Player semakin rusak, game ini benar-benar mulai bersatu, tetapi kita masih memiliki satu masalah lagi untuk ditangani. Jika Anda berdiri di depan musuh terlalu lama, akhirnya Anda akan kehabisan kesehatan, dan ketika Anda melakukannya, Anda mungkin akan melihat kesalahan seperti ini:

Error Message show on Player DeathError Message show on Player DeathError Message show on Player Death

Pesan kesalahan decoding dapat menjadi sedikit seni, tetapi yang satu ini sebenarnya cukup jelas. Kesalahan ini mengacu pada peristiwa langkah OBJ_Camera, dan secara khusus itu mengatakan bahwa peristiwa langkah mengalami kesulitan mendapatkan akses ke objek OBJ_Player. Ini terjadi karena objek Player tidak ada lagi. Jika Anda melihat kembali pada langkah langkah Player kami, Anda akan melihat bahwa Player segera memanggil instance_destroy() ketika CurrentHP kurang dari 0.

Existing Death CodeExisting Death CodeExisting Death Code

Itu berarti bahwa saat Player mati, objek Player dihancurkan, dan Kamera tidak lagi dapat mengikutinya.

Jadi mari kita tambahkan beberapa kode untuk menyelesaikan kesalahan ini dan memberikan Pemain kemampuan untuk mencoba kembali ketika mereka mati.

Untuk memperbaiki masalah Kamera, kita akan mengatur status Kamera menjadi "Mati" ketika Player mati. Dengan cara ini, tidak satu pun dari status kamera yang lain akan berjalan, dan kamera tidak akan mencoba mengakses salah satu variabel Player. Kita bisa dengan mudah menghancurkan kamera ketika kita menghancurkan Player, tetapi melakukan hal itu akan mencegah kita dari memanipulasi kamera setelah Player mati, jadi saya merasa lebih baik untuk memiliki keadaan Dead yang sebenarnya, jika kita ingin menambahkan animasi keren atau efek nanti.

  1. Di OBJ_Player, buka even Step.
  2. Dalam kode untuk even Step, ganti kode dalam pernyataan else yang disorot di atas dengan kode berikut:
1
MyCamera.State = "Dead";
2
 instance_destroy();

Sekarang jika Anda masuk dalam game dan membiarkan Player mati, Anda seharusnya tidak memiliki pesan kesalahan. Di sisi lain, meskipun, ketika mereka mati Player segera menghilang, dan itu menjadi tidak mungkin untuk melakukan apa-apa, karena pemain tidak pernah hidup kembali, dan kami tidak memiliki layar Game Over.

Untuk memperbaiki ini, kita akan memberikan pemain animasi kematian, dan mengatur alarm dasar yang akan memulai kembali game 3 detik setelah pemain itu mati. Ini akan menjadi sedikit lebih menarik, dan memungkinkan game untuk melanjutkan. Akhirnya kami akan menambahkan layar Game Over dan bahkan meningkatkan animasi kematian, tetapi untuk saat ini, ini harus menjadi alternatif yang baik.

Pertama mari impor sprite.

Sprite Name Gambar Posisi Asal 
SPR_PlayerDead

PlayerDead.png

X = 72, Y = 67

Sekarang kita akan membuat satu perubahan terakhir ke acara yang membunuh Player. 

  1. Di OBJ_Player, buka even Step.
  2. Dalam kode untuk even Step, ganti kode instance_destroy() dengan yang berikut:
1
sprite_index = SPR_PlayerDead;
2
 if(alarm[1] == -1){
3
     alarm[1] = 90;
4
 }

Hal terakhir yang perlu kita lakukan untuk ini adalah membuat acara alarm yang akan memulai kembali game. 

  1. Di OBJ_Player, buka Add Event > Alarm > Alarm 1.
  2. Tambahkan Aksi Control > Code > Execute Code.
  3. Tambahkan kode berikut: 
1
room_restart();

Sekarang ketika Anda masuk dalam game dan biarkan diri Anda terbunuh, Anda harus melihat "animasi" kematian Play Player, dan game akan dimulai ulang setelah 3 detik. Ini tidak sempurna, tapi ini awal yang bagus.

The Players Death AnimationThe Players Death AnimationThe Players Death Animation

Memperbaiki Serangan Musuh 

Hal terakhir yang akan kita lakukan adalah memperbaiki masalah yang diciptakan oleh penambahan Pernyataan Beralih ke Enemy Step Event. Jika Anda masuk dalam game dan menyerang Musuh, Anda akan melihat bahwa mereka tidak lagi terkejut ketika mereka dipukul. Saat kami menambahkan pernyataan sakelar, kami menimpa kode itu, sehingga kami menghapus efek ini. Namun, untungnya, acara animasi yang kami buat beberapa menit yang lalu akan membuat ini sangat mudah untuk ditambahkan kembali.

Daripada mengkode sistem yang sepenuhnya baru, atau memodifikasi FSM untuk menangani variabel IsHit yang kami buat di tutorial terakhir, kami akan membuat sebuah Negara baru, dan mengganti variabel ini dengan Negara tersebut. Hal pertama yang akan kita lakukan adalah menghapus variabel IsHit dari acara Buat, karena kita tidak lagi membutuhkannya.

Hapus baris kode ini dari Acara Buat.

1
IsHit = false;

Selanjutnya, kita akan masuk ke objek Serangan dan mengeditnya sehingga mengatur Negara ke Hit, daripada membuat IsHit benar.

  1. Pergi ke objek ATK.
  2. Buka OBJ_Enemy collision event.
  3. Ganti baris kode yang ditetapkan IsHit = true; dengan baris kode berikut:
1
other.State = "Hit";

Sekarang kita perlu membuat beberapa perubahan kecil pada objek Enemy. Pertama kita perlu memodifikasi kode alarm yang me-reset status musuh, sehingga me-reset Negara bukan variabel IsHit.

  1. Pergi ke Enemy object.
  2. Buka Alarm 0 event.
  3. Ganti kode dengan yang berikut:
1
State = "Idle";

Kami juga perlu menambahkan "Hit" ke pernyataan switch dalam acara animasi.

  1. Pergi ke Enemy object.
  2. Buka User Defined 3.
  3. Tambahkan kasus baru ke pernyataan Beralih dengan kode berikut:
1
case "Hit":
2
 
3
     sprite_index = SPR_EnemyHit;
4
     break;

Akhirnya, kita perlu menambahkan Hit case ke dalam pernyataan switch Step Event juga, sehingga event animasi akan berjalan ketika musuh berada dalam kondisi Hit.

  1. Pergi ke Enemy object.
  2. Buka Step event.
  3. Tambahkan kasus baru ke pernyataan Beralih dengan kode berikut:
1
case "Hit":
2
 
3
     event_user(3);//Animate the Enemy

4
     break;

Setelah semua itu, jika Anda kembali ke dalam permainan, musuh-musuh akan tertegun lagi ketika Anda menyerang mereka.

Kesimpulan

Sementara pertempuran kita masih membutuhkan banyak pekerjaan, karena Player pada akhirnya akan membutuhkan Event stun mereka sendiri, dan musuh harus dapat bergerak, ini adalah awal yang baik. 

Dalam tutorial berikutnya, kami akan menangani pergerakan musuh dan serangan kombo.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.