Menambahkan musuh
Semoga sekarang kamu sudah familiar dengan proses menambahkan sprite dan animasi. Jadi untuk menyingkat tutorial, langkah-langkah lengkapnya tidak akan diulang. Sekarang tambahkan sebuah sprite baru untuk musuh.
1. Tambahkan objek Sprite baru di layout.
2. Import sprite strip Enemies\Snail.
3. Hapus frame animasi pertama yang kosong.
4. Atur animasi menjadi looping, dengan kecepatan animasi 15.
5. Atur titik origin ke dasar gambar keong, dan terapkan ke semua frame dalam animasi.
6. Crop semua frame. (Shift + Crop)
7. Tutup editor animasi dan ganti nama objek menjadi "SnailEnemy".
8. Tempatkan di tanah seperti pada gambar.
Sekarang kita perlu mengimplementasi logika berikut:
- Jika pemain menabrak keong dari samping, pemain akan menyala dan terluka.
- Jika pemain melompat dan mendarat di atas keong, keong tersebut akan mati.
Untuk membuat pemain menyala, pilih objek pemain dan tambahkan behavior Flash. Pastikan memilih objek pemain, bukan objek PlayerBox (karena objek pemain yang terlihat yang ingin kita buat menyala). Kita akan gunakan action 'Flash' dari behavior tersebut.
Pindah ke sheet view, tambahkan sebuah event baru:
PlayerBox -> On collision with another object -> SnailEnemy
Event ini akan dijalankan ketika kita bertabrakan dengan SnailEnemy dari sudut manapun. Lalu kita bisa menggunakan sub-event untuk memeriksa apakah pemain melompati musuh dari atas atau berlari dari samping. Pertama kita perlu memeriksa apakah pemain ada di atas tanah.
Tambahkan sebuah sub-event pada event collision sebelumnya:
PlayerBox -> Is falling
Kita juga perlu memeriksa apakah pemain ada di atas musuh. Hal itu akan mencegah musuh keong tanpa sengaja mati jika kita jatuh dari pinggiran platform. Klik-kanan di kondisi 'Is falling' dan pilih 'Add another condition'. Ingat semua kondisi harus dipenuhi agar suatu event dijalankan. Tambahkan kondisi sebagai berikut:
PlayerBox -> Compare Y -> Less than, SnailEnemy.Y
Sumbu Y bertambah ke bawah, jadi jika koordinat Y pemain lebih kecil dari keong, artinya pemain ada di atasnya.
Di event ini, tambahkan action:
SnailEnemy -> Destroy
Kita juga bisa membuat pemain memantul dengan membuat action tambahan:
PlayerBox -> Set vector Y -> -700
'Set vector Y' akan mengatur kecepatan vertikal dari pergerakan objek platform, mengatur nilainya menjadi negatif akan membuatnya bergerak ke atas (ingat bahwa sumbu Y membesar ke bawah). Nilai 700 sedikit lebih kecil dari kekuatan lompat (1100), sehingga ini akan membuat pemain memantul atau seperti melakukan lompatan kecil.
Kita belum selesai: Klik-kanan di bagian luar event "is falling' (area di sebelah kiri icon PlayerBox), dan pilih Add -> Else. 'Else' adalah kondisi khusus yang akan dijalankan ketika event sebelumnya tidak dijalankan. Sehingga event ini hanya akan dijalankan jika kita bertabrakan dengan keong tapi kita tidak menginjaknya dari atas, misalnya karena kita menabraknya dari samping. Di event ini kita akan membuat pemain terluka. Tambahkan action:
Player -> Flash -> (biarkan nilai default dan pilih Done)
Ingat bahwa behavior Flash ada di objek Player, bukan PlayerBox.
Saat ini pemain belum bisa mati, hanya menyala ketika terluka. Tapi kita sudah bisa membedakan apakah pemain menabrak musuh dari samping atau menginjaknya dari atas. Tutorial ini tidak akan membahas semua aspek dalam game platformer, tapi semoga kamu sudah punya gambaran bagaimana cara membuat efek pemain mati (cobalah dengan membuat sebuah sprite 'poof' saat musuh mati dengan menggunakan aksi 'Spawn object' pada objek SnailEnemy), dan bagaimana cara mengurangi darah pemain (pada event yang membuat pemain menyala). Kamu bisa pelajari implementasi darah/nyawa pemain di Tutorial top-down shooter, yang ada baiknya kamu lihat setelah tutorial ini.
Sekarang kita perlu buat musuh keong bergerak mondar mandir sepanjang platform.
Menggerakkan musuh
Tantangan utama menggerakkan keong adalah bagaimana cara mendeteksi kapan dia mencapai ujung sebuah platform. Cara termudah untuk melakukan ini adalah dengan membuat objek penanda 'ujung'. Penanda ini hanyalah sprite yang tidak terlihat yang akan membalik arah keong ketika mereka menyentuh penanda.
Kita bisa juga menggunakan behavior Platform juga untuk keong musuh. Ini akan memudahkan karena:
- Musuh akan bisa bergerak ke kanan dan kiri
- Musuh akan menaiki dan menuruni bukit seperti pemain
- Musuh bisa jatauh dari pinggiran platform jika kita ingin seperti itu
- Jika kita ingin membuat musuh yang bisa melompat, kita bisa membuat musuh otomatis melompat dengan menggunakan action 'Simulate control'.
Tambahkan behavior Platform ke sprite SnailEnemy. Karena kita tidak akan menggunakan animasi yang kompleks untuk objek ini, kita aman menggunakan behavior platform langsung pada objek tanpa menggunakan objek kotak tidak terlihat seperti pada objek pemain. Perlu diketahui kalau kamu membuat platform game dengan musuh yang membutuhkan animasi kompleks, kamu perlu menggunakan teknik kotak tidak terlihat seperti yang kita gunakan untuk objek pemain.
Kita tidak ingin pemain mengontrol SnailEnemy, kita ingin mengaturnya untuk bergerak otomatis. Kita bisa lakukan ini dengan mengatur Default controls menjadi No, lalu gunakan action Simulate control. Karena keong cukup lambar, atur Max speed menjadi 50 dan Acceleration dan Deceleration menjadi 100!
Kita juga memerlukan penanda ujung platform. Tambahkan sebuah objek Sprite baru dan masukkan sebuah kotak transparan. Beri nama EdgeMarker. Atur ukuran objek menjadi 40 x 40 dan atur Intial visibility menajdi Invisible agar kita tidak bisa melihatnya. Tempatkan satu objek tersebut di masing-masing ujung platform keong seperti pada gambar, dan ingat kamu bisa membuat salinan instance objek dengan menahan Control dan lakukan drag.
Keong musuh juga perlu tahu ke arah mana dia sedang bergerak, antara ke kiri atau ke kanan. Kita bisa lakukan ini dengan Instance variable, yang merupakan angka atau teks yang disimpan di setiap instance objek yang bersangkutan. Jika kita memiliki banyak keong, masing-masing akan menyimpan instance variabel mereka masing-masing secara terpisah. Hal ini membuat mereka bisa memiliki nilai nyawa/darah dan arah yang berbeda. Cara sederhana untuk membuat banyak musuh bergerak secara otomatis adalah dengan membuat instance variable bernama "action" yang akan menyimpan status aksi musuh tersebut. Misalnya, nilainya bisa "run away", "chase player", atau "idle". Dalam tutorial ini kita hanya menggunakan "left" dan "right", tapi akan ada gunanya juga membuat variabel instance seperti apda contoh.
Pilih objek SnailEnemy. Pada bagian properti, klik Add/Edit pada bagian 'Instance variables'.
Sebuah dialog berisi semua instance variabel untuk suatu objek akan muncul. Klik icon 'add' dan tambahkan yang baru. Atur namanya menjadi action, lalu kelik text, dan nilai awal untuk right (untuk bergerak ke kanan).
Klik OK dan tutup dialog instance variable, lalu pindahlah ke event sheet.
Kita perlu implementasi logika berikut:
- Jika action bernilai "right", simulasikan pergerakan objek platform seperti menahan tombol kanan agar keong bergerak ke kanan.
- Jika action bernilai "left", simulasikan pergerakan objek platform seperti menahan tombol kiri agar keong bergerak ke kiri.
Dan:
- Jika keong menabrak EdgeMarker, putar balik nilai action (jika "left" menjadi "right", dan jika "right" menjadi "left").
Kita bisa atur pergerakan dengan menggunakan dua event berikut:
Event: SnailEnemy -> Compare instance variable -> action equal to "right" (gunakan tanda petik untuk menandakan nilai berupa teks)
Action: SnailEnemy -> Simulate control -> Right
Kita perlu buat event dan action yang serupa untuk arah kiri. Kita juga perlu memutar gambar keong ke kanan dan kiri seperti yang kita lakukan untuk objek player. Jadi tambahkan SnailEnemy -> Set mirrored -> Mirrored pada event kiri, dan SnailEnemy -> Set not mirrored -> Not mirrored di event kanan. Hasil akhirnya akan seperti ini:
Sekarang untuk membalik arah keong di ujung platform:
Event: SnailEnemy -> On collision with another object -> EdgeMarker
Subevent: SnailEnemy -> Compare instance variable -> action equal to "right"
Action: SnailEnemy -> Set value -> action to "left"
Subevent: Else
Action: SnailEnemy -> Set value -> action to "right"
Penting untuk menggunakan else, karena semua event akan dijalankan dari atas ke bawah. Jika kita tidak menggunakan else dan hanya action equal to "left", perhatikan bahwa event sebelumnya baru saja mengubah nilai action menjadi "left", langsung berubah lagi nilainya menjadi "right", tanpa memberikan dampak yang berarti. Dengan menggunakan else, kita mencegah event kedua dijalankan jika event pertama dijalankan.
Jalankan projectnya. Perhatikan sekarang keong bergerak bolak balik di platformnya, dan membuat platform tersebut lebih sulit untuk dilompati. Ini adalah contoh sistem intelenjensi buatan atau AI yang sederhana, tapi semoga kamu sekarang memiliki bayangan bagaimana cara membuat musuh yang lebih pintar dengan mengatur pergerakannya dengan lebih banyak event, bahkan mungkin membuat mereka bisa jatuh dari platform, atau menggunakan penanda lain untuk membuat musuh melompat seakan-akan tahu bagaimana cara melompat dari platform ke platform.
Cobalah membuat platform dengan dua keong, perhatikan bahwa mereka mengatur pergerakannya masing-masing, karena tiap keong memiliki variabel instance yang menyimpan nilai action mereka masing-masing. Semoga dengan ini kamu mulai bisa melihat seberapa pentingnya instance variable untuk mengatur instance objek secara independen (mereka tidak harus melakukan hal yang sama persis satu sama lain di saat yang sama).