Saya minta maaf atas kata kunci "terbaik" subyektif.
Teman saya dan saya sudah mulai membuat game petualangan 2D. Ini akan menjadi top-down dalam gaya pokemon atau zelda (hanya perspektif). Kami telah membahas metode membuat peta dunia besar yang dapat dilalui pemain tanpa melelahkan kemampuan memori mesin kami.
Impuls pertama kami adalah membuat peta besar dan lingkaran di sekitar pemain tempat konten akan dimuat. Kami pikir ini tidak akan bertahan lama dan memutuskan untuk mempartisi peta menjadi beberapa bagian. Pertama kami memiliki empat bagian besar, tetapi menyadari bahwa kami dapat memecahnya menjadi banyak bagian kecil.
Saya memainkan beberapa Zelda dari SNES dan melihat bahwa, selama pergeseran peta, konten dapat dimuat saat itu. Yang saya maksudkan adalah, alih-alih hanya memeriksa area persegi panjang untuk memuat data, kami cukup membagi peta menjadi banyak potongan kecil yang memuat dan menghapus data saat kami bergerak dari bagian peta ke bagian peta.
Hari ini, dia mengatakan kepada saya bahwa dia ingin membuat peta array 2D [WIDTH] [HEIGHT] yang berisi data tentang setiap kotak dalam permainan dan merupakan operasi simpan-ke-disk yang konstan untuk data yang tidak kita butuhkan.
Saya tidak yakin dengan ide-ide ini dan berpikir bahwa saya mungkin seperti itu di sini. Tautan, sumber daya, atau tutorial apa pun tentang topik ini akan sangat dihargai serta jawaban langsung atas pertanyaan kami tentang cara melakukannya secara efisien.
sumber
Jawaban:
Pertama, perkirakan ukuran peta Anda. Jangan hanya berasumsi bahwa "dunia besar" tidak akan sesuai dengan ingatan. Saat ini, peta yang mengambil memori hingga 10 mb benar-benar dapat diterima, dan Anda dapat memasukkan BANYAK dalam 10 mb di dunia 2D sederhana berbasis ubin.
Jika Anda memiliki dunia yang sangat besar, solusi yang paling kuat memang menggunakan potongan peta. Pisahkan dunia Anda menjadi bongkahan ukuran tetap (katakanlah, 64x64). Muat bongkahan on-the-fly saat pemain bergerak, menjaga setidaknya satu bidak dimuat ke semua arah (yaitu memuat bongkahan pemain di dan semua tetangganya).
Sedangkan untuk bongkar muat, Anda dapat memilih di antara beberapa strategi. Bongkar semangat berarti Anda menurunkan dan menyimpan ke disk semua potongan saat pemain bergerak cukup jauh; tetapi Anda juga dapat menunda pembongkaran untuk meningkatkan kinerja (menghemat bongkahan, karena akses disk apa pun, adalah operasi yang mahal).
sumber
Secara pribadi, saya akan membangun peta menggunakan editor ubin yang ditunjuk seperti TileEd . Pendekatan ini menghasilkan beberapa manfaat:
Saya sarankan Anda menghindari memuat bit peta selama bermain game untuk mencegah lag. Seperti disebutkan sebelumnya, ini seharusnya tidak perlu karena Anda mungkin dapat menyimpan ubin-lembar dalam memori. Ketika karakter memasuki bagian lain dari "dunia" Anda dapat menukar lembaran ubin dengan yang lain (mis. Ubin salju diganti dengan ubin gurun).
Memadukan ubin ke layar mungkin merupakan cara tercepat untuk membuat peta Anda. Saya tidak tahu SFML, tetapi dari dokumen di situs mereka Anda harus melihat ke dalam
Sprite
kelas atau menggunakanCopy
fungsiImage
kelas.Pembaruan: Saya baru saja membaca beberapa dokumen SFML dan Anda harus menggunakan
Drawable
atauSprite
bukannya memanipulasi gambar demi kinerja. Rupanya ada loader SFML Ubin di luar sana. Itu mungkin cara yang baik untuk mendapatkan sesuatu dan berlari cepat.sumber
Mulailah dengan membuat peta dengan ukuran yang diperlukan untuk menceritakan kisah yang Anda ingin game ceritakan. Uji pada mesin dengan spesifikasi minimum yang diperlukan bagi orang untuk memainkan game Anda. Jika terlalu lambat, profil dan optimalkan.
sumber
Menggunakan array 2D ubin individu adalah yang terbaik menurut saya. Anda dapat memiliki seluruh peta besar keseluruhan sebagai satu array 2D dan hanya menggambar bagian dari itu yang perlu ditampilkan pada waktu tertentu. Berikut ini adalah contoh penggunaan array peta 2D dengan pustaka game tabageos (tbgs.js) HTML5; http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/
sumber
Kecuali jika Anda berencana untuk membangun ulang ultima-online (Fallout 3, atau Oblivion), tidak ada alasan dunia perlu mulus. Gerbang Baldur dan Icewind Dale adalah dua game yang muncul di benak saya yang menerapkan peta efektif yang tidak mengurangi gameplay.
Memang, Anda memiliki tenaga kuda komputasi yang jauh lebih banyak daripada yang mereka miliki sehingga memuat layar harus minimal, tetapi bahkan Fallout dan Oblivion memiliki memuat layar untuk beberapa hal.
Yang bisa saya katakan adalah bagi saya, saya sedang menulis lib Obj-C kecil untuk iPhone yang mengambil 32x32 tileset dan menariknya ke dalam NSImage. Saya mendapatkan sekitar 10fps dengan cara ini, dan saya mungkin harus menggunakan OpenGL, tetapi saya hanya perlu menggambar ulang jika karakternya keluar dari kotak.
Anda harus membagi peta menjadi 9 ukuran layar (bagi saya ukuran 960x640 blok) jadi jika karakternya bergerak keluar dari blok tengah, saya menggambar kembali layar 9 menjadi gambar besar (sekitar 1,2MB - memberikan banyak ruangan di bawah batas 20MB pada iPhone 3G). Itu terjadi cukup lambat (jauh lebih lambat dari 10fps) sehingga menggambar ulang tidak terlihat selama bermain.
Saya mungkin akan pindah ke OpenGL ES di beberapa titik, tetapi untuk saat ini berfungsi dengan baik.
[EDIT]
Izinkan saya mengklarifikasi.
Algoritma menggambar untuk latar belakang 9 layar membutuhkan 0,1 detik (flat 10fps). Kecuali jika pemain Anda dapat melintasi seluruh layar dalam waktu kurang dari sepersepuluh detik, gambar ulang harus terlihat selama bermain.
sumber