Dalam game berbasis ubin 2d, apa metode yang bagus untuk menggulir?

9

Saya menggunakan Direct3D dengan pembungkus D3DXSPRITE untuk menggambar ubin ke layar. Saya memiliki kelas ubin yang berisi anggota seperti tabrakan dan jenis ubin, lalu saya memiliki array ubin misalnya

Kisi genteng [256] [256];

Metode mana yang lebih baik?

-Gambar pemain di tengah layar dan offset di mana peta menarik.

-Pindahkan pemain dengan mengikuti kamera.

Saya menggunakan metode pertama, tetapi semakin rumit ketika Anda sampai di tepi kiri atas peta, dan ketika pemain / musuh lain ada di peta dan bergerak pada saat yang sama

jika saya membuat kamera mengikuti pemain, apakah saya harus memanggil spriteBatch-> Draw (...) untuk setiap kotak petak tunggal meskipun hanya sedikit yang bisa muat di layar?


sumber

Jawaban:

4

Mungkin yang terbaik untuk melakukan semua pembaruan dan perhitungan secara "nyata", unit dunia dan memindahkan kamera. SpriteBatch Anda dapat melakukan pemusnahan sendiri tetapi jika terlalu lambat Anda dapat mencoba menentukan ubin apa yang perlu ditampilkan di layar dan hanya menggambar itu.


sumber
Anda mungkin ingin menulis kode untuk hanya menggambar sprite yang terlihat, terutama jika Anda perlu menambah ukuran kisi Anda.
2

Memindahkan kamera dalam koordinat dunia dan membuat karakter Anda bergerak di seluruh dunia adalah cara termudah untuk mendekati masalah ini, bekerja dalam koordinat dunia berarti Anda tidak perlu melakukan perhitungan tambahan saat itu mengarah ke semua sistem lain yang harus bekerja pada sebuah sistem koordinat relatif dan juga memahami di mana mereka berada di koordinat dunia.

Karena Anda bekerja dalam 2D, tip lain yang baik adalah melakukan partisi spasial, cara termudah adalah membuat sistem jaringan dunia virtual, ini akan memungkinkan Anda untuk mengelola setiap ubin secara individual dengan mengaitkan sprite dan sumber daya lainnya pada basis per ubin, jadi pada dasarnya prosesnya adalah:

  • buat beberapa kelas ubin yang dapat memegang koordinat batas untuk ubin dan sumber daya apa pun yang ubin tertentu mungkin perlu (sprite, musuh, dll.).

  • tentukan ukuran dunia Anda dan buat array 2D (Anda bisa menggunakan satu dimensi dan akses sebagai 2D) ubin yang masing-masing mewakili sedikit dunia Anda dengan semua sumber daya yang terkait.

  • hanya menarik sumber daya dari ubin pemain dan tetangga-tetangganya.

Dengan kisi, Anda dapat dengan mudah mengetahui petak pemain yang ada di berdasarkan posisi itu relatif terhadap awal kisi.

Untuk mengatasi masalah yang Anda sebutkan tentang kamera Anda perlu membuat pemain dan kamera dua sistem independen di mana kamera tidak akan melakukan perjalanan lebih jauh dari pusat ubin tepi sehingga ketika pemain melakukan perjalanan ke ubin itu ia masih bisa melakukan perjalanan di seluruh seluruh ubin karena ia terikat oleh koordinat dunia (yaitu tidak lagi terpusat di layar) tetapi kamera terkunci.

Sergio Franco
sumber
0

Saya menggunakan permukaan. Saya membuat seluruh dunia pada permukaan layar dan menjaga koordinat x dan y. Saya mengubah ini saat pemain bergerak dan setiap frame menggambar 1028 x 768 persegi panjang dari permukaan ke backbuffer menggunakan x dan y.

Adapun orang lain saya memberi mereka x dan y dan membiarkan mereka bergerak di seluruh dunia sesuka mereka, ketika menggambar saya memeriksa apakah ada x dan y dalam persegi panjang 1028 x 768 dan jika demikian menggambar mereka (saya menggunakan tekstur untuk orang-orang) .

Saya memiliki pemain di tengah layar dan memeriksa apakah ujung dunia telah mencapai tepi layar. Dalam keadaan ini, pemain bergerak tentang layar ke ujung dunia dan kembali ke tengah lalu dunia mulai bergerak lagi. sepertinya sulit dan butuh saya beberapa saat tetapi tidak terlalu buruk untuk dilakukan.

Saya menggunakan 64 x 64 ubin dan dunia terbesar yang saya gunakan sejauh ini adalah 50 x 60 ubin.

Ini semua dilakukan dalam x langsung dengan c ++

Skeith
sumber
1
Ini seperti memori babi yang besar. Menjaga seluruh dunia tetap berada di permukaan di luar layar akan membawa Anda ke masalah memori begitu Anda mulai ingin melakukan hal-hal seperti memiliki beberapa lapisan (animasi) untuk dunia Anda dan memperluasnya lebih jauh dari apa yang Anda miliki sekarang. Akan jauh lebih baik menyimpan informasi tentang dunia dan hanya menggambar bagian / objek yang perlu digambar ketika mereka perlu digambar. Hanya 2 sen saya. :)
Richard Marskell - Drackir
@Drackir, saya pikir Anda salah paham. hanya dunia ditarik dari layar, hal-hal seperti orang lain dilacak dan ditarik pada penyangga pendukung ketika mereka dibutuhkan. juga saya tidak melihat diri saya melakukan lebih dari 70 x 70 dunia. ketika saya mengatakan dunia yang saya maksud area, ini bisa menjadi kota penjara bawah tanah atau bagian dalam rumah, ketika pemain bergerak di antara mereka permukaan permukaan layar direkonstruksi. ya itu membutuhkan memori tetapi ubin 2d pada drive terrabite modern membuatnya dapat diabaikan dan memuat beberapa detik adalah harga kecil untuk membayar pengguliran dan animasi yang lancar. tapi ya ada cara yang lebih baik dan lebih sulit :)
Skeith
Permukaan harus disimpan dalam memori kartu GFX, bukan pada hard drive. Namun, saya percaya jika memori kartu GFX terlalu besar, itu akan memindahkan permukaan ke HD yang akan sangat memperlambat segalanya. Memang, sudah lama sejak saya sudah berurusan dengan hal-hal itu jadi saya tidak ingat persis bagaimana itu bekerja, tapi saya kira selama Anda tidak menggambar dunia terlalu besar itu akan baik-baik saja. :)
Richard Marskell - Drackir
@Drackir Itu menarik untuk diketahui, saya tidak pernah berpikir seperti itu. Saya menemukan bahwa cara ini memberi saya gulungan lebih halus bahwa jika saya secara dinamis menggambar ubin baru jadi saya pikir itu cocok ok tapi saya harus melihat ke dalamnya.
Skeith
Saya sedang mengerjakan sebuah game di mana saya memiliki peta 31x31 tetapi semuanya dilampirkan bersama. Saya sedang mencoba bekerja dari mesin orang lain dan mereka akan menggambar semua peta yang mengelilingi pemain itu; jadi sembilan peta secara total. Setiap peta memiliki beberapa (saya pikir 6) layer. Jadi, seperti 31x31x9x6 = 51894 petak digambar (maks, tentu saja; tidak semua petak penuh) setiap kali pengguna berganti peta. Itu adalah perlambatan besar bagi saya, jadi saya menulis ulang rutin menggambar untuk hanya menggambar ubin yang mengelilingi pemain sejauh 1 ubin melewati tepi layar (untuk menangani ubin sebagian saat bergerak).
Richard Marskell - Drackir
0

Kode ini cukup normal untuk mendapatkan sedikit rasa sakit di sudut-sudut dunia ubin, ketika mencari tahu gambar mana yang akan diambil, dan secara bersamaan memastikan kamera tidak pergi 'di luar dunia'. Casing tepi itu pada dasarnya adalah hal paling rumit tentang penerapan dunia berbasis ubin 2D yang lebih besar dari resolusi layar. Semakin rumit jika Anda mendukung pembesaran, dan memperbesar-ke-kursor: D

cliffski
sumber