Saya ingin mengembangkan peta dunia yang besar; setidaknya berukuran 8000 × 6000 piksel. Saya telah memecahnya menjadi 10 × 10 kotak gambar 800 × 600-pixel PNG. Untuk menghindari memuat semuanya ke dalam memori, gambar harus dimuat dan diturunkan tergantung pada posisi pemain di grid.
Sebagai contoh, berikut adalah pemain di posisi (3,3)
:
Saat ia bergerak ke kanan ke (4,3)
, tiga gambar di paling kiri dideallocated sedangkan tiga gambar di kanan dialokasikan:
Mungkin harus ada ambang batas di dalam setiap sel grid yang memicu pemuatan dan pembongkaran. Pemuatan mungkin terjadi di utas terpisah.
Bagaimana cara merancang sistem seperti itu?
Jawaban:
Ada beberapa masalah yang harus dipecahkan di sini. Yang pertama adalah cara memuat dan membongkar ubin. ContentManager secara default tidak akan membiarkan Anda menurunkan konten tertentu. Namun, implementasi kustom ini akan:
Masalah kedua adalah bagaimana memutuskan ubin mana yang akan dimuat dan dibongkar. Berikut ini akan menyelesaikan masalah ini:
Masalah terakhir adalah bagaimana memutuskan kapan memuat dan membongkar. Ini mungkin bagian yang paling mudah. Ini hanya dapat dilakukan dalam metode Pembaruan () setelah posisi layar pemain ditentukan:
Tentu saja Anda juga perlu menggambar ubin, tetapi mengingat tileWidth, tileHeight, dan array Tiles [], ini harus sepele.
sumber
Apa yang ingin Anda lakukan cukup umum. Untuk tutorial yang bagus tentang ini dan teknik umum lainnya, lihat seri mesin ubin ini .
Jika Anda belum pernah melakukan hal seperti ini sebelumnya, saya sarankan menonton serial ini. Namun, jika Anda mau, Anda bisa mendapatkan kode tutorial terakhir. Jika Anda melakukannya nanti, periksa metode menggambar.
Singkatnya, Anda harus menemukan poin min dan maks X / Y di sekitar pemain. Setelah Anda memilikinya, Anda hanya perlu mengulang masing-masing dan menggambar ubin itu.
Seperti yang Anda lihat ada banyak hal yang terjadi. Anda memerlukan kamera yang akan membuat matriks Anda, Anda perlu mengubah lokasi piksel Anda saat ini ke indeks ubin, Anda menemukan titik min / maks Anda (saya menambahkan sedikit ke MAX saya sehingga sedikit menarik di luar layar terlihat sedikit ), dan kemudian Anda bisa menggambarnya.
Saya sangat menyarankan menonton seri tutorial. Dia membahas masalah Anda saat ini, cara membuat editor ubin, menjaga pemain dalam batas, animasi sprite, interaksi AI, dll ...
Di samping catatan TiledLib memiliki ini dibangun. Anda dapat mempelajari kode mereka juga.
sumber
Saya telah mengerjakan sesuatu yang sangat mirip untuk proyek saya saat ini. Ini adalah langkah cepat bagaimana saya melakukannya, dengan beberapa catatan tambahan tentang cara membuat hal-hal sedikit lebih mudah pada diri Anda sendiri.
Bagi saya, masalah pertama adalah memecah dunia menjadi bongkahan-bongkahan yang lebih kecil yang sesuai untuk dimuat dan dibongkar dengan cepat. Karena Anda menggunakan peta berbasis ubin, langkah itu menjadi jauh lebih mudah. Daripada mempertimbangkan posisi masing-masing objek 3D di level, Anda sudah membagi level Anda menjadi ubin. Ini memungkinkan Anda memecah dunia menjadi potongan-potongan ubin berukuran X demi Y, dan memuatnya.
Anda ingin melakukannya secara otomatis, bukan dengan tangan. Karena Anda menggunakan XNA, Anda memiliki opsi untuk menggunakan Pipeline Konten dengan eksportir kustom untuk konten level Anda. Kecuali Anda tahu cara menjalankan proses ekspor tanpa kompilasi ulang, saya sejujurnya akan merekomendasikan untuk tidak melakukannya. Meskipun C # tidak terlalu lambat untuk dikompilasi seperti C ++ cenderung, Anda masih tidak ingin harus memuat Visual Studio dan mengkompilasi ulang game Anda setiap kali Anda membuat perubahan kecil pada peta.
Hal penting lain di sini adalah memastikan Anda menggunakan konvensi penamaan yang baik untuk file yang berisi potongan level Anda. Anda ingin dapat mengetahui bahwa Anda ingin memuat atau membongkar chunk C, dan kemudian menghasilkan nama file yang Anda perlu memuat untuk melakukan itu pada saat dijalankan. Akhirnya, pikirkan hal-hal kecil yang mungkin bisa membantu Anda. Sangat menyenangkan bisa mengubah seberapa besar bongkahan, mengekspor kembali, dan kemudian melihat efeknya terhadap kinerja dengan segera.
Pada saat run time, itu masih cukup mudah. Anda perlu beberapa cara untuk memuat dan membongkar bongkar secara asinkron, tetapi ini sangat tergantung pada cara kerja gim atau mesin Anda. Gambar kedua Anda benar-benar tepat - Anda perlu menentukan potongan apa yang harus dimuat atau diturunkan, dan membuat permintaan yang sesuai untuk membuat kasing jika belum. Tergantung pada berapa banyak potongan yang Anda muat pada satu waktu, Anda bisa melakukan ini setiap kali pemain melewati batas dari satu chunk ke chunk berikutnya. Bagaimanapun, Anda ingin memastikan bahwa cukup dimuat bahwa bahkan dalam waktu muat terburuk (wajar), potongan masih dimuat sebelum pemain dapat melihatnya. Anda mungkin ingin bermain dengan nomor ini sampai Anda mendapatkan keseimbangan yang baik antara kinerja dan konsumsi memori.
Sejauh arsitektur aktual berjalan, Anda akan ingin abstrak proses sebenarnya memuat dan menurunkan data dari memori dari proses menentukan apa yang harus dimuat / dibongkar. Untuk iterasi pertama Anda, saya bahkan tidak akan khawatir tentang kinerja bongkar / muat dan hanya mendapatkan hal paling sederhana yang mungkin dapat bekerja, dan memastikan bahwa Anda menghasilkan permintaan yang sesuai pada waktu yang tepat. Setelah itu, Anda dapat melihat mengoptimalkan cara memuat untuk meminimalkan sampah.
Saya mengalami banyak kompleksitas tambahan karena mesin yang saya gunakan, tapi itu implementasi yang cukup spesifik. Jika Anda memiliki pertanyaan tentang apa yang saya lakukan, beri komentar dan saya akan melakukan apa yang saya bisa untuk membantu.
sumber