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.