Cara Terbaik untuk Membuat Peta untuk Game 2D?

16

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.

IAE
sumber
Mesin apa yang Anda gunakan?
David Titarenco
Windows dengan C ++ menggunakan SFML sejauh ini (SFML dapat berubah; C ++ tidak). Kami tidak bertujuan untuk atm portabilitas.
IAE
2
Jika Anda menggunakan Zelda sekolah tua di NES, gunakan hanya peta 1 layar. Peta kecil membantu pemain memfokuskan ruang lingkup niat mereka (yaitu di ruang bawah tanah, Anda hanya berurusan dengan kamar Anda. Di diablo, monster tidak bergerak naik & turun lantai) dan memungkinkan mereka merasa selesai jika mereka telah mencari di seluruh area bahwa game ruang terbuka seperti FAllout3 dan Oblivion tidak memberi Anda.
Stephen Furlani

Jawaban:

27

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).

Lupakan
sumber
6
Beberapa matematika ilustratif: Tile * s 10MB memberi Anda kotak dengan 1619 ubin per sisi. Peta Zelda asli memiliki 256 petak di sisi yang panjang dan kurang dari setengah di sisi yang pendek - sehingga peta Anda bisa lebih dari 36x lebih besar dari Zelda pertama dengan penggunaan memori. Apakah Anda benar-benar siap untuk membuat konten sebanyak itu ? (Tidak.)
@ user744 Komentar itu sangat menyesatkan. Untuk membuat peta, Anda membutuhkan lebih dari sekadar petunjuk ke ubin. Anda perlu menyimpan data yang berisi ubin juga. Tidak setiap game 2D memiliki jumlah ubin tetap yang telah ditentukan.
Jeroen
5

Secara pribadi, saya akan membangun peta menggunakan editor ubin yang ditunjuk seperti TileEd . Pendekatan ini menghasilkan beberapa manfaat:

  • Menggunakan lebih sedikit sumber daya. Anda hanya perlu memuat lembar ubin dan file data dengan indeks untuk membangun peta yang berpotensi tidak ada habisnya.
  • Karena peta Anda akan dibagi menjadi potongan yang sangat kecil (tergantung pada ukuran ubin Anda), Anda dapat dengan mudah menambah / menghapus baris / kolom saat karakter bergerak di seluruh dunia.
  • Memiliki file data yang menggambarkan peta Anda juga memungkinkan Anda untuk menambahkan informasi terrain dengan mudah. Hal ini memungkinkan untuk jenis ubin yang berbeda seperti dinding atau danau (yaitu hambatan) atau rawa di mana gerakan karakter dapat diperlambat ...
  • Terakhir, peta berbasis ubin juga jauh lebih mudah untuk diedit dan diubah nantinya karena Anda selalu dapat menjalankan editor, mengubah beberapa hal, dan menyimpan file data baru.

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 Spritekelas atau menggunakan Copyfungsi Imagekelas.

Pembaruan: Saya baru saja membaca beberapa dokumen SFML dan Anda harus menggunakan Drawableatau Spritebukannya memanipulasi gambar demi kinerja. Rupanya ada loader SFML Ubin di luar sana. Itu mungkin cara yang baik untuk mendapatkan sesuatu dan berlari cepat.

bummzack
sumber
1

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.

Daniel X Moore
sumber
0

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/

mrall
sumber
-3

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.

Stephen Furlani
sumber
Hanya karena 10fps dapat diterima untuk gim Anda tidak membuatnya menjadi ide yang baik, terutama pada perangkat dengan kendala daya seperti iPhone. Anda bisa melakukan zero redraws, membiarkan sisi GPU menangani rasterisasi, dan benar-benar membiarkan program menghabiskan waktu tidur, sehingga ponsel tidak menjadi panas atau kehabisan baterai.
@ Jo Wreschnig ... ??? Saya mengatakan itu berdasarkan permintaan, ketika pemain menggerakkan layar, jika tidak gambar latar belakang untuk UIImageView tidak dapat digambar ulang , sehingga menghemat daya pemrosesan. Komentar Anda tidak masuk akal.
Stephen Furlani
Saya tidak membuat klaim tentang fps yang dibutuhkan gim Anda. Saya mengatakan, OpenGL dapat menyediakan 60fps untuk hal seperti itu secara sepele (sungguh, Anda bahkan tidak berbicara tentang "redraws" dengan adegan statis dan OpenGL) - jika Anda hanya perlu 10fps maka menggunakan OpenGL memungkinkan Anda tidak membuang daya baterai untuk "50 bingkai" lainnya. Metode menggambar Anda boros di dunia dengan akselerasi GPU. Itu mungkin OK pada PC, tetapi tidak ketika Anda menghabiskan baterai.
@ Jo, aku masih tidak yakin apa yang kamu katakan. Ini menggambar. Kemudian gambar dibiarkan sendiri sampai pemain mencapai batas, dan kemudian menggambar ulang gambar baru. Bagaimana itu menghabiskan masa pakai baterai? Ini hanya "menarik" berdasarkan permintaan, dan sisa waktu tampilan digambar menggunakan algoritma gambar asli UIImageView.
Stephen Furlani