Menciptakan tingkat multiplayer 2D looping mulus?


15

Sebuah diskusi muncul baru-baru ini tentang cara membuat game multiplayer side-scrolling 2D yang dapat memiliki desain level perulangan (Pikirkan Starbound dan bagaimana dunianya diulang).

Saya pikir cara paling sederhana adalah memiliki peta persegi panjang dengan zona pemicu yang dapat memindahkan pemain dari satu sisi ke sisi lain. Namun masalah yang jelas dengan pendekatan ini adalah kasus memiliki banyak pemain di tepi peta sekaligus. Anda tidak ingin hanya memindahkan pemain di depan satu sama lain dan Anda perlu cara untuk mengangkut pemain tanpa menghilangkan pemain lain.

Untuk menambahkan ide ini dan memperbaiki masalah saya datang dengan yang berikut: memiliki zona pemicu (kotak merah di gambar) di mana pemain akan dapat melihat "zona klon" (kotak hijau). Dalam kotak hijau ini, objek dari sisi berlawanan dari zona pemicu akan disalin ke zona klon yang sesuai (dapat dilihat dengan bentuk A & B). Ketika seorang pemain mencapai tepi awal "zona klon" mereka diteleportasi ke sisi lain peta.

gambar

Dalam contoh ini Player 2 akan berpikir mereka melihat Player 1, namun mereka sebenarnya akan melihat tiruannya dan sebaliknya.

Ini tampak agak ekstrem dan kompleks untuk masalah yang dihadapi. Pertanyaan saya sekarang adalah untuk mengetahui apakah solusi ini merupakan pendekatan yang baik untuk mengatasi masalah ini, atau adakah cara yang lebih sederhana untuk menyelesaikan masalah ini?


Apakah pemain diizinkan untuk mundur ke area sebelumnya?
XiaoChuan Yu

ya, bolak-balik sehingga memberi semacam efek "berjalan keliling dunia". Mirip dengan bagaimana dunia dalam starbound adalah
KenQueso

2
Sudahkah Anda mempertimbangkan untuk menjadikan dunia ini lingkaran besar? atau memperlakukan level sebagai lingkaran besar dan menerjemahkannya ke tahap 2D datar?
Nzall

tidak bisakah kamu selalu menyelaraskan posisi kamera dengan pemain yang dikendalikan?
Ali1S232

Jawaban:


16

Sistem ini dengan semua pemicu ini terdengar agak rumit dan rentan kesalahan.

Anda bisa membungkus posisi pemain menggunakan modulo dengan sesuatu seperti playerPositionX = playerPositionX % mapWidth

Dengan cara ini ketika pemain Anda mencapai playerPosition == mapWidthyangplayerPosition akan reset kembali ke 0.

Solusi ini dapat diperluas dengan seluruh sistem rendering.


1
tidakkah ini akan menjadi masalah penutupan oleh pemain yang melihat pemain yang posisinya mengatur ulang teleport pergi?
KenQueso

Bagaimana Anda memperluas ini ke sistem rendering?
Mikael Högström

Anda bisa memiliki pemain yang selalu berada di tengah kamera dan membungkus peta. Seperti peta dalam peradaban pada mode bumi. Salah satu pendekatan lain adalah membuat bagian yang terlihat dari pemain di kedua sisi peta.
Exaila

4
@ MikaelHögström Hanya membuat seperti biasa, tetapi hal-hal yang dekat dengan tepi kanan harus diberikan untuk yang kedua kalinya di sebelah kiri (yaitu di pos - map_width).
Mario

1
Di mana pun dalam kode Anda yang Anda cari 'objek apa di koordinat ini' atau 'apa koordinat objek ini', Anda akan membuatnya xcoord% mapWidth. Sulit untuk mengatakan tanpa kode Anda, tetapi itu mungkin akan membuatnya dengan benar.
Tin Man

13

Solusi kanonik adalah menggunakan portal . Dalam contoh Anda, hanya ada satu level, kecuali ada portal yang menghubungkan ujung kiri dan kanan.

Apa pun yang bergerak di portal itu akan memiliki koordinat yang diterjemahkan ke ujung portal, sehingga jika sesuatu bergerak ke kiri melalui portal, itu akan muncul kembali di sisi kanan level dan sebaliknya.

Kamera Anda juga perlu mendukung portal; jika portal ada di dalam kamera, maka harus membuat bagian level di kedua sisi portal. Jika Anda terbiasa dengan editor gambar untuk grafik ubin yang mulus, ini adalah kesepakatan yang sama di sini.

Bagian yang membosankan adalah bahwa segala sesuatu yang berhubungan dengan jarak atau jalur juga perlu mendukung portal. Ini termasuk AI, algos line-of-sight, redaman suara dan sebagainya.

Yang menyenangkan tentang portal adalah ia sangat kuat. Mesin build menggunakannya untuk mensimulasikan tingkat multi-cerita, meskipun itu bukan mesin 3d "benar". Beberapa mesin modern menggunakan portal juga untuk membuat ruang non-Euclidean; Portal dan Antichamber adalah contoh penting dalam 3D.


2
Jika Anda mendengarkan komentar dari gim portal, bagian dari cara kerja portal diimplementasikan dengan mengkloning apa yang terlihat melalui lubang. (Tapi untuk alasan fisika daripada rendering)
Mooing Duck

6

Ingat bahwa apa yang Anda tampilkan di layar, dan apa yang ada dalam memori adalah dua hal yang sangat berbeda. Bayangkan Anda memiliki jendela yang perlu Anda isi dengan data tentang dunia. Anda mengisi jendela dari kiri ke kanan. Saat Anda mem-parsing data Anda untuk mengisi dunia, jika Anda mencapai ujung dunia, cukup putar kembali ke awal data Anda. Menggunakan operasi modulo sangat ideal. Ingat Anda harus melakukan ini untuk semuanya . Proyektil, sinar, pemain, fisika; mereka semua harus memiliki posisi mereka dibungkus ketika melintasi batas dunia.

Setiap pemain berbagi data, tetapi memiliki perspektif data sendiri. Jendela mereka dihuni secara berbeda tergantung di mana mereka berdiri di dunia.

Ini berarti tidak perlu membuat klon, atau memindahkan siapa pun. Pada dasarnya Anda sedang menciptakan klon, hanya dengan render karakter untuk layar masing-masing.


3

Putuskan sambungan rendering dari dunia dan Anda dapat melakukan rendering dan memperbaiki rendering tanpa menggunakan artefak kloning atau teleportasi.

Pertama, di dunia Anda, Anda memiliki dunia ukuran tetap, dari 0hingga Width. Kapan saja suatu objek berjalan di bawah 0 Anda membungkusnya sampai akhir, dan kapan saja sebuah objek selesai Widthmembungkusnya dengan awal. Ini berarti bahwa semua objek logis di dunia Anda selalu berada dalam jangkauan0...Width .

Kedua, untuk rendering Anda akan melakukan modulo pada posisi itu. Jadi sisi kiri layar adalah "Basis" dan sisi kanan adalah "Basis + Ukuran". Jadi Anda mencari di dunia Anda untuk apa pun dalam rentang itu. Anda akan benar-benar mencari rentang modulo, yang memetakannya kembali 0...Width.

Trik saat mencari adalah mengembalikan posisi objek relatif ke Basesisi kiri. Ini mengonversi ke koordinat lokal layar sehingga penyaji itu sendiri tidak perlu khawatir tentang modulo, hanya pencarian yang melakukannya.

Anda tidak perlu mengkloning apa pun karena setiap renderer hanya berurusan dengan objek di satu lokasi.

Jika dunia Anda diproduksi dalam segmen, atau menggunakan struktur 3D, Anda harus mengelompokkannya. Dengan demikian itu bukan satu blok consitunous, tetapi dapat dipindahkan untuk mengakomodasi rendering ini. Anda tidak perlu banyak blok, minimal 2.


1

Saya pikir satu-satunya pendekatan yang masuk akal adalah menerapkan dunia terbungkus Anda dalam struktur data yang mendasari sepenuhnya transparan untuk permainan dan pengguna. Jadi pada beberapa Level Rendah Anda memiliki fungsi mapCoordinate () yang membungkus koordinat aktual Anda ke sumber daya peta yang mendasar ...

Jadi, jika Dunia Anda yang sebenarnya hanya selebar 10 unit, pemain dan permainan tidak akan mengetahuinya. Untuk pemain, dunia tidak terbatas - dan jika permainan bertanya apa yang ada di posisi 15 - fungsi yang mendasarinya akan menerjemahkan permintaan ini, modulo10 dan akan memberikan paket item pada posisi 5.

Jadi untuk seluruh logika permainan dan yang lainnya, itu seperti Anda memiliki dunia besar tanpa batas, di mana ada salinan segala sesuatu.


1

Ini tidak persis sama, tetapi saya menerapkan sesuatu yang serupa di sebuah game jam. Permainan ini membuat pemain bergerak pada tingkat lingkaran kecil, melilit ketika pemain mencapai posisi 'x' pi. Merender itu mudah karena kami baru saja merender semuanya dan kemudian memutar kamera offset untuk melacak apa yang sedang terjadi. Anda dapat mengimplementasikan sesuatu yang serupa, seperti yang disarankan di atas:

  • Saat menggambar, periksa posisi kamera dan tentukan apa yang perlu digambar, dengan mempertimbangkan posisi kamera dan jangkauan visinya.
  • Dalam kasus di mana kamera melihat melewati 'tepi' peta, pilih jumlah konten yang sesuai dari sisi lain dunia untuk menggambar di tepi itu, biasanya hanya dengan menambah atau mengurangi lebar level ke posisi mereka.
  • Logika gim perlu menyadari jahitan ini dan menyesuaikannya seperti yang disebutkan dalam jawaban lain. Kasus khusus yang harus diperhatikan adalah tabrakan di mana satu objek berada di satu sisi, tetapi bertabrakan dengan objek di sisi lain.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.