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

Membuat Game Match-3 dalam Construct 2: Menghilangkan Kecocokan Pre-Made

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: Block Movement
Make a Match-3 Game in Construct 2: Chaining and Game Overs

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

Dalam tutorial sebelumnya, kita akhirnya membuat game kami bergerak dan menambahkan gerakan ke blok. Di atas itu, kita menciptakan sistem kesulitan yang belum sempurna untuk membuat permainan lebih keras saat pemain memainkan lebih lama.

Dengan kedua fitur ini dalam game, kita siap untuk menerapkan sistem yang akan menghilangkan pertandingan yang sudah dibuat sebelumnya dari papan. Meskipun ini bukan artikel terakhir dalam seri ini, ini adalah sistem besar terakhir yang perlu kami terapkan - jadi merasa nyaman, karena memiliki pekerjaan yang cocok untuk kita.


Demo Game Final

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




Perbaikan Cepat

Sebelum kita mulai dengan bagian utama dari tutorial ini, saya ingin meluangkan waktu sebentar untuk memperbaiki dua masalah yang saya temukan ketika saya sedang menulis tutorial sebelumnya.

Pencocokan

Masalah pertama yang saya maksud muncul dalam skenario yang dapat Anda lihat di bawah ini:

IssueV1

Dalam situasi ini, jika Anda menyeret Blok B ke titik hijau, itu akan jatuh karena ruang kosong di bawah titik, dan akhirnya mendarat di tempat berlabel C. Dalam sebagian besar skenario, ini akan terjadi dan permainan akan berfungsi secara normal, tetapi dalam beberapa skenario, game ini akan mendeteksi pertandingan pada saat-saat singkat di mana Blok B berada di sebelah grup A dan pada akhirnya akan menghancurkan ketiga blok tersebut.

Masalah ini tidak eksklusif untuk skenario di atas dan juga dapat menampilkan dirinya ketika Anda melakukan hal yang sama dalam skenario yang saya soroti di bawah ini.

IssueV2

Jika kita tidak memperbaiki ini, pemain akan menerima kredit dan poin untuk sejumlah pertandingan mereka tidak pernah dimaksudkan untuk membuat dan juga bisa mendapatkan bingung tentang mengapa begitu banyak blok menghilang tiba-tiba.

Untungnya, ini adalah masalah sederhana untuk diperbaiki. Untuk mengatasi masalah ini kita akan membuat Variabel Global baru yang disebut MatchesPossible yang akan menentukan apakah pertandingan dapat dibuat, dan Peristiwa baru yang akan mendeteksi ketika blok "jatuh" dan akan memodifikasi MatchesPossible untuk membuatnya sehingga tidak ada yang cocok dibuat saat ini terjadi.

Pertama kita akan membuat Variabel Global:

Variabel baru Anda akan terlihat seperti ini:

Match3_Part7_MatchesPossible

Sekarang kita akan membuat Peristiwa yang akan mendengarkan ketika sebuah blok jatuh:

Peristiwa ini membuatnya sehingga ketika sebuah blok ditemukan memiliki ruang kosong di bawahnya, MatchesPossible diatur ke 1, artinya pertandingan tidak mungkin dilakukan. Anda juga akan melihat bahwa itu memeriksa posisi Y dari blok. Ini untuk memastikan blok tidak berada di baris terendah blok yang akan selalu memiliki ruang kosong di bawahnya.

Selanjutnya, kita membutuhkan Event yang menetapkan MKatchesPossible kembali ke 0 ketika tidak ada blok yang memiliki ruang kosong di bawahnya. Peristiwa kedua ini akan didasarkan pada kondisi Lain:

Pastikan bahwa Acara ini segera mengikuti Acara pertama sehingga pernyataan Else digunakan dengan benar.

Dua Acara baru Anda seharusnya terlihat seperti ini:

Match3_Part7_MatchesPossibleEvent

Akhirnya, kita akan menambahkan kondisi baru ke CheckMatches sehingga terlihat pada MatchesPossible untuk menentukan apakah pertandingan dapat dilakukan. Tambahkan kondisi ini ke pemanggilan fungsi awal dari Peristiwa CheckMatch.

Dengan kondisi yang ditambahkan, Peristiwa CheckMatch Anda seharusnya terlihat seperti ini:

Match3_Part7_ModifiedCheckMatches

Tidak seperti kebanyakan masalah yang kita hadapi sampai titik ini, masalah ini muncul secara tidak konsisten. Ini berarti bahwa kita tidak dapat benar-benar menguji untuk melihat apakah kita memperbaiki masalah tersebut, hanya dapat menguji untuk melihat apakah ini menyebabkan masalah lain. Jika Anda bermain game sekarang, Anda akan melihat bahwa tidak ada masalah baru yang disebabkan oleh kondisi ini.

Poin

Masalah kedua yang ingin saya perbaiki sebelum kita menambahkan sesuatu yang baru berhubungan dengan sistem Poin.

Saat mengerjakan proyek untuk tutorial ini, saya perhatikan bahwa sesuatu yang saya lakukan menyebabkan sistem Poin berperilaku aneh dan memberikan pemain empat atau lima kali poin sebanyak yang seharusnya mereka dapatkan untuk setiap pertandingan. Meskipun saya tidak dapat menentukan perubahan apa yang saya buat menyebabkan ini mulai terjadi, saya menemukan bahwa akar masalahnya adalah bahwa fungsi GivePoints benar-benar dipanggil berkali-kali karena Blok tidak dihancurkan dengan segera. Untungnya, seperti edisi terakhir kita, ini bisa diperbaiki dengan mudah.

Untuk memperbaiki ini kita akan membuat variabel baru yang akan memberi tahu sistem apakah dapat memberikan poin. Kemudian, setiap kali kita akan menggunakan fungsi GivePoints, kita juga akan memodifikasi variabel untuk memastikan Event hanya menyala sekali. Akhirnya, setelah poin diberikan, kita akan mengubah variabel sekali lagi sehingga tidak akan ada masalah lain kali kita mencoba memberikan poin.

Pertama, buat Variabel Global yang disebut PointsGiven:

Variabel Anda harus seperti ini:

Match3_Part7_PointsGiven

Selanjutnya kita akan memodifikasi bagian dari fungsi FindMatches yang benar-benar memberikan poin dengan menambahkan Kondisi baru dan dua Tindakan baru.

Sekarang tambahkan Tindakan ini ke awal daftar Tindakan:

Akhirnya, tambahkan Aksi ini ke bagian akhir daftar Tindakan:

Acara seharusnya sekarang terlihat seperti ini:

Match3_Part7_ModifiedIsMatched

Dengan perubahan ini kita telah membuatnya sehingga Peristiwa yang memanggil GivePoints hanya akan berjalan ketika variabel PointsGiven adalah 0. Karena kita segera menetapkan nilai ke 1 ketika kita memulai Peristiwa, ini mencegah Peristiwa dari menembak lebih dari sekali dan memastikan pemain akan menerima jumlah poin yang benar.

Jika Anda menjalankan permainan pada titik ini, Anda harus menerima jumlah poin yang benar untuk setiap pertandingan yang Anda buat, bahkan jika Anda tidak memiliki masalah ini untuk memulai.


Menghilangkan Pre-Made Matches

Sekarang setelah kita berhasil memperbaikinya, kita dapat melanjutkan untuk menciptakan sistem yang akan menghilangkan kecocokan yang dihasilkan oleh sistem ketika secara acak memberikan warna pada blok-blok yang dibuatnya.

Masalah yang kita miliki sekarang adalah, karena warna Blok sepenuhnya acak, tidak jarang bagi Anda untuk memulai permainan dan melihat banyak pertandingan segera dibuat. Ini adalah masalah karena bisa membuat beberapa detik pertama dari permainan sangat membingungkan bagi seseorang yang belum pernah bermain sebelumnya, dan karena itu memberikan poin pemain yang tidak mereka hasilkan.

Untuk mengatasi masalah ini, kita akan membuat fungsi yang akan melihat setiap blok dan kemudian melihat apakah blok itu berwarna sama dengan tetangganya. Jika warnanya sama dengan tetangganya, ia akan terus mengubah warna blok itu sampai tidak lagi cocok dengan blok yang mengelilinginya.

Untuk membuat sistem ini berfungsi, kita juga harus membuat beberapa fungsi pendukung dan Acara juga, dan menambahkan variabel instan baru ke objek Block.

Cara Kerjanya

Pertama, buat variabel instan baru untuk objek Block:

Variabel ini adalah apa yang akan kita gunakan untuk mengidentifikasi blok dengan mudah sehingga kita dapat mengatakan beberapa fungsi yang akan kita lakukan untuk memblokir apa yang ingin kita lihat, terlepas dari posisinya.

Sebelum kita melanjutkan, kita juga perlu mulai menggunakan variabel ini. Pergi ke On start of layout yang menciptakan blok dan tambahkan Aksi baru sebelum Tindakan yang meningkatkan NumBlocks:

Acara penghalau blok Anda sekarang akan terlihat seperti ini:

Match3_Part7_ModifiedBlockSpawning

Selanjutnya kita perlu membuat fungsi yang akan mengambil posisi X dan Y dari sebuah blok dan memberi tahu kita warna blok apa itu:

Fungsi akan terlihat seperti ini ketika selesai:

Match3_Part7_GetBlockColor

Sekarang kita memiliki fungsi yang dapat memberi tahu kita warna dari setiap blok, kita akan membuat fungsi yang benar-benar akan melihat blok dan menentukan apakah itu memiliki Blok tetangga yang memiliki warna yang sama.

Cara kerja fungsi ini cukup sederhana.

  • Pertama, kita akan melewatkan BlockID ke dalam fungsi.
  • Jika saat ini ada blok dengan BlockID itu, fungsi akan melihat pada empat blok yang berdekatan, dan akan menentukan apakah blok yang dilihatnya memiliki warna yang sama dengan tetangganya.
  • Jika menemukan tetangganya dengan warna yang sama, ia akan mulai mengubah warna blok yang dilihatnya, dan itu akan terus berubah warna sampai Blok tersebut memiliki warna yang berbeda dari semua tetangganya.

Sebelum kita dapat membuat Peristiwa ini, kita harus membuat Variabel Global baru. Dalam fungsi ini kita akan menggunakan loop While untuk menentukan apakah warna blok perlu diubah. Variabel yang akan kita buat adalah variabel yang akan digunakan Loop Sementara untuk menentukan apakah perlu terus berjalan:

Tips: Acara yang akan kita buat berisi Peristiwa Berbasis Or. Jika Anda belum pernah membuat blok Peristiwa yang memiliki atribut Atau semua yang harus Anda lakukan adalah membuat Blok Acara seperti biasa dan kemudian klik kanan seluruh Blok dan pilih Make 'Or' Block. Tidak seperti Blok Peristiwa standar yang mengharuskan semua kondisi diisi sebelum akan diaktifkan, blok Atau akan menyala jika kondisi apa pun terpenuhi.

Jadi, mari kita buat Acara:

Acara Anda akan terlihat seperti ini:

Match3_Part7_RemoveSpawnedMatches_Fixed

Jadi bagaimana fungsi ini bekerja persis?

Hal pertama yang dilakukan adalah mengecek Block dengan BlockID yang dilewatkan oleh sistem. Ketika ia menemukan bahwa Block itu menetapkan nilai HasMatchingNeighbors ke 1 dan kemudian menjalankan while loop.

Karena while loop hanya akan berjalan ketika HasMatchingNeighbors adalah 1, itulah nilai yang ditetapkan. Selama Loop Sementara, tes ini untuk melihat apakah ada Block tetangga di sebelah kiri, kanan, di atas, atau di bawah yang berwarna sama dengan Block yang kita lihat. Jika menemukan Block yang cocok di tiap posisi ini, secara acak memberikan warna baru ke Block dan kemudian menjalankan tes lagi dengan memastikan HasMatchingNeighbors diatur ke 1. Ketika akhirnya menemukan warna untuk Block yang tidak cocok dengan tetangganya, itu mengubah nilai HasMatchingNeighbors ke 0 sehingga loop Sementara berakhir dan program dapat melanjutkan.

Sekarang kita perlu mengimplementasikan fungsi ini ke dalam game; untuk melakukan ini kita harus membuat dua variabel baru dan dua fungsi baru. Mari kita mulai dengan variabelnya.

Variabel Anda akan terlihat seperti ini:

Match3_Part7_CheckMatchesVariables

Dua variabel yang baru saja kita buat akan digunakan untuk memicu dua Peristiwa yang akan kita buat. Peristiwa itu sendiri akan digunakan untuk mengulang melalui blok segera setelah mereka dibuat dan mengirim setiap blok ke fungsi RemoveSpawnedMatches.

Alasan kita tidak hanya memanggil fungsi RemoveSpawnedMatches segera setelah membuat blok adalah karena kotak blok harus lengkap agar fungsi berfungsi dengan benar. Jadi, daripada hanya memanggil fungsi secara langsung ketika blok dibuat, kita malah akan memicu Peristiwa yang dapat melewati blok dan memanggil Fungsi sendiri setelah grid dihasilkan.

Peristiwa pertama akan secara khusus untuk iterasi melalui kelompok awal blok:

Seperti inilah tampilan acara Anda:

Match3_Part7_CheckStartingMatches

Peristiwa kedua akan secara khusus untuk memeriksa baris baru dari blok ketika dibuat:

Seperti inilah Event kedua akan terlihat seperti:

Match3_Part7_CheckNewestRow

Implementasi

Dengan kedua fungsi ini di tempat kita sekarang hanya perlu menerapkannya. Pergi ke Acara awal yang membuat blok, On Start of Layout Event. Kita akan menambahkan Sub-Event ke ini yang akan memberitahu Event CheckStartingMatches untuk diaktifkan.

Acara Anda seharusnya sekarang terlihat seperti ini:

Match3_Part7_ModifiedStartofLayout

Sub-Event ini mendengarkan ketika loop For nested telah berakhir dan kemudian mengubah nilai variabel CheckStartingMatches untuk mengaktifkan Event yang sesuai.

Kita sekarang akan membuat Sub-Peristiwa yang hampir sama dan melampirkannya ke fungsi SpawnNewBlocks.

SpawnNewBlocks seharusnya sekarang terlihat seperti ini:

Match3_Part7_MdifiedSpawnNewBlocks

Sub-Peristiwa ini melakukan hal yang sama seperti yang sebelumnya, kecuali bahwa ia mengaktifkan Peristiwa lain yang dibuat. Jika Anda menjalankan permainan pada titik ini Anda harus melihat bahwa ketika Anda memulai permainan tidak ada lagi pertandingan yang terjadi secara otomatis.


Kesimpulan

Dalam tutorial ini, kita tidak membuat terlalu banyak perubahan pada game, tetapi yang dilakukan sangat penting.

Pada titik ini, saya pikir sebaiknya kita berhenti sekarang dan menyimpan dua elemen game terakhir untuk tutorial berikutnya, di mana kita akan membahas rantai/kombo dan layar Game Over. Ini akan menjadi bagian terakhir dari seri, jadi saya juga akan berbicara tentang beberapa mekanisme permainan yang tidak akan kita bahas dalam tutorial ini, dan memberi Anda beberapa saran tentang bagaimana Anda dapat membuat sistem itu sendiri.

Jika Anda ingin memulai lebih awal pada konten minggu depan, mulailah melihat bagaimana Anda dapat mendeteksi ketika layar Game Over akan muncul, berdasarkan posisi atau ketinggian beberapa blok. Sebagai alternatif, mulailah berpikir tentang bagaimana Anda dapat mendeteksi ketika pemain membuat reaksi berantai yang menyebabkan lebih dari satu kelompok terbentuk.

Apa pun yang Anda lakukan, saya berharap dapat melihat Anda kembali ke sini minggu depan untuk seri terakhir dari seri ini.

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.