Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. From Scratch
Gamedevelopment

Buat Game Pertandingan-3 dalam Construct 2: Deteksi Pertandingan

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Make a Match-3 Game in Construct 2.
Make a Match-3 Game in Construct 2: Animations and Block Swapping
Make a Match-3 Game in Construct 2: Points, Matching, and Gravity

Indonesian (Bahasa Indonesia) translation by Puuma (you can also view the original English article)

Sejauh ini, seri ini telah mencakup dasar-dasar pengaturan game Match-3, dan menerapkan elemen gameplay awal seperti swapping block. Dalam tutorial ini, kita akan membangun semua itu, dan mulai mendeteksi ketika pemain telah membuat kecocokan.


Demo Game Final

Berikut ini adalah demo game yang sedang kita kerjakan di seluruh seri ini:




1. Mendeteksi Kecocokan

Untuk saat ini, kita hanya akan menerapkan versi dasar dari sistem yang cocok, dengan fokus pada penemuan ketika ada kecocokan dan menghancurkan blok yang cocok. Dalam artikel selanjutnya kita akan terus mengembangkan dan memajukan sistem.

Tips: Anda harus membaca bagaimana fungsi rekursif berfungsi, jika Anda belum tahu; pada dasarnya, itu adalah fungsi yang memanggil dirinya sendiri. Fungsi rekursif dapat bekerja sama dengan loop, tetapi karena mereka juga dapat mengambil dan mengembalikan variabel, mereka memiliki lebih banyak kegunaan daripada loop.

Seperti pada tutorial sebelumnya, saya pertama-tama ingin mendiskusikan bagaimana sistem akan bekerja, dan kemudian berusaha untuk membangunnya.

  • Sistem pertandingan akan melakukan iterasi melalui setiap instance dari objek Block.
  • Untuk setiap Block, ia akan melewati warna dan posisi blok itu melihat ke dalam fungsi rekursif, yang akan melihat pada tetangga horisontal atau vertikal, dan menentukan apakah mereka adalah warna yang sama.
  • Jika kecocokan ditemukan, itu akan memanggil fungsi lagi dengan posisi dan warna blok baru, bukan yang asli.
  • Ini akan terus berlanjut hingga tidak ditemukan kecocokan. Pada titik itu, ia akan memeriksa berapa banyak kecocokan yang ditemukannya.
  • Jika menemukan tiga atau lebih kecocokan, itu menandai semua blok terlihat sebagai Matched dengan IsMatched contoh variabel yang Ada yang kita buat di salah satu tutorial sebelumnya; jika tidak, itu tidak berarti apa-apa.
  • Akhirnya, setelah semua blok telah diperiksa, fungsinya akan menghancurkan setiap blok yang ditandai sebagai kecocokan.

Pertama, kita membutuhkan sebuah acara yang dapat diulang melalui setiap Block. Cara saya membangun sistem, sebenarnya iterates melalui blok dua kali: sekali untuk memeriksa pertandingan vertikal, dan sekali untuk memeriksa pertandingan horizontal. Tergantung pada pemeriksaan apa yang dilakukan, itu akan menggunakan fungsi yang berbeda untuk benar-benar mencari pertandingan.

Hal pertama yang perlu kita lakukan adalah membuat Variabel Global untuk melacak berapa banyak blok yang cocok yang kita temukan dalam setiap iterasi yang diberikan:

Sekarang, mari kita buat Event yang akan beralih melalui blok:

Kode Anda akan terlihat seperti ini:

Match3_Part3_FindMatches

Dalam acara ini, kita melakukan iterasi melalui setiap blok dan mengirimnya ke CheckMatchesX atau CheckMatchesY, fungsi yang akan memeriksa untuk melihat apakah Blok tetangga itu cocok.

Untuk mengirim blok ke fungsi, kita meneruskan fungsi tiga parameter yang berbeda:

  • Parameter 0 adalah posisi X Blok
  • Parameter 1 adalah posisi Y Blok
  • Parameter 2 adalah warna.

Setelah setiap Blok dikirim ke salah satu fungsi dan fungsi selesai dijalankan, ia akan mengecek NumMatchesFound untuk melihat apakah ia menemukan tiga Blok Pencocokan atau lebih, dan kemudian mencantumkan Blok sebagai , Matched jika benar.

Akhirnya, setiap Blok yang ditandai sebagai Matched akan hancur setelah .1 detik berlalu. Pernyataan wait ini ada untuk memungkinkan permainan untuk mengalihkan gambar untuk Blok ke gambar yang menunjukkan bahwa mereka dicocokkan, dan memberi pemain waktu sejenak untuk memperhatikan perubahan ini.

(Meskipun Anda dapat menghapus pernyataan wait tanpa berdampak negatif pada permainan, itu membuat pencocokan lebih mudah bagi pemain untuk memahami, dan memperlambat permainan cukup sehingga pemain dapat dengan mudah melacak apa yang sedang terjadi.)


2. Dua Fungsi Periksa

Selanjutnya kita perlu membuat fungsi CheckMatchesX dan CheckMatchesY. Fungsi-fungsi ini akan bekerja sama dengan iterator di atas, di mana akan ada satu versi untuk memeriksa pencocokan horizontal, CheckMatchesX, dan satu untuk pencocokan vertikal, CheckMatchesY.

Cek Horisontal

Pertama, mari kita membangun fungsi cek horizontal:

Kode Anda akan terlihat seperti ini:

Match3_Part3_CheckMatchesX

Jadi, fungsi apa ini?

  • Pertama, tes untuk melihat apakah blok tetangga bahkan ada di sebelah kiri blok yang kita lewati.
  • Setelah fungsi menegaskan ada Blok di lokasi tetangga, itu memeriksa apakah itu adalah warna yang sama dengan Blok yang kita lewati.
  • Jika ya, itu meningkatkan NumMatchesFound oleh satu, dan meneruskan Blok yang baru ditemukan ke dalam fungsi seperti yang dilakukannya untuk yang asli.
  • Ini berlanjut sampai menemukan Blok yang tidak memiliki warna yang sama dengan aslinya. Pada titik itu ia akan mengecek untuk melihat apakah ia menemukan cukup banyak blok yang cocok untuk membuat grup, dan memberi label blok-blok itu sebagai kecocokan jika itu terjadi.

Cek Vertikal

Sekarang, mari kita membuat versi lain dari fungsi ini yang akan melakukan hal yang sama untuk pencocokan vertikal. Ini akan menjadi fungsi CheckMatchesY. Anda dapat menyalin fungsi asli dan membuat semua perubahan yang sesuai, atau membangunnya kembali dari awal; dalam kedua kasus, berikut ini bagaimana tampilan fungsi Anda ketika selesai:

Kode Anda akan terlihat seperti ini:

Match3_Part3_CheckMatchesY

3. Sebenarnya Mencari Cek

Akhirnya, kita harus benar-benar memanggil fungsi FindMatches. Pergi ke fungsi SwapBlocks dan tambahkan sub-event baru ke akhir fungsi:

Anda akan melihat bahwa sub-acara ini sebenarnya tidak memiliki kondisi apa pun. Jika Anda belum pernah membuat sub-event seperti ini sebelumnya, cukup buat sub-event dengan kondisi apa pun, karena ini mengharuskan Anda untuk memberikan kondisi ketika membuat sub-event, dan kemudian menghapus kondisi, tetapi meninggalkan sub-acara. Dengan cara ini, Anda memastikan sub-event selalu berjalan.

Acara SwapBlocks Anda sekarang harus terlihat seperti ini:

Match3_Part3_SwapBlocks

Jika Anda menjalankan permainan pada titik ini, Anda akan melihat bahwa blok hancur ketika pertandingan terjadi. Anda juga akan melihat meskipun bahwa setiap pertandingan yang ada ketika permainan dimulai tidak hilang sampai Anda membuat swap dari beberapa jenis. Hal ini karena kita tidak pernah memanggil fungsi FindMatches setelah kita membuat grid blok.

Alasan kita belum menambahkan kode ini adalah karena di versi final akan ada fungsi lain yang mencegah kecocokan dihasilkan secara otomatis seperti ini, jadi tidak ada alasan untuk mengkhawatirkan masalah ini sama sekali. (Tapi jangan ragu untuk memanggil fungsi FindMatches sebelumnya, jika Anda suka.)


4. Mengkonsolidasikan Cek

Pada titik ini, kita memiliki sistem pencocokan yang cukup kuat, tetapi masalahnya adalah bahwa kode redundan. Saat ini, kita memiliki dua fungsi berbeda yang memeriksa untuk melihat apakah ada tetangga yang cocok, dan satu-satunya perbedaan di antara mereka adalah satu yang memeriksa secara vertikal, dan yang lain memeriksa secara horizontal.

Karena versi gratis dari Construct 2 membatasi berapa banyak Acara yang dapat kita miliki, ini pasti sia-sia. Untuk mengatasi ini, kita akan membuat versi baru dari fungsi yang dapat melakukan kedua pemeriksaan.

Jika Anda melihat fungsi, Anda akan melihat satu-satunya perbedaan antara kedua versi adalah bahwa satu menambahkan Block.Width + 2 ke posisi x dari Blok, dan yang lainnya menambahkannya ke posisi-y dari Bock. Jadi, hambatan yang harus kita lewati untuk membuat ini menjadi satu fungsi, adalah memberikan fungsi cara untuk menambahkan Block.Width + 2 ke hanya X, atau hanya Y, tanpa menggunakan pernyataan If atau beberapa fungsi, karena itu membutuhkan lebih banyak Acara yang akan dieksekusi.

Solusi saya untuk hal ini tidak terlalu rumit, tetapi akan lebih mudah dipahami jika kita bisa melihatnya bersatu, jadi kita akan menerapkannya, dan saya akan menjelaskan cara kerjanya begitu kita dapat melihat semuanya dalam tindakan.

  1. Hapus event CheckMatchesY.
  2. Ubah nama event CheckMatchesX menjadi, hanya, CheckMatch.
  3. Dalam panggilan fungsi untuk CheckMatchesX di bawah event FindMatches:
    1. Ubah panggilan fungsi menjadi untuk CheckMatches bukannya CheckMatchesX.
    2. Tambahkan Parameter 3.
      1. Nilai = 1.
    3. Tambahkan Parameter 4.
      1. Nilai = 0.
  4. Dalam panggilan fungsi untuk CheckMatchesY di bawah acara FindMatches:
    1. Ubah panggilan fungsi menjadi untuk CheckMatches bukan dari CheckMatchesY.
    2. Tambahkan Parameter 3.
      1. Nilai = 0.
    3. Tambahkan Parameter 4.
      1. Nilai = 1.

Seperti yang akan saya jelaskan segera, parameter-parameter tambahan ini akan memberi tahu CheckMatch apakah itu melakukan pemeriksaan horizontal atau pemeriksaan vertikal. Ketika kami mengirimkan 1 untuk Parameter 3, dan 0 untuk Parameter 4, ini adalah pemeriksaan horizontal, dan ketika kita mengirim 0 untuk Parameter 3, dan 1 untuk Parameter 4, itu adalah pemeriksaan vertikal.

Sekarang, kembali ke fungsi CheckMatches, dan ubah kondisi dan tindakan agar terlihat seperti ini:

Inilah yang menjadi kode FindMatches dan CheckMatches Anda sekarang:

Match3_Part3_ModifiedCheckMatches

Bagaimana cara kerjanya?

Jadi, apa sebenarnya fungsi versi baru ini?

Nah, setiap kali Anda memanggil CheckMatch Anda sekarang mengirim dua parameter lagi, dan daripada menambahkan Block.Width + 2 ke posisi x atau y, itu menambahkan (Block.Width + 2) * Function.Param(3) ke posisi-x, dan (Block.Width + 2) * Function.Param(4) ke posisi-y.

Karena salah satu dari dua parameter akan selalu 1, dan yang lainnya akan selalu 0, ini berarti bahwa baik x atau posisi y akan dimodifikasi - tidak pernah keduanya!

Misalnya, jika kita meneruskan 1 untuk Parameter 3, dan 0 untuk Parameter 4, maka ia menambahkan (Block.Width + 2) * 1, yang hanya Block.Width + 2, ke posisi-x, dan (Blok. Lebar + 2) * 0, yaitu 0, ke posisi-y.

Berikut ini adalah contoh cepat untuk menunjukkan apa yang saya maksud dan bagaimana menghitung posisi blok di mana ia akan memeriksa pertandingan. Misalkan dalam contoh ini Blok asli ada di (200, 200), dan Blok memiliki lebar 40. Jadi, jika kita ingin mendapatkan posisi Blok vertikal yang berdekatan, rumus akan bekerja seperti ini:

  • X = 200 + ((Block.Width + 2)*0) = 200 + (40 + 2)*0 = 200 + 0 = 200
  • Y = 200 + ((Block.Width + 2)*1) = 200 + (40 + 2)*1 = 200 + 42 = 242

Jika kita ingin mendapatkan posisi Blok horizontal yang berdekatan, rumus akan bekerja seperti ini:

  • X = 200 + ((Block.Width + 2)*1) = 200 + (40 + 2)*1 = 200 + 42 = 242
  • Y = 200 + ((Block.Width + 2)*0) = 200 + (40 + 2)*0 = 200 + 0 = 200

Jika Anda menjalankan game ini sekarang, Anda harus melihat sistem pertandingan masih berfungsi seperti semula, tetapi dari perspektif kita, itu sebenarnya sistem yang lebih baik.


Kesimpulan

Pada titik ini fungsi deteksi pertandingan kita masih belum lengkap, tetapi kita telah melakukan banyak hal dalam tutorial ini dan saya pikir penting untuk membiarkan semua ini tenggelam sebelum kita menambahkan yang lain. Dengan itu, saya akan mengakhiri artikel ini di sini. Lihat demo dalam bentuknya saat ini.

Dalam artikel berikutnya kita akan menambahkan sistem poin, kita akan meningkatkan sistem yang cocok, dan kita akan menambahkan "gravitasi" sehingga Blok akan jatuh ketika Blok di bawahnya dihilangkan.

Jika Anda ingin memulai lebih awal pada artikel berikutnya, luangkan waktu untuk mempertimbangkan bagaimana Anda akan mendeteksi ketika ada ruang kosong di bawah Blok. Coba lihat di Block > Is Overlapping at Offset pada fungsi Offset untuk inspirasi!

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.