Pencarian Jalur Berbasis Grid
Dalam tutorial ini, kita akan membuat simulasi pencarian jalur berdasarkan grid array dua dimensi. Ini akan memberi kita pemahaman dasar dalam menciptakan aktivitas pencarian jalur untuk permainan kita. Kita akan memvisualisasikan grid menggunakan objek kotak kosong sebagai ubin dan objek bulat sebagai avatar kita yang dapat bergerak di area grid tersebut sesuai dengan perintah kita.
I. Menyiapkan objek
Kita hanya akan menggunakan empat objek dalam proyek kita. Avatar hijau kita, ubin biru, blokade putih, dan label grid untuk menyiapkan dan memvisualisasikan grid kita.
Avatar
Avatar kita adalah objek kosong yang memiliki skala x dan y sebesar 50%. Atur tabrakan menjadi bentuk bulat agar terlihat seperti gambar di bawah. Objek ini akan memiliki tiga atribut yang telah ditentukan: pada ubin, ubin sebelumnya, dan ubin target. Atur nilai default atribut ini menjadi nol agar tidak memiliki nilai nol ketika kita mencoba mengambilnya nanti.
Objek Ubin
Buat objek kosong lainnya yang akan digunakan untuk memvisualisasikan ubin dalam grid kita. Skalanya juga 50% dan hanya memiliki satu atribut yang telah ditentukan: pada ubin. Atur juga nilai ini menjadi nol.
Objek Blokade
Buat objek kosong lainnya yang akan berfungsi sebagai blokade dalam grid kita. Ini adalah objek kosong putih dengan skala 40%. Avatar kita tidak akan dapat melintasi ubin yang memiliki blokade di atasnya.
Label Grid
Ini hanyalah sebuah label yang akan memiliki perilaku yang memungkinkan penyiapan dan visualisasi grid kita. Ini memiliki atribut yang telah ditentukan: mulai x dengan nilai 4, dan mulai y dengan nilai 3. Nilai ini adalah offset yang akan digunakan sebagai referensi saat memunculkan ubin kita agar posisi grid kita rapi di tengah.
Atribut Prabentuk Avatar/Ubin:
Kita mendefinisikan ubin di sini sebagai array berukuran 2 yang akan memiliki nilai x dan y berdasarkan grid kita.
- pada ubin - ini adalah nilai ubin yang saat ini menjadi lokasi objek kita di grid
- ubin sebelumnya - ubin yang sebelumnya dilalui oleh avatar kita
- ubin target - ubin yang akan dituju oleh avatar kita
II. Menyiapkan grid
Di dalam label grid adalah tempat kita akan mendefinisikan array 2D dan pemunculan grid kita. Ada 2 poin utama dalam objek ini: mengatur array, dan memvisualisasikan array. Mari kita lakukan terlebih dahulu pengaturan array.
Atur array - bundel
Pertama adalah membuat array kosong bernama 'Grid'. Array ini akan berisi array dua dimensi kita. Kita akan memiliki kontainer kotak bernama 'jumlah baris x' yang memiliki nilai 24 dan array kosong lainnya bernama 'baris y' yang memiliki 18 nilai kosong.
Perilaku pertama dalam bundel kita adalah loop dengan jumlah pengulangan dari 'jumlah baris x'. Untuk setiap langkah dari loop ini, kita akan menambahkan baris y kosong ke dalam 'array Grid'. Ini akan membuat array di dalam array dengan dimensi 24x18.
Perhatikan bahwa kita menghubungkan komentar tidak aktif di awal bundel kita untuk meniadakan eksekusi otomatis dari perilaku akar ini. Perilaku akar adalah perilaku yang tidak terpicu berdasarkan kejadian apa pun dan ditempatkan secara terbuka dalam antarmuka.
Visualisasikan grid - bundel
Hal utama yang akan kita lakukan di sini adalah menjelajahi setiap nilai dari 'array Grid' dan memunculkan objek ubin. Kita juga akan menambahkan kondisi dalam loop kita yang akan memungkinkan pemunculan blokade putih di atas objek ubin.
Pertama adalah mengambil jumlah array dari 'array baris y', nilai atribut 'mulai x' dari objek ini dan 'mulai y'.
Buat loop yang memiliki pengulangan 'jumlah baris x' dan untuk setiap langkah dari loop ini, kita akan menambahkan nilai indeks dari loop itu dan nilai atribut 'mulai x'. Ini menghasilkan posisi x absolut yang akan kita gunakan untuk memposisikan ubin yang kita munculkan nanti. Selanjutnya adalah 'loop baris y' yang memiliki pengulangan 'jumlah baris y'. Untuk setiap langkah dari loop ini, kita akan menambahkan nilai indeks dari loop itu dan nilai atribut 'mulai y', yang sekarang akan menghasilkan posisi y absolut.
Setelah menambahkan nilai di bawah 'loop baris y' adalah untuk memunculkan objek biru. Atur jumlah objek hidup menjadi 999 karena kita akan membutuhkan banyak dari mereka untuk grid kita, dan juga dengan durasi 0. Kemudian pindahkan objek yang dipunculkan ke titik x dengan nilai dari loop x 'tambahkan nilai', dan titik y dengan nilai dari loop y 'tambahkan nilai'.
Selanjutnya adalah menambahkan array dengan 2 nilai kosong bernama 'Pada ubin' yang hanya akan kita gunakan sebagai placeholder array. Setelah memindahkan objek ubin adalah untuk memodifikasi array 'Pada ubin' dengan mengganti nilai di indeks 0 dengan nilai dari 'loop baris x'. Kemudian tambahkan modifikasi array lain yang, mengganti nilai di indeks 1 dengan 'indeks baris y'. Ini adalah koordinat x dan y dari grid kita yang akan dimiliki objek sebagai atribut 'pada ubin'.
Sekarang, atur atribut objek yang dipunculkan dengan kunci dinamis, 'pada ubin', dan dengan nilai 'Array pada ubin'.
Masih, di bawah loop baris y, adalah kondisi untuk memunculkan objek blokade putih. Kita akan memiliki peluang 2 dari 5 untuk menjalankan bundel ini yang akan menambah variasi acak pada grid kita. Kemudian kita akan menandai nilai 1 pada koordinat x dan y itu dalam array 'Grid' yang memberi tahu kita bahwa koordinat tersebut memiliki blokade yang dipunculkan.
Pertama adalah mendapatkan angka acak dari 1 hingga 5. Jika angka itu kurang dari atau sama dengan 2, kita akan memunculkan blokade. Atur jumlah objek hidupnya menjadi 999 dan pindahkan objek itu ke titik yang sama dengan ubin biru yang kita munculkan sebelumnya, dan juga dengan durasi 0.
Selanjutnya adalah menyimpan informasi bahwa koordinat ini ditempati oleh blokade, jika telah dipunculkan. Kita melakukan ini dengan menandai bahwa koordinat tersebut dengan nilai 1. Pertama adalah mendapatkan nilai di indeks 'loop baris x' dari array 'Grid'. Nilai ini akan memberikan kita array dari 'baris y'. Kita akan memodifikasi 'baris y' ini dengan mengganti nilai di indeks 'loop baris y' dengan nilai 1, yang merupakan nilai yang ditandai. Karena modifikasi nilai ini hanya berlaku untuk nilai tersebut, dan bukan untuk 'Grid itu sendiri', kita masih perlu memodifikasi array 'Grid'. Ganti nilai di indeks 'loop baris x' dari array 'Grid' dengan nilai 'modifikasi baris y - array'.
Ketika dimainkan, itu seharusnya menghasilkan bentuk seperti ini.
III. Saat Ubin Ditekan
Untuk dapat berinteraksi dengan grid itu sendiri, kita akan memerlukan perilaku bundel setiap kali kita menekan ubin biru. Tekanan pertama akan menghasilkan kemunculan avatar kita di grid kita, dan setiap tekanan berturut-turut setelah peristiwa tersebut akan memulai pencarian jalurnya.
Di dalam objek biru adalah bundel perilaku yang memiliki 3 poin utama: mengatur ulang ubin sebelumnya dari avatar kita, mengatur pada ubin/mengatur ubin targetnya, lalu mengatur animasi warna untuk memvisualisasikan peristiwa sentuh di layar.
Pertama adalah mendapatkan atribut 'pada ubin' dari objek ubin. Atur atribut 'ubin sebelumnya' dari avatar kita menjadi 0. Avatar kita akan diatur untuk menghindari kembali ke 'ubin sebelumnya' itulah sebabnya kita mengatur ulang 'ubin sebelumnya' pada setiap penekanan ubin.
Selanjutnya adalah mendapatkan atribut 'pada ubin' dari avatar kita. Jika kondisi if pertama adalah apakah nilai 'pada ubin' sama dengan nol. Ini berarti bahwa jika avatar belum muncul, maka ini akan menghasilkan true. Jika true, maka kita atur atribut 'pada ubin' dengan nilai dari atribut objek ubin 'pada ubin'. Kemudian pindahkan posisi avatar kita dengan mendapatkan posisi objek ubin, mengarahkan nilai x dan y ke titik itu dengan durasi 0.
Jika nilai 'pada ubin' tidak sama dengan nol, kita akan mengatur atribut 'ubin target' dari avatar kita dengan nilai atribut 'pada ubin' objek ubin. Ini berarti bahwa avatar kita sudah ada di grid kita, dan kemudian, kita bisa menjalankan bundel perilaku, 'temukan jalur'. Kita masih belum memiliki perilaku ini tetapi kita akan memperbaiki ini lagi setelah melakukan bagian selanjutnya dari tutorial ini untuk bundel 'temukan jalur'.
Sekarang kita telah mengatur avatar kita dengan benar di grid kita, kita hanya perlu memvisualisasikan peristiwa penekanan ini. Pertama adalah memiliki perilaku akar 'dapatkan warna' untuk mendapatkan warna aslinya. Kemudian setelah peristiwa penekanan, kita akan mengatur warna objek ubin menjadi hitam dengan durasi 0, lalu mengatur warnanya kembali lagi ke nilai aslinya dengan durasi 0.2.
Menekan ubin biru harus menghasilkan ini.
IV. Eksekusi Bundel Temukan Jalur
Untuk bagian terakhir dari tutorial kita ini, kita akan melakukan algoritma yang memungkinkan kita menemukan ubin terdekat yang bisa diambil avatar kita untuk mencapai tujuannya. Bundel ini akan dieksekusi berulang kali untuk setiap langkah ubin yang dilakukan avatar kita di grid kita.
Kita akan mengatur algoritma di dalam objek avatar kita dan itu akan memiliki tiga poin utama: mencari ubin yang berdekatan, menemukan ubin berdekatan terdekat, dan pergerakan ke ubin berdekatan tersebut.
Mencari ubin yang berdekatan
Di bagian ini, kita akan mengumpulkan semua ubin yang berdekatan yang bisa dilalui oleh avatar kita. Kita akan memeriksa ubin berdekatan dalam empat arah dan melihat apakah ubin tersebut memiliki blokade di atasnya atau jika sudah pernah dilalui sebelumnya.
Pertama adalah menambahkan array 'Ubin berdekatan' kita. Sebuah array 'Arah' dengan 2 nilai kosong, dan empat array arah yang memiliki 2 nilai untuk setiap arah: N (0,1), S (0,-1), E (1,0), W( -1,0).
Perilaku pertama dalam bundel kita adalah menghapus ubin berdekatan kita. Karena kita akan melakukan bundel ini berulang kali, kita perlu mereset 'ubin berdekatan' yang kita kumpulkan setiap kali. Empat perilaku berikutnya adalah modifikasi terhadap array 'Arah'. Kita mengatur array dari array 'Arah' empat kali dengan empat array arah tersebut, kemudian menjalankan bundel di bawah. Kita melakukan ini untuk membuat loop dengan nilai array 'Arah' yang berbeda setiap kali.
Sekarang kita memiliki arah, kita hanya perlu menggabungkan nilai x dan y mereka dengan atribut 'pada ubin' dari avatar kita. Kemudian kita akan dapat mendapatkan nilai target kita dalam array 'Grid' untuk mengetahui apakah ubin itu sudah ditandai dengan blokade.
'Arah x' adalah nilai dari array 'Arah' di indeks 0, 'dapatkan x pada ubin' adalah nilai dari 'dapatkan x pada ubin' di indeks 0. Target x adalah nilai tambahan dari 'arah x' dan 'dapatkan x pada ubin'. Begitu juga untuk nilai y tetapi dengan indeks target 1.
'Target y baris' adalah nilai array dari array 'Grid' di indeks 'Target x'. Dan kemudian 'Indeks target di baris y' akan menjadi nilai array 'Target y baris' di indeks 'Target y'. Itu adalah koordinat di grid kita yang akan memberi tahu kita apakah ubin itu sudah ditandai dengan blokade.
Jika nilai di 'Indeks target di baris y' adalah 1, maka ubin target itu telah ditandai sebagai terhalang. Tetapi jika nilai tersebut tidak sama dengan 1, kita bisa melanjutkan ke bundel kita.
Karena Target x dan y kita telah memenuhi kondisi, kita telah menambahkan ubin baru yang kosong bernama 'Ubin berdekatan baru'. Ini akan menyimpan nilai Target x dan y sebagai array ubin. Kita akan mengatur nilai Target x ke indeks 0 dari 'Ubin berdekatan baru' dan Target y ke indeksnya 1.
Sekarang ambil atribut 'ubin sebelumnya' dari avatar kita. Jika 'ubin sebelumnya' tidak sama dengan 'ubin berdekatan baru', ini akan berarti bahwa ubin baru itu belum pernah dilalui sebelumnya. Maka, kita bisa dengan aman menambahkan 'Ubin Berdekatan Baru' ke array 'Ubin Berdekatan' dengan menambahkannya. Kita akan mengatur nilai 'ubin sebelumnya' nanti setelah avatar kita berhasil bergerak ke ubin lain.
"Anda dapat memperluas bundel ini dengan membuat array 8 arah yang memungkinkan avatar Anda bergerak ke arah diagonal."
Mencari ubin berdekatan terdekat
Sekarang kita telah mengumpulkan ubin berdekatan yang dapat diandalkan, kita hanya perlu mengambil ubin berdekatan yang terdekat dengan ubin target avatar kita. Kita akan melakukan perhitungan dengan menggunakan rumus jarak yang disuplai oleh nilai x dan y dari ubin target dan ubin berdekatan.
Ada dua poin kunci dalam bundel ini: pengaturan variabel untuk perhitungan, dan perhitungan jarak ubin di dalam loop.
a. Pengaturan variabel
Pertama adalah mendapatkan jumlah array dari 'ubin berdekatan' kita. Kemudian kita mengambil atribut 'ubin target' dari avatar kita dan mendapatkan nilai x dan y-nya. Kita akan menambahkan 2 kontainer kotak baru: 'Jarak Min' dan 'Indeks ubin target'. Kita mengatur nilai awal dari 'Jarak Min' menjadi 9999, dan nilai dari 'Indeks ubin target' menjadi 0. Jarak min diatur ke angka tinggi karena kita membutuhkan jarak terendah dari awal. Indeks ubin target adalah indeks referensi kita dalam array 'Ubin berdekatan' yang memiliki jarak terendah ke 'ubin target' kita.
Tujuan utama kita di sini adalah untuk mendapatkan indeks ubin di dalam array 'Ubin berdekatan' yang terdekat dengan 'ubin target' kita.
b. Perhitungan jarak ubin
Dalam bundel ini, kita akan melakukan perhitungan di dalam loop yang akan kita lakukan untuk setiap ubin berdekatan. Loop mengulang dengan 'jumlah ubin berdekatan' dan kita akan mendapatkan nilai ubin dari array 'Ubin Berdekatan' dengan menggunakan indeks dari loop tersebut.
Dapatkan nilai x dan y dari ubin berdekatan itu dan kemudian kita akan mendapatkan jarak antara 'ubin target' dan 'ubin berdekatan' menggunakan rumus ini:
jarak = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Target x
x2 = Adjacent x
y1 = Target y
y2 = Adjacent y
Kita pertama-tama mengurangkan nilai x dan y mereka, mengalikannya dengan dirinya sendiri untuk mendapatkan nilai eksponensialnya, menambahkan nilai-nilai tersebut, dan kemudian mengambil akar kuadrat dari nilai yang ditambahkan, untuk mendapatkan nilai jarak.
Jika nilai 'Jarak' kurang dari nilai kontainer 'Jarak Min', maka kita akan mengatur nilai 'indeks ubin target' ke indeks loop saat ini, yang merupakan indeks ubin yang kita ambil dari array 'Ubin Berdekatan'. Kita juga mengatur nilai kontainer 'Jarak Min' dengan nilai 'Jarak' agar kita dapat membandingkannya dengan ubin berikutnya di loop kita.
Setelah akhir loop, kita telah membandingkan masing-masing ubin berdekatan kita dan kita telah mendapatkan nilai indeks dari ubin berdekatan yang terdekat dengan 'ubin target' kita.
Pergerakan ke ubin berdekatan
Dalam bundel terakhir dari tutorial kita, kita akan memindahkan avatar kita ke ubin berdekatan terdekat dan mengulangi seluruh bundel 'Temukan Jalur' jika kita belum bergerak ke 'ubin target' kita.
Hal pertama adalah memeriksa apakah 'jumlah ubin berdekatan' kita lebih besar dari 0. Ini untuk memastikan bahwa kita hanya akan bergerak jika kita telah mengambil setidaknya satu ubin berdekatan yang dapat diandalkan.
Kemudian kita 'Dapatkan ubin terdekat' dengan menggunakan nilai 'indeks ubin target' dari bundel sebelumnya untuk mendapatkan nilai array dari array 'Ubin Berdekatan'.
Untuk mendapatkan titik tepat di mana avatar kita akan bergerak, kita akan membutuhkan nilai x dan y dari ubin itu, dan juga mendapatkan nilai atribut 'mulai x' dan 'mulai y' dari label 'Grid' kita. Kita kemudian menambahkan nilai x dari 'ubin terdekat' dan nilai 'mulai x', dan juga hal yang sama dengan nilai y. Nilai yang ditambahkan ini adalah titik x dan y target kita di mana avatar kita akan bergerak.
Sebelum kita bergerak ke titik itu, kita mengatur 'ubin sebelumnya' avatar kita dengan nilai atribut 'pada ubin' saat ini. Kita bisa mendapatkan nilai 'pada ubin' ini dari bundel sebelumnya. Kita kemudian memindahkan avatar kita ke titik-titik target kita, dengan durasi 0.2.
Setelah penyelesaian perilaku 'Pindah ke titik', kita sekarang mengatur nilai atribut 'pada ubin' dari avatar kita dengan nilai array 'Dapatkan ubin terdekat'. Jika nilai array 'Dapatkan ubin terdekat' tidak sama dengan 'ubin target' kita, kita kemudian akan menjalankan bundel 'Temukan Jalur', dengan demikian, mengulang seluruh bundel lagi. Nilai atribut 'ubin target' dapat diperoleh dari bundel sebelumnya.
Dengan menekan ubin biru mana pun, dan setelah kemunculan avatar kita di grid, bundel 'Temukan Jalur' akan dijalankan. Ini akan memicu pergerakan avatar dari ubin ke ubin.
Kesimpulan
Dalam tutorial ini, kita telah belajar membuat aktivitas pencarian jalur objek menggunakan array yang kita sebut 'Grid', yang digunakan untuk menyimpan informasi apakah ubin tersebut terisi atau tidak. Anda dapat memperluas ide ini, dengan menggunakan id objek sebagai penyimpanan informasi alih-alih hanya angka digit untuk array 'Grid' kita. Ini akan memberi kita informasi yang lebih dapat diandalkan yang dapat kita gunakan saat melakukan pencarian jalur. Misalnya, kita dapat mengambil atribut dari id objek tersebut untuk mengetahui apakah masih hidup atau tidak, apakah itu akan memungkinkan kita untuk menginjak ubin tersebut atau tidak.
Tutorial ini hanya memberikan ide dasar di balik pencarian jalur. Satu kelemahan dari ini adalah bahwa ia tidak menciptakan jalur terpendek yang mungkin ke ubin target, dan hanya memeriksa ubin berdekatan saat ini. Ini dapat menyebabkan loop pergerakan yang tidak mencapai mana pun.
Namun, ini dapat diselesaikan dengan memperluas algoritma pencarian jalur kita. Kita bisa melakukannya dengan mengulangi ubin berdekatan yang kita ambil untuk mendapatkan ubin berdekatan mereka juga sampai kita menemukan ubin target kita. Setiap ubin berdekatan terdekat yang ditemukan akan ditambahkan ke daftar. Untuk mencegah loop tak berujung, tambahkan kondisi bahwa jika ubin berdekatan itu sudah diperiksa, ubin tersebut tidak akan ditambahkan ke daftar kita. Juga, tambahkan batas maksimum pada jumlah iterasi untuk mencegah loop tak berujung yang disebabkan oleh ubin target jika itu terlalu jauh atau tidak mungkin ditemukan. Setelah iterasi tersebut menemukan ubin target, kita kemudian keluar dari iterasi itu dan mulai memindahkan avatar dari ubin ke ubin menggunakan daftar ubin.

