Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Multiplayer
Gamedevelopment

Membangun Jaringan Game Multiplayer Peer-to-Peer

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Aisyah Arrafah (you can also view the original English article)

Memainkan permainan berbilang pemain sentiasa seronok. Daripada menewaskan lawan yang dikawal AI, pemain mesti menghadapi strategi yang dicipta oleh manusia lain. Tutorial ini membentangkan pelaksanaan permainan multiplayer yang dimainkan melalui rangkaian menggunakan pendekatan peer-to-peer (P2P) yang tidak berwibawa.

Nota: Walaupun tutorial ini ditulis menggunakan AS3 dan Flash, anda harus menggunakan teknik dan konsep yang sama dalam hampir semua persekitaran pembangunan permainan. Anda mesti mempunyai pemahaman asas tentang komunikasi rangkaian.

Anda boleh memuat turun atau membatalkan kod terakhir dari repo GitHub atau fail sumber zip.


Preview Keputusan Akhir

Demo rangkaian. Kawalan: panah atau WASD untuk bergerak, Ruang untuk menembak, B untuk menggunakan bom.

Seni dari Graphics Tyrian Remastered, Wabak Besi dan Vacuum keras oleh Daniel Cook (Taman Hilang).


Pengenalan

Permainan berbilang pemain yang dimainkan melalui rangkaian boleh dilaksanakan menggunakan beberapa pendekatan yang berbeza, yang boleh dikategorikan kepada dua kumpulan: berwibawa dan tidak berwibawa.

Dalam kumpulan yang berwibawa, pendekatan yang paling biasa ialah seni bina pelanggan-pelanggan, di mana entiti pusat (pelayan yang berwibawa) mengawal keseluruhan permainan. Setiap pelanggan yang disambungkan ke pelayan sentiasa menerima data, secara tempatan mencipta perwakilan keadaan permainan. Ia agak seperti menonton TV.

Pelaksanaan berwibawa menggunakan seni bina pelanggan-pelayan.

Jika pelanggan melakukan tindakan, seperti bergerak dari satu titik ke titik lain, maklumat tersebut dihantar ke pelayan. Server menyemak sama ada maklumat itu betul, kemudian mengemas kini keadaan permainannya. Selepas itu ia menyebarkan maklumat kepada semua pelanggan, supaya mereka boleh mengemas kini keadaan permainan mereka dengan sewajarnya.

Dalam kumpulan yang tidak berwibawa, tiada entiti pusat dan setiap rakan sebaya (permainan) mengawal keadaan permainannya. Dalam pendekatan peer-to-peer (P2P), rakan sebaya menghantar data kepada semua rakan sebaya lain dan menerima data daripada mereka, dengan mengandaikan bahawa maklumat itu boleh dipercayai dan betul (bebas-menipu):

Pelaksanaan tidak berwibawa menggunakan arsitektur P2P.

Dalam tutorial ini saya membentangkan pelaksanaan permainan berbilang pemain yang dimainkan melalui rangkaian menggunakan pendekatan P2P yang tidak berwibawa. Permainan ini adalah arena kematian di mana setiap pemain mengawal sebuah kapal yang mampu menembak dan menjatuhkan bom.

Saya akan memberi tumpuan kepada komunikasi dan penyegerakan negeri rakan sebaya. Permainan dan kod rangkaian dilancarkan sebanyak mungkin untuk memudahkan.

Tip: pendekatan yang berwibawa lebih selamat daripada penipuan, kerana pelayan sepenuhnya mengawal keadaan permainan dan boleh mengabaikan sebarang mesej yang mencurigakan, seperti entiti yang mengatakan ia berpindah 200 piksel apabila ia hanya dapat dipindahkan 10.

Menetapkan Permainan Bukan-Berwibawa

Permainan multiplayer yang tidak berwibawa tidak mempunyai entiti pusat untuk mengawal keadaan permainan, oleh itu setiap rakan sepatutnya mengawal keadaan permainannya sendiri, menyampaikan sebarang perubahan dan tindakan penting kepada orang lain. Akibatnya, pemain melihat dua senario secara serentak: kapalnya bergerak mengikut inputnya dan simulasi semua kapal lain yang dikawal oleh pihak lawan:

Kapal pemain dikawal secara tempatan. Kapal lawan disimulasikan berdasarkan komunikasi rangkaian.

Gerakan dan tindakan kapal pemain dipandu oleh input tempatan, jadi keadaan permainan pemain dikemas kini hampir serta-merta. Untuk pergerakan semua kapal lain, pemain mesti menerima mesej rangkaian dari setiap lawan yang memberitahu di mana kapal mereka berada.

Mesej-mesej tersebut mengambil masa untuk mengembara melalui rangkaian dari satu komputer ke komputer lain, jadi apabila pemain menerima maklumat yang mengatakan kapal lawan berada di (x, y), mungkin tidak ada lagi - itulah sebabnya simulasi:

Kelewatan komunikasi yang disebabkan oleh rangkaian.

Untuk memastikan simulasi itu tepat, setiap rakan sebaya bertanggungjawab untuk menyebarkan hanya maklumat tentang kapalnya, bukan yang lain. Ini bermakna, jika permainan mempunyai empat pemain - katakan A, B, C dan D - pemain A adalah satu-satunya yang dapat memaklumkan di mana kapal A adalah, jika ia terkena, jika ia menembakkan peluru atau menjatuhkan bom, dan sebagainya. Semua pemain lain akan menerima mesej dari A memaklumkan mengenai tindakannya dan mereka akan bertindak balas dengan sewajarnya, jadi jika peluru A mendapat kapal C, maka C akan menyiarkan mesej memaklumkan ia dimusnahkan.

Akibatnya, setiap pemain akan melihat semua kapal lain (dan tindakan mereka) mengikut mesej yang diterima. Di dunia yang sempurna, tidak akan ada latensi rangkaian, jadi mesej akan datang dan pergi serta-merta dan simulasi akan sangat tepat.

Walau bagaimanapun, apabila kependaman meningkat, simulasi menjadi tidak tepat. Contohnya, Pemain A pucuk dan tempatan melihat peluru yang memukul kapal B, tetapi tiada apa yang berlaku; itu kerana pandangan A terhadap B ditangguhkan kerana ketinggalan rangkaian. Apabila B sebenarnya menerima mesej peluru A, B berada pada kedudukan yang berbeza, jadi tidak ada hit yang disebarkan.


Pemetaan Tindakan Yang Berkaitan

Satu langkah penting dalam melaksanakan permainan dan memastikan setiap pemain dapat melihat simulasi yang sama dengan tepat adalah pengenalpastian tindakan yang relevan. Tindakan tersebut mengubah keadaan permainan semasa, seperti bergerak dari satu titik ke titik lain, menjatuhkan bom, dan lain-lain.

Dalam permainan kami, tindakan penting adalah:

  • menembak (kapal pemain melepaskan peluru atau bom)
  • bergerak (kapal pemain bergerak)
  • mati (kapal pemain dimusnahkan)

Tindakan pemain semasa permainan.

Setiap tindakan mesti dihantar melalui rangkaian, jadi penting untuk mencari keseimbangan antara jumlah tindakan dan saiz mesej rangkaian yang akan mereka hasilkan. Semakin besar mesej itu (yakni, lebih banyak data yang mengandungnya), semakin lama diperlukan untuk diangkut, karena mungkin memerlukan lebih dari satu paket jaringan.

Mesej ringkas menuntut masa CPU lebih sedikit untuk mengemas, menghantar dan membongkar. Mesej rangkaian kecil juga menghasilkan lebih banyak mesej dihantar pada masa yang sama, yang meningkatkan daya tampung.


Melaksanakan Tindakan Secara Bebas

Selepas tindakan yang dipetakan dipetakan, sudah tiba masanya untuk membuatnya dapat dihasilkan tanpa input pengguna. Walaupun itu prinsip kejuruteraan perisian yang baik, ia mungkin tidak jelas dari sudut pandang permainan multiplayer.

Menggunakan tindakan menembak permainan kami sebagai contoh, jika ia saling berkaitan dengan logik input, tidak mungkin untuk menggunakan semula kod menembak yang sama dalam situasi yang berbeza:

Melakukan tindakan secara bebas.

Apabila kod penggambaran dipadamkan dari logik input, misalnya, adalah mungkin untuk menggunakan kod yang sama untuk menembak peluru pemain dan peluru lawan (apabila mesej rangkaian itu tiba). Ia mengelakkan replikasi kod dan menghalang banyak sakit kepala.

Kelas Kapal dalam permainan kami, misalnya, tidak mempunyai kod berbilang pemain; ia benar-benar dipecahkan. Ia menerangkan kapal, sama ada tempatan atau tidak. Walau bagaimanapun, kelas ini mempunyai beberapa kaedah untuk memanipulasi kapal, seperti putar() dan setter untuk mengubah kedudukannya. Akibatnya, kod berbilang pemain boleh memutar kapal dengan cara yang sama dengan kod input pengguna - perbezaannya ialah satu berdasarkan input tempatan, manakala yang lain adalah berdasarkan mesej rangkaian.


Bertukar Data Berdasarkan Tindakan

Sekarang semua tindakan yang relevan dipetakan, sudah tiba masanya untuk bertukar-tukar mesej di kalangan rakan sebaya untuk membuat simulasi. Sebelum bertukar data, protokol komunikasi mesti dirumus. Mengenai komunikasi permainan multiplayer, protokol boleh ditakrifkan sebagai satu set peraturan yang menggambarkan bagaimana mesej tersusun, jadi semua orang boleh menghantar, membaca, dan memahami mesej tersebut.

Mesej-mesej yang ditukar dalam permainan akan dijelaskan sebagai objek, semuanya mengandungi harta wajib yang dinamakan op (kod operasi). Op digunakan untuk mengenal pasti jenis mesej dan menunjukkan sifat objek objek tersebut. Ini adalah struktur semua mesej:

truktur mesej rangkaian.
  • Mesej OP_DIE menyatakan bahawa kapal telah dimusnahkan. Ciri x dan y  mengandungi lokasi kapal apabila ia musnah.
  • Mesej OP_POSISI mengandungi lokasi semasa kapal peer. Ciri x dan y ymengandungi koordinat kapal pada skrin, manakala sudut ialah sudut putaran semasa kapal.
  • Mesej OP_SHOT menyatakan bahawa kapal melepaskan sesuatu (peluru atau bom). Properti x dan y mengandungi lokasi kapal apabila ia dipecat; sifat dx dan dy menunjukkan arah kapal, yang memastikan peluru akan direplikasi di semua rakan sebaya menggunakan sudut yang sama kapal menembak yang digunakan apabila ia bertujuan; dan b property menentukan jenis peluru (peluru atau bom).

Kelas Multiplayer

Untuk mengatur kod berbilang pemain, kami membuat kelas Multiplayer. Ia bertanggungjawab untuk menghantar dan menerima mesej, serta mengemas kini kapal-kapal tempatan mengikut mesej yang diterima untuk mencerminkan keadaan terkini simulasi permainan.

Struktur awalnya, yang mengandungi hanya kod mesej, adalah:


Mengirim Mesej Tindakan

Untuk setiap tindakan yang relevan dipetakan sebelum ini, mesej rangkaian mesti dihantar, oleh itu semua rakan akan dimaklumkan mengenai tindakan itu.

Tindakan OP_DIE perlu dihantar apabila pemain dilanda peluru atau ledakan bom. Terdapat kaedah dalam kod permainan yang memusnahkan kapal pemain apabila dipukul, jadi ia dikemas kini untuk menyebarkan maklumat itu:

Tindakan OP_POSISI harus dihantar setiap kali pemain mengubah kedudukannya sekarang. Kod berbilang pemain disuntik ke dalam kod permainan untuk menyebarkan maklumat itu juga:

Akhirnya, tindakan OP_SHOT mesti dihantar setiap kali pemain membakar sesuatu. Mesej yang dihantar mengandungi jenis peluru yang dipecat, supaya setiap rakan sebaya akan melihat peluru yang betul:


Menyelaras Berdasarkan Data Yang Diterima

Pada ketika ini, setiap pemain dapat mengawal dan melihat kapal mereka. Di bawah tudung, mesej rangkaian dihantar berdasarkan tindakan yang berkaitan. Satu-satunya bahagian yang hilang adalah penambahan lawan, supaya setiap pemain dapat melihat kapal lain dan berinteraksi dengan mereka.

Dalam permainan, kapal-kapal itu dianjurkan sebagai array. Pelbagai itu hanya mempunyai satu kapal (pemain) sehingga kini. Untuk membuat simulasi untuk semua pemain lain, kelas Multiplayer akan ditukar untuk menambah kapal baru ke array apabila setiap pemain baru menyertai arena:

Kod pertukaran mesej secara automatik menyediakan pengecam unik bagi setiap pemain (user.id dalam kod di atas). Pengenalan itu digunakan oleh kod berbilang pemain untuk membuat kapal baru apabila pemain menyertai arena; dengan cara ini, setiap kapal mempunyai pengecam unik. Menggunakan pengenal pengarang setiap mesej yang diterima, adalah mungkin untuk melihat kapal itu dalam pelbagai kapal.

Akhirnya, sudah tiba masanya untuk menambah handleGetObject() ke kelas Multiplayer. Kaedah ini digunakan setiap kali mesej baru tiba:

Apabila mesej baru tiba, kaedah handleGetObject() digunakan dengan dua parameter: ID pengarang (pengenal unik) dan data mesej. Menganalisa data mesej, kod operasi diekstrak dan, berdasarkan itu, semua sifat lain diekstrak juga.

Menggunakan data yang diekstrak, kod berbilang pemain mengeluarkan semula semua tindakan yang diterima melalui rangkaian. Mengambil mesej OP_SHOT sebagai contoh, ini adalah langkah yang dilakukan untuk mengemas kini keadaan permainan semasa:

  1. Lihat kapal tempatan yang dikenalpasti oleh userId.
  2. Kemas kini kedudukan Kapal dan sudut mengikut data yang diterima.
  3. Kemas kini arahan Kapal mengikut data yang diterima.
  4. Memohon kaedah permainan yang bertanggungjawab untuk melancarkan projektil, menembak peluru atau bom.

Seperti yang dinyatakan sebelum ini, kod menembak dikeluarkan dari pemain dan logik input, jadi peluru melancarkan berkelakuan sama seperti yang dipecat oleh pemain tempatan.


Mengatasi Masalah Latihan

Sekiranya permainan semata-mata memindahkan entiti berdasarkan kemas kini rangkaian, sebarang mesej yang hilang atau tertangguh akan menyebabkan entiti itu "teleport" dari satu titik ke yang lain. Itu boleh dikurangkan dengan ramalan tempatan.

Menggunakan interpolasi, misalnya, pergerakan entiti disinterpolasi dari satu titik ke tempat lain (kedua-duanya diterima oleh kemas kini rangkaian). Akibatnya, entiti itu lancar bergerak di antara titik tersebut. Sebaik-baiknya, kependaman itu tidak boleh melebihi masa entiti diperlukan untuk diinterpolasi dari satu titik ke titik lain.

Trik lain adalah ekstrapolasi, yang bergerak secara tempatan berdasarkan entiti semasa. Ia menganggap bahawa entiti itu tidak akan mengubah laluannya sekarang, jadi selamat untuk menjadikannya bergerak mengikut arah dan halaju semasa, contohnya. Sekiranya kependaman itu tidak terlalu tinggi, ekstrapolasi dengan tepat menghasilkan semula pergerakan yang dijangka entiti sehingga kemas kini rangkaian baru tiba, menghasilkan corak pergerakan yang lancar.

Walaupun teknik itu, kependaman rangkaian boleh menjadi sangat tinggi dan kadang-kadang tidak dapat dikendalikan. Pendekatan yang paling mudah untuk menghapuskannya adalah untuk melepaskan rakan sebaya yang bermasalah. Pendekatan yang selamat untuk itu adalah menggunakan masa tamat: jika rakan sebaya mengambil lebih daripada masa yang ditentukan untuk menjawab, ia diputuskan.


Kesimpulan

Membuat permainan multiplayer yang dimainkan melalui rangkaian adalah tugas yang mencabar dan menarik. Ia memerlukan cara yang berbeza untuk melihat perkara kerana semua tindakan yang berkaitan mesti dihantar dan direproduksi oleh semua rakan sebaya. Akibatnya, semua pemain melihat simulasi apa yang sedang berlaku, kecuali untuk kapal tempatan, yang tidak mempunyai latensi rangkaian.

Tutorial ini menerangkan pelaksanaan permainan berbilang pemain menggunakan pendekatan P2P yang tidak berwibawa. Semua konsep yang dibentangkan dapat diperluaskan untuk melaksanakan mekanika multiplayer yang berlainan. Biarkan pembuatan game multiplayer dimulai!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.