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

Biarkan Pemain Anda Membatalkan Kesalahan Dalam Game Mereka Dengan Pola Perintah

by
Difficulty:IntermediateLength:LongLanguages:

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

Banyak game berbasis giliran menyertakan tombol undo untuk membiarkan pemain membalikkan kesalahan yang mereka buat selama bermain. Fitur ini menjadi sangat relevan untuk pengembangan game mobile di mana sentuhan mungkin memiliki pengenalan sentuhan yang ceroboh. Daripada mengandalkan sistem di mana Anda bertanya kepada pengguna, "Anda yakin ingin melakukan tugas ini?" untuk setiap tindakan yang mereka lakukan, jauh lebih efisien untuk membiarkan mereka melakukan kesalahan dan memiliki opsi untuk dengan mudah membalikkan tindakan mereka. Dalam tutorial ini, kita akan melihat bagaimana mengimplementasikan ini menggunakan Command Pattern, menggunakan contoh permainan tic-tac-toe.

Catatan: Meskipun tutorial ini ditulis menggunakan Java, Anda harus dapat menggunakan teknik dan konsep yang sama di hampir semua lingkungan pengembangan game. (Ini tidak terbatas pada permainan tic-tac-toe, baik!)


Pratinjau Hasil Akhir

Hasil akhir dari tutorial ini adalah permainan tic-tac-toe yang menawarkan operasi undo and redo tanpa batas.

Demo ini membutuhkan Java untuk dijalankan.

Tidak dapat memuat applet? Tonton video gameplay di YouTube:

Anda juga dapat menjalankan demo di baris perintah menggunakan TicTacToeMain sebagai kelas utama untuk dieksekusi. Setelah mengekstrak sumber, jalankan perintah berikut:


Langkah 1: Buat Implementasi Dasar Tic-Tac-Toe

Untuk tutorial ini, Anda akan mempertimbangkan implementasi tic-tac-toe. Meskipun gim ini sangat sepele, konsep yang diberikan dalam tutorial ini dapat diterapkan pada game yang jauh lebih kompleks.

Unduhan berikut (yang berbeda dari unduhan sumber final) berisi kode dasar untuk model permainan tic-tac-toe yang tidak mengandung fitur undo atau redo. Ini akan menjadi tugas Anda untuk mengikuti tutorial ini dan menambahkan fitur-fitur ini. Unduh basis TicTacToeModel.java.

Anda harus memperhatikan, khususnya, metode berikut ini:

Metode-metode ini adalah satu-satunya metode untuk game ini yang mengubah keadaan grid game. Mereka akan menjadi apa yang akan diubah.

Jika Anda bukan pengembang Java, Anda mungkin masih dapat memahami kode tersebut. Ini disalin di sini jika Anda hanya ingin merujuknya:


Langkah 2: Memahami Pola Perintah

Pola Command adalah pola desain yang umum digunakan dengan antarmuka pengguna untuk memisahkan tindakan yang dilakukan oleh tombol, menu, atau widget lain dari definisi kode interface pengguna untuk objek-objek ini. Konsep pemisahan kode tindakan ini dapat digunakan untuk melacak setiap perubahan yang terjadi pada kondisi permainan, dan Anda dapat menggunakan informasi ini untuk membalikkan perubahan.

Versi paling dasar dari pola Command adalah interface berikut:

Setiap tindakan yang diambil oleh program yang mengubah keadaan permainan - seperti menempatkan X di ruang tertentu - akan mengimplementasikan interface Command. Ketika tindakan diambil, metode execute() dipanggil.

Sekarang, Anda mungkin memperhatikan bahwa antarmuka ini tidak menawarkan kemampuan untuk membatalkan tindakan; yang dilakukannya hanyalah membawa game dari satu negara ke negara lain. Peningkatan berikut ini akan memungkinkan tindakan implementasi untuk menawarkan kemampuan undo.

Tujuan ketika mengimplementasikan suatu Command adalah untuk memiliki metode undo() membalikkan setiap tindakan yang diambil oleh metode execute. Sebagai konsekuensinya, metode execute() juga akan dapat memberikan kemampuan untuk mengulang suatu tindakan.

Itu ide dasarnya. Ini akan menjadi lebih jelas saat kita menerapkan Perintah spesifik untuk game ini.


Langkah 3: Buat Manajer Perintah

Untuk menambahkan fitur undo, Anda akan membuat kelas CommandManager. CommandManager bertanggung jawab untuk melacak, mengeksekusi, dan membatalkan implementasi Command.

(Ingat bahwa interface Command menyediakan metode untuk membuat perubahan dari satu keadaan program ke yang lain dan juga membalikkannya.)

Untuk mengeksekusi Command, CommandManager dilewatkan contoh Command, dan itu akan mengeksekusi Command dan kemudian menyimpan Command yang paling baru dieksekusi untuk referensi nanti.

Menambahkan fitur undo ke CommandManager hanya perlu memberitahukannya untuk membatalkan Command terbaru yang dieksekusi.

Kode ini adalah semua yang diperlukan untuk memiliki CommandManager yang fungsional. Agar berfungsi dengan baik, Anda harus membuat beberapa implementasi interface Command.


Langkah 4: Buat Implementasi dari Command Interface

Tujuan dari pola Command untuk tutorial ini adalah untuk memindahkan kode apa pun yang mengubah status game tic-tac-toe menjadi instance Command. Yaitu, kode dalam metode placeX() dan placeO() adalah apa yang akan Anda ubah.

Di dalam kelas TicTacToeModel, tambahkan masing-masing dua kelas bagian dalam yang disebut PlaceXCommand dan PlaceOCommand, yang masing-masing mengimplementasikan interface Command.

Tugas implementasi Command adalah untuk menyimpan keadaan dan memiliki logika untuk transisi ke keadaan baru yang dihasilkan dari pelaksanaan Command atau untuk transisi kembali ke keadaan awal sebelum Command dieksekusi. Ada dua cara mudah untuk mencapai tugas ini.

  1. Simpan seluruh negara bagian sebelumnya dan negara bagian berikutnya. Setel status saat ini game ke status berikutnya saat execute() dipanggil dan atur status saat ini game ke status sebelumnya yang disimpan saat undo() dipanggil.
  2. Simpan hanya informasi yang berubah antar states. Ubah hanya informasi yang disimpan ini ketika execute() atau undo() dipanggil.

Opsi pertama agak boros, tapi bukan berarti desainnya jelek. Kode mudah dan kecuali informasi negara sangat besar jumlah limbah tidak akan menjadi sesuatu yang perlu dikhawatirkan.

Anda akan melihat bahwa, dalam hal tutorial ini, opsi kedua lebih baik, tetapi pendekatan ini tidak selalu menjadi yang terbaik untuk setiap program. Namun, lebih sering daripada tidak, opsi kedua adalah jalan yang harus ditempuh.

Opsi kedua hanya menyimpan perubahan yang terjadi, bukan seluruh negara. Dalam hal tic-tac-toe, lebih efisien dan tidak terlalu kompleks untuk menggunakan opsi ini.

Kelas dalam PlaceOCommand ditulis dengan cara yang sama - silakan menulis sendiri!


Langkah 5: Satukan Semuanya

Untuk memanfaatkan implementasi Command, PlaceXCommand dan PlaceOCommand, Anda perlu memodifikasi kelas TicTacToeModel. Kelas harus menggunakan CommandManager dan harus menggunakan instance Command alih-alih menerapkan tindakan secara langsung.

Kelas TicTacToeModel akan berfungsi persis seperti sebelum perubahan Anda sekarang, tetapi Anda juga dapat mengekspos fitur undo. Tambahkan metode undo() ke model dan juga tambahkan metode pemeriksaan canUndo untuk interface pengguna untuk digunakan di beberapa titik.

Anda sekarang memiliki model permainan tic-tac-toe yang berfungsi penuh yang mendukung undo!


Langkah 6: Ikuti Lebih Lanjut

Dengan beberapa modifikasi kecil pada CommandManager, Anda dapat menambahkan dukungan untuk operasi yang dilakukan ulang serta jumlah undo dan redos yang tidak terbatas.

Konsep di balik fitur redo hampir sama dengan fitur undo. Selain menyimpan Command terakhir yang dijalankan, Anda juga menyimpan Command terakhir yang dibatalkan. Anda menyimpan Command itu saat membatalkan dipanggil dan menghapusnya saat Command dijalankan.

Menambahkan beberapa undo dan redo adalah masalah menyimpan setumpuk tindakan yang tidak dapat dibatalkan dan diperbaiki. Ketika tindakan baru dieksekusi ditambahkan ke undo stack dan redo stack dihapus. Ketika suatu tindakan dibatalkan, ia ditambahkan ke tumpukan redo dan dihapus dari tumpukan undo. Ketika suatu tindakan redone, itu dihapus dari tumpukan ulang dan ditambahkan ke tumpukan dibatalkan.

Undo and redo in game development with the command pattern

Gambar di atas menunjukkan contoh tumpukan yang sedang beraksi. Redo stack memiliki dua item dari perintah yang telah dibatalkan. Ketika perintah baru, PlaceX(0,0) dan PlaceO(0,1), dieksekusi, redo stack dihapus dan ditambahkan ke undo stack. Ketika PlaceO(0,1) dibatalkan, itu dihapus dari atas tumpukan dibatalkan dan ditempatkan di tumpukan ulang.

Berikut ini tampilannya dalam kode:

Sekarang Anda memiliki model permainan tic-tac-toe yang dapat membatalkan tindakan semua jalan kembali ke awal permainan dan mengulangnya lagi.

Jika Anda ingin melihat bagaimana semua ini cocok, ambil unduhan sumber terakhir, yang berisi kode lengkap dari tutorial ini.


Kesimpulan

Anda mungkin telah memperhatikan bahwa CommandManager terakhir yang Anda tulis akan bekerja untuk implementasi Command apa pun. Ini berarti Anda dapat membuat CommandManager dalam bahasa favorit Anda, membuat beberapa instance dari interface Command, dan menyiapkan sistem lengkap untuk undo/redo. Fitur undo bisa menjadi cara yang bagus untuk memungkinkan pengguna menjelajahi game Anda dan membuat kesalahan tanpa merasa berkomitmen pada keputusan yang buruk.

Terima kasih telah tertarik pada tutorial ini!

Sebagai bahan pemikiran lebih lanjut, pertimbangkan hal berikut: pola Command bersama dengan CommandManager memungkinkan Anda untuk melacak setiap perubahan negara selama eksekusi game Anda. Jika Anda menyimpan informasi ini, Anda dapat membuat replay dari pelaksanaan program.

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.