Saya sedang mengerjakan game puzzle sederhana berbasis blok.
Bermain game terdiri dari cukup banyak blok bergerak di sekitar area permainan, jadi ini adalah simulasi fisika sepele. Implementasi saya, bagaimanapun, menurut saya jauh dari ideal dan saya bertanya-tanya apakah Anda bisa memberi saya petunjuk tentang bagaimana melakukannya dengan lebih baik.
Saya telah membagi kode menjadi dua area: Logika permainan dan UI, seperti yang saya lakukan dengan banyak permainan puzzle:
- Logika permainan bertanggung jawab untuk aturan umum permainan (misalnya sistem aturan formal dalam catur)
- UI menampilkan area permainan dan potongan-potongan (misalnya papan catur dan potongan-potongan) dan bertanggung jawab untuk animasi (misalnya gerakan animasi potongan-potongan catur)
Logika permainan mewakili kondisi permainan sebagai kisi-kisi logis, di mana setiap unit memiliki lebar / tinggi satu sel pada kisi. Jadi untuk kisi dengan lebar 6, Anda dapat memindahkan blok dengan lebar 2 empat kali sampai bertabrakan dengan batas.
UI mengambil kotak ini, dan menggambarnya dengan mengubah ukuran logis menjadi ukuran piksel (yaitu, mengalikannya dengan konstanta). Namun, karena gim ini hampir tidak memiliki logika gim, lapisan logika gim saya [1] tidak memiliki banyak hal selain deteksi tabrakan. Begini cara kerjanya:
- Pemain mulai menyeret sepotong
- UI meminta logika game untuk area pergerakan legal dari bagian itu dan membiarkan pemain menyeretnya di dalam area itu
- Pemain melepaskan sepotong
- UI mengambil potongan ke kisi (sehingga berada pada posisi logis yang valid)
- UI memberi tahu logika game posisi logis baru (melalui metode mutator, yang saya lebih suka hindari)
Saya tidak cukup senang dengan itu:
- Saya menulis unit test untuk lapisan logika permainan saya, tetapi bukan UI, dan ternyata semua kode rumitnya ada di UI: Menghentikan potongan agar tidak bertabrakan dengan orang lain atau batas dan menjentikkannya ke grid.
- Saya tidak suka fakta bahwa UI memberi tahu logika permainan tentang keadaan baru, saya lebih suka memanggil
movePieceLeft()
metode atau sesuatu seperti itu, seperti dalam permainan saya yang lain, tapi saya tidak jauh dengan pendekatan itu, karena logika permainan tidak tahu apa-apa tentang menyeret dan memotret yang mungkin dilakukan di UI.
Saya pikir hal terbaik untuk dilakukan adalah menyingkirkan lapisan logika permainan saya dan menerapkan lapisan fisika sebagai gantinya. Saya punya beberapa pertanyaan tentang itu:
- Apakah layer fisika seperti itu biasa, atau apakah lebih tipikal jika layer logika game melakukan ini?
- Apakah snapping to grid dan piece dragging code milik UI atau layer physics?
- Apakah lapisan fisika seperti itu biasanya bekerja dengan ukuran piksel atau dengan beberapa jenis unit logis, seperti lapisan logika permainan saya?
- Saya pernah melihat pendeteksian tabrakan berbasis peristiwa dalam basis kode game, yaitu, pemain hanya akan menyeretnya, UI akan menerjemahkannya dengan patuh dan memberi tahu sistem fisika, dan sistem fisika akan memanggil metode onCollision () pada potongan setelah tabrakan terdeteksi. Apa yang lebih umum? Pendekatan ini atau meminta area pergerakan hukum terlebih dahulu?
[1] layer mungkin bukan kata yang tepat untuk apa yang saya maksud, tetapi subsistem terdengar berlebihan dan kelas salah arah, karena setiap layer dapat terdiri dari beberapa kelas.
Jawaban:
Saya akan mencoba mencoba menjawab pertanyaan ini karena saya bisa mengerti apa yang Anda tanyakan, meskipun saya tidak punya banyak pengalaman pengembangan game karena saya masih hanya belajar.
Seperti yang saya lihat, Anda harus memisahkan kode GUI dari logika game dan objek domain Anda, yaitu potongan puzzle. Ini memang tiga lapisan terpisah - dan ya,
layer
adalah istilah yang tepat menurut saya. Hal ini sering digunakan untuk menjelaskan konsep-konsep memisahkan setiap tingkat objek dari suatu sistem menjadi subsistem yang independen satu sama lain.Dalam hal pemrograman berorientasi objek, setiap objek harus kelas. Jadi, setiap potongan puzzle Anda harus terdiri dari satu kelas untuk masing-masing, dan juga papan permainan. Papan permainan harus berisi potongan X puzzle tergantung pada ukuran dan kapasitas gerakan yang ingin Anda berikan kepada pemain.
Jadi, inilah pemikiran saya tentang topik ini - Saya harap ini akan membantu:
Dalam arsitektur ini, Anda akan meminta layer GUI menampilkan pemain dari kondisi permainan, lokasi setiap potongan puzzle. Lapisan GUI kemudian akan bertanggung jawab untuk mendapatkan input pemain dan meneruskannya ke lapisan Game Controller yang mendasarinya, yang kemudian akan bertanggung jawab untuk deteksi tabrakan. Jika tidak ada, maka bagian tersebut dapat dipesan untuk bergerak ke arah input itu. Untuk melakukannya, Anda cukup memanggil bagian ini
MoveLeft
,MoveRight
, dll. metode untuk membuat potongan bergerak. Anda mungkin juga membiarkan papan permainan tahu bagian mana yang ingin Anda pindahkan, dan kemudian ia memesan sendiri gerakan itu, dan bagian itu kemudian bergerak ke arah yang diminta. Arsitektur ini membuatnya mudah untuk menguji setiap bagian kode ke dalam lapisan yang berbeda, dan kemudian memungkinkan Anda untuk pengujian unit, pengujian integrasi dan pengujian fungsional.Saya tahu ini mungkin tampak sedikit membingungkan untuk dilihat, dan terima kasih Tuhan jika tidak! Jika Anda memerlukan perincian dan bantuan lebih lanjut, silakan bertanya, saya akan dengan senang hati membantu yang terbaik yang saya bisa meskipun saya pemula dalam pengembangan game.
Terima kasih sudah membaca! =)
sumber
Position
fungsi pengambil properti, sehingga pengendali permainan sekarang meminta GUI untuk menampilkan bagian yang dipindahkan ini ke posisi yang baru.