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

Cara Padankan Bentuk Puzzle Menggunakan Bitmasks

by
Difficulty:IntermediateLength:LongLanguages:

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

Dalam tutorial ini, saya akan memandu anda melalui cara menganalisis papan jubin, melewati mereka, dan mencari perlawanan. Kami akan mencipta permainan di mana anda perlu menyambungkan garisan bersama untuk membentuk laluan yang tertutup dengan tiada hujung terbuka. Untuk memudahkan perkara, kami akan menggunakan bitmasking sebagai sebahagian daripada algoritma kami dengan memberikan setiap jubin (ditambah putarannya) nombor bitmasknya sendiri. Jangan bimbang jika anda tidak tahu apa bitmasking. Ia sebenarnya sangat mudah!


Main Demo

Saya akan mewujudkan projek dalam C# menggunakan Perpaduan dengan rangka kerja Futile, tetapi kod tersebut akan terpakai kepada hampir setiap kerangka 2D dengan beberapa perubahan. Inilah repo Github dengan keseluruhan Perpaduan projek. Dan di bawah ini adalah demo dimainkan dari permainan yang akan kami buat:


Klik anak panah untuk slaid baris dan lajur. Cuba buat bentuk tertutup.

Going Beyond Match-3

Apabila saya mula membuat Polimer, saya ingin mencipta sesuatu selain permainan perlawanan 3. Nama julukan dalaman saya adalah permainan "perlawanan-mana-mana". Permainan teka-teki Match-3 ada di mana-mana. Walaupun mereka pastinya bersenang-senang, salah satu sebab mereka begitu biasa adalah kerana algoritma untuk mencari perlawanan tiga jubin agak mudah.

Saya mahu dapat menyesuaikan jubin berganda yang boleh menenun masuk dan keluar dari baris dan lajur, merangkak ke arah papan. Bukan itu sahaja, tetapi saya tidak mahu permainan padanan warna yang mudah. Saya mahukan perlawanan akan berdasarkan pada sisi tertentu jubin (contohnya, satu bentuk hanya boleh menyambung kepada bentuk lain di sebelah kiri dan kanan, tetapi bukan bahagian atas dan bawah.) Ini ternyata jauh lebih rumit daripada hanya algoritma perlawanan-3 biasa.

Tutorial ini akan berpecah kepada tiga bahagian: Tile, Kumpulan Padanan, dan Papan Permainan. Dalam tutorial ini, saya akan cuba mengelakkan sebanyak mungkin kod khusus yang sia-sia. Sekiranya anda mahu melihat perkara-perkara tertentu yang tidak berguna, lihat kod sumber. Juga, saya tidak akan menunjukkan setiap kaedah dan pemboleh ubah dalam siaran ini. Hanya yang paling penting. Oleh itu, jika anda fikir ada sesuatu yang hilang, sekali lagi, lihat kod sumber.

Apa itu Bitmask?

Perkataan "bitmask" merujuk kepada cara anda boleh menyimpan satu siri nilai benar/salah dalam pemboleh ubah angka tunggal. Kerana nombor diwakili oleh orang-orang dan nol apabila diwakili dalam binari, dengan mengubah nombor yang anda boleh menghidupkan atau mematikan nilai dengan menogol sama ada bit adalah 1 atau 0.

Untuk maklumat lanjut, sila lihat artikel ini mengenai operator bitwise dan artikel ini mengenai nombor binari.


The Tile

Kelas pertama kami dipanggil LineTile. Sebelum permulaan kelas, mari kita tentukan setiap jenis jubin.

Inilah yang kelihatan seperti:

thePieces

Seterusnya, kerana kami hanya akan membenarkan putaran 90 darjah, mari membuat enum untuk putaran.

Seterusnya ialah struct yang dipanggil TileIndex, yang pada dasarnya sama dengan Vector2, kecuali dengan ints bukannya terapung. Ia akan digunakan untuk mengesan di mana jubin berada di papan permainan.

Akhirnya, mari kita tentukan tiga jenis sambungan antara dua jubin.

Seterusnya, dalam kelas itu sendiri, tentukan bitmask pada setiap sisi jubin generik.

tileBitmask

Kemudian tentukan pemboleh ubah contoh setiap jubin akan ada.

Untuk pembina, buat sprite dan tetapkannya pada putaran yang betul. Terdapat beberapa kod tertentu yang tidak berguna di sini tetapi haruslah mudah difahami.

Sekarang, salah satu bahagian yang paling penting. Kami menetapkan setiap jubin, digabungkan dengan putaran, bitmask yang ditentukan oleh mana sisinya pepejal dan yang terbuka.

allPieces

Ubin kami ditubuhkan dan kami bersedia untuk menyesuaikannya bersama!


Kumpulan Padanan

Kumpulan pertandingan hanya seperti itu: kumpulan jubin yang sepadan (atau tidak). Anda boleh memulakan mana-mana jubin dalam kumpulan perlawanan dan mencapai jubin lain melalui sambungannya. Semua jubinnya disambungkan. Setiap warna yang berbeza menunjukkan kumpulan perlawanan yang berbeza. Satu-satunya yang siap ialah biru di tengah-ia tidak mempunyai sambungan tidak sah.

matchGroups

Kelas kumpulan perlawanan itu sendiri sebenarnya sangat mudah. Pada dasarnya ia hanya koleksi ubin dengan beberapa fungsi penolong. Ini dia:


Permainan

Ini adalah sebahagian daripada proses yang paling rumit. Kita perlu menganalisis keseluruhan papan, memisahkannya ke dalam kumpulan perlawanan masing-masing, kemudian menentukan yang, jika ada, ditutup sepenuhnya. Saya akan memanggil BitmaskPuzzleGame kelas ini, kerana ia adalah kelas utama yang merangkumi logik permainan.

Sebelum kita melaksanakannya, mari kita tentukan beberapa perkara. Pertama adalah enum mudah bahawa anak panah akan diberikan berdasarkan satu arah yang mereka hadapi:

Seterusnya ialah struct yang akan dihantar dari anak panah yang ditekan supaya kita dapat menentukan di mana ia berada di papan dan arah mana yang dihadapi:

Seterusnya, dalam kelas, tentukan pembolehubah contoh yang kami perlukan:

Berikut adalah fungsi yang mengambil jubin dan mengembalikan semua jubin di sekitarnya (yang di atas, di bawah, di sebelah kiri, dan di sebelah kanannya):

Sekarang dua kaedah yang mengembalikan semua jubin dalam sama ada lajur atau baris supaya kami dapat beralih mereka:

Sekarang dua fungsi yang sebenarnya akan mengalihkan lajur atau baris jubin ke arah tertentu. Apabila jubin bergeser ke tepi, ia melingkari ke sisi lain. Contohnya, pergeseran kanan pada baris Nub, Cross, Line akan menghasilkan Barisan, Nub, Cross.

Apabila kami mengklik anak panah (iaitu apabila butang anak panah dibebaskan), kita perlu menentukan baris atau lajur mana yang hendak beralih, dan ke arah mana.

Dua kaedah seterusnya adalah yang paling penting dalam permainan. Yang pertama mengambil dua jubin dan menentukan jenis sambungan yang ada. Ia mendasari sambungan pada input jubin pertama ke dalam kaedah (disebut baseTile). Ini adalah perbezaan penting. The baseTile boleh mempunyai sambungan ValidWithOpenSide dengan Tile yang lain, tetapi jika anda memasukkannya dalam urutan terbalik, ia boleh kembali Tidak sah.

matchExplainer

Akhirnya, UpdateMatches. Ini adalah kaedah yang paling penting dari semua. Inilah yang melewati papan, menganalisis semua potongan, menentukan yang bersambung antara satu sama lain, dan kumpulan padanan yang mana pun ditutup sepenuhnya. Semua dijelaskan dalam komen.

Yang kita tinggalkan adalah fungsi HandleUpdate! Setiap bingkai, kemas kini kumpulan perlawanan jika mereka perlu mengemaskini (iaitu matchGroupsAreDirty == true), dan tetapkan warna mereka.

Inilah algoritma yang akan kelihatan seperti setiap langkah animasi:

boardAnimation

Dan itu sahaja! Walaupun sesetengah kod dalam perkara ini adalah khusus untuk Futile, ia harus menjadi jelas bagaimana untuk memperluaskannya ke mana-mana bahasa atau enjin yang lain. Dan untuk mengulangi, terdapat banyak perkara yang tidak penting yang hilang dalam siaran ini. Sila lihat kod sumber untuk melihat bagaimana ia berfungsi bersama!

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.