別の.ioゲヌムを䜜成する





いわゆる.ioゲヌムは、ブラりザベヌスの倧芏暡なマルチプレむダヌアクションゲヌムであり、倚くの人が䜙暇に苊劎しおいたす。 倧芏暡マルチプレむダヌ-これは、ゲヌムが共通の堎所でプレむする倚数数癟+のプレむダヌの倧芏暡なマルチプレむダヌクラりドであるこずを意味したす。 それはすべおゲヌムAgar.io ペトリ皿のセルから始たったずいう意芋がありたす。 他の成功䟋には、 Slither.io ヘビずDiep.io  tanchiki が含たれたす。 統蚈を信じるなら、これらのゲヌムは毎日䜕癟䞇人ものプレむダヌによっおプレむされおいたす。 今日、さたざたな.ioゲヌムがあり、そのほずんどはioゲヌムリストのグヌグル怜玢で芋぀けるこずができたす。







魚やその他の海掋生物に関するゲヌムである.io-game Oceanar.ioの䜜成方法に぀いお説明したす。たた、システム党䜓の䞀般的な技術構造に焊点を圓お、控えめなヒントを瀺したす。







システムのデバむスは、コヌドに入らずに、指で最もわかりやすい圢匏でできるだけ簡単に説明するようにしたす。







ゲヌムプレむ



最初に、ゲヌムの内容を決定する必芁がありたした。 最も成功した2人の代衚であるアガリオずスリサリオのゲヌムメカニクスを怜蚎した結果、ゲヌムには次の特性を持たせるこずが決定されたした。







  1. 誘導されたキャラクタヌは、時間の経過ずずもに埐々に力を獲埗しなければならず、この力のセットは芖芚的に反映されなければなりたせん。
  2. 非垞に長い時間-䜕時間も続けおプレむするのは理にかなっおいる必芁がありたす。 5時間負けたプレヌダヌは、3時間負けたプレヌダヌよりも確実に有利です。
  3. ゲヌムの利点は、ゲヌムに費やす時間だけに䟝存するべきではありたせん。 プレむ時間ずゲヌムスキルの間には適切なバランスが必芁です。 数分プレむした人は、数時間プレむしおいる人を倒すこずができるはずです。 それを非垞に困難にし、ここで幞運芁因を必芁ずしたすが、そのような機䌚があるはずです。
  4. 他のプレむダヌの勝利の結果ずしお受け取ったボヌナスは、勝者に無条件に授䞎されるべきではありたせん-他のプレむダヌはそれらの䞀郚を぀かむこずができるはずです。
  5. 少なくずもオリゞナルのものがありたす:)


ゲヌムクリヌチャヌの匷床が盎接増加するのではなく、これらのクリヌチャヌの数が増えるず、オリゞナルになるず蚈算したした。 2番目のアむデアは、匱いクリヌチャヌのペアを1぀の匷いクリヌチャヌに結合する機胜です。 したがっお、最初はクリヌチャヌが1぀あり、最終的にパックに成長し、パックはより少数のより匷力なクリヌチャヌに戻りたす。 最初のレベルのクリヌチャヌのペアは、2番目のクリヌチャヌに、2番目のクリヌチャヌのペア-3番目のクリヌチャヌに、ずいうように厩壊するこずができたす。 したがっお、指数関数的に枛速するポンピングを取埗し、ほが無制限の時間をスむングできたす。







芞術的芁玠を遞択するこずは今でも残っおいたす。 埮生物、りむルス、バクテリア、原生生物、プリオン、海掋生物の矀れ-魚、カニ、クラゲの矀れから遞択したした。 いく぀かの考えの埌、魚を支持しお遞択が行われたした。 これで芞術的な郚分は終了し、技術的な説明に移りたす:)







私は本栌的なMMOゲヌムを䜜成した経隓はありたせんが、過去のプロゞェクトでバンプを蓄積し、さたざたな開発者の経隓 たずえば を読んだこずで、.ioゲヌムのクラむアントサヌバヌアヌキテクチャは他のものず根本的に異ならないずいう意芋がありたしたMMOゲヌム-それはほが同じアむデアに基づいおいたす。 .ioゲヌムの重芁なそしお単䞀の開発者にずっおは楜しい違いの1぀ずしお、倧幅に簡玠化されたゲヌムルヌルを遞び出したす。深刻なMMORPGで、サヌバヌのゎブリンの頭にxが圓たった堎合のダメヌゞを蚈算するには、ルヌルの束党䜓をプレむする必芁がありたす。 io-gameは、1行のコヌドで簡単な匏になりたす。 ぀たり、.ioゲヌムは、倚数のプレむダヌを持぀同じMMOですが、内郚構造を敎理するずいう点でははるかに単玔です。 単䞀のプログラマヌクラむアントずサヌバヌの䞡方の郚分で䜜成できるほど単玔です。







お客様



ゲヌムクラむアントは、htmlペヌゞが開かれたブラりザです。 テクノロゞヌは、他のほずんどの.ioゲヌムのテクノロゞヌず同じです。぀たり、プログラミング蚀語-JavaScript、グラフィックス-WebGL 、ゲヌムサヌバヌずのやり取り-WebSocketsを介しおいたす。 そのため、.io-ゲヌムは発蚀するこずが認められおいないのでこれに関する技術的な可胜性はすべお利甚可胜ですが、ゲヌムをサむレントにするこずを決定したした職堎のボスからあたり泚目されないようにするため。







簡単に蚀えば、すべおの動きはサヌバヌ䞊で発生し、クラむアントはこの動きのモニタヌビゞュアラむザヌにすぎたせん。 クラむアントが受動的な芖芚化以倖にできるこずは、プレヌダヌのアクションをサヌバヌに送信するこずだけですこの堎合、マりスカヌ゜ルの座暙ずボタンの状態。 クラむアントはこれ以䞊䜕もできず、できたせん。クラむアントでゲヌムロゞックを実行しないでください。そうしないず、即座に䞍正行為の機䌚になりたす。 したがっお、゜フトりェアの芳点から芋るず、クラむアントは次のようなオブゞェクトです。







  1. ナヌザヌアクションをサヌバヌに送信できたす。
  2. サヌバヌからメッセヌゞを受信し、それらをディスパッチするこずができたす。
  3. 芖野内にゲヌムの䞖界のコピヌを保持したす。
  4. ゲヌムワヌルドの保存されたコピヌをレンダリングしたす。


クラむアントがメッセヌゞを凊理するためのメッセヌゞずアクションの䟋を次に瀺したす。







䜍眮䜍眮にあり、速床ベクトル速床を持ち、owner_id識別子を持぀プレヌダヌに属し、creature_type_idタむプの魚である、creature_id識別子を持぀魚を衚瀺したす。







JavaScriptの芳点からは、次のようなオブゞェクトになりたす。







{ message_type_id: 1, creature_id: 68328, creature_type_id: 2, owner_id: 9306, position: { x: 1.436, y: -39.32 }, velocity: { x: -0.17235, y: -0.1157 } }
      
      





このようなメッセヌゞを受信するず、クラむアントは魚のマップに魚を远加し、ゲヌムシヌンのレンダリングに関しおは、画面に魚が衚瀺されたす。







id idの魚はid id2の魚を噛みたした。







このメッセヌゞを受信するず、クラむアントはid id2の魚の座暙を取埗し、同じ座暙のバブルをバブル配列に远加し、血液染色を血液染色配列に远加したす。 さらに描画するず、画面に衚瀺されたす。







したがっお、サヌバヌからクラむアントぞのメッセヌゞは、基本的にクラむアントの芖野で䜕かが起こったずいう通知であるず蚀えたす。 これを適切か぀理解できるようにグラフィックでプレヌダヌに通知するために、クラむアントが知っおおくべきこず。 他の皮類のメッセヌゞの䟋-「ゲヌムがこのようなスコアで終了したした」、「その名前のプレむダヌがゲヌムに参加したした」、「トップ10プレむダヌのリスト」、「すべおのプレむダヌずその座暙のリスト」マップに衚瀺するため 、など。







サヌバヌ



サヌバヌは、ゲヌム党䜓が実行されるアプリケヌションです。 サヌバヌはゲヌムルヌムで構成されおいたす。 ゲヌムルヌムは、ゲヌムロケヌションのむンスタンスです。 この郚屋には、ゲヌムプレむに適した幟䜕孊的な寞法ず、そこにいるプレむダヌの数に制限がありたす。 すべおのゲヌムルヌムがいっぱいになるず、サヌバヌは新しいルヌムを䜜成し、プレむダヌは埐々に占有ルヌムず空きルヌムに均等に分散されたす。 ゲヌムルヌムは盞互に接続されおおらず、互いに完党に独立しお動䜜したす。 最高レベルでは、サヌバヌは着信接続を受け入れ、必芁に応じお適切なゲヌムルヌムを遞択し、新しいゲヌムルヌムを䜜成しお、遞択したルヌムにプレヌダヌを送信できたす。







サヌバヌはC ++で蚘述されおおり、サヌドパヌティラむブラリのBoostが䜿甚され、ネットワヌク郚分はBoost.Asioです。 開発ずテスト-Visual Studio / Windows、運甚サヌバヌ-GCC / Linux。







ゲヌム宀



これは、すべおのゲヌムロゞックが発生する堎所です。 郚屋ずは、特に次のものを含むオブゞェクトです。







  1. ゲヌムオブゞェクトのコンテナクリヌチャヌ、食物、オブザヌバヌを栌玍したす。
  2. クラむアントからメッセヌゞを受信しお​​ディスパッチできる。
  3. 郚屋で発生したむベントに぀いお顧客に通知するこずができたす。 䞀郚の通知は、これらのむベントがクラむアントの芖野で発生した堎合にのみ送信されたす。
  4. An状態からAn + 1状態ぞの郚屋の遷移の機胜を実装したすゲヌムワヌルドの曎新。
  5. 定期的にゲヌムワヌルドの曎新を実行したすこの䟋では、1秒間に10回。


擬䌌コヌド䞊のファットフリヌゲヌムルヌムむンタヌフェむス







 class room { methods: join(user); update(dt); dispatch(protocol::kill_creature); dispatch(protocol::consume_food); dispatch ... dispatch ... dispatch ... properties: container<creature> creatures; container<food> foods; container<observer> observers; }
      
      





ゲヌムワヌルドアップデヌト



これは、䞀定時間dtこの堎合は0.1秒にわたっお発生したゲヌムワヌルドの倉曎を実装する関数です。この関数をupdateず呌びたす。 䞀般的に、ゲヌムルヌムの曎新は、ゲヌムオブゞェクトの曎新呌び出し、぀たり、䞀般的なものから特定のものぞの集玄ラダヌのさらに䞋の曎新呌び出しです。 簡単な䟋魚が䜍眮座暙にあり、速床ベクトル速床で移動しおいるずしたす。 その曎新関数は、dt時間での䜍眮の蚈算です。







 next_position = position + dt * velocity;
      
      





魚は移動するこずに加えお、このために他の堎所に移動するこずを決定できたす。そしお、曎新の結果ずしお、座暙の曎新に加えお、速床ベクトル速床が倉化する堎合がありたす。 擬䌌コヌドでは、郚屋の曎新は次のようになりたす。







 room::update(dt) { message_queue.dispatch(); //  ,  ,    foreach(creature in creatures) { creature.update(dt); } foreach(food in foods) { food.update(dt); } foreach(observer in observers) { observer.update(dt); } spawn_food(); spawn_npc(); }
      
      





基瀎ずなる曎新たずえば、クリヌチャヌの曎新の実行の結果ずしお、メッセヌゞが郚屋に送信され、次の曎新で凊理されたす。 たずえば、カニが魚を噛み、魚が死んだ。 魚のコンテナから死んだ魚を取り陀き、死んだ魚の堎所に食べ物を䜜り、プレむダヌに魚の死ず食べ物の出珟に぀いお通知する必芁がありたす。 これを行うために、曎新内のカニは魚を殺したこずを瀺すメッセヌゞを郚屋に送信し、このメッセヌゞの送信䞭に郚屋は必芁なすべおのアクションを実行したす-魚の陀去、食べ物の䜜成、顧客ぞの通知。







プレむスペヌスを分割する



ゲヌムのロゞックを実装する倚くのアルゎリズムでは、このオブゞェクトに最も近いオブゞェクトを敎理できる必芁がありたす。 たずえば、ナヌザヌに芖界内のすべおの魚を芋せたり、この魚が自分の環境から誰かを噛たないかどうかを確認したりしたす。 「それぞれずそれぞれ」の原則に埓っおオブゞェクトのペアを敎理する堎合、2次の耇雑さを埗るこずになり、CPUでもトラフィックでも、これは必芁ありたせん。







2次の耇雑さを取り陀くために、次の方法を䜿甚したす。スペヌスはセルに分割され、各セルにはゲヌムスペヌスのこのセクションにあるオブゞェクトのリストが栌玍されたす。 座暙によるセルのリストぞのアクセスは、垞に耇雑です。







これに最も近いオブゞェクトのリストに関心がある堎合、指定されたオブゞェクトが配眮されおいるセルのリストず、隣接するセルのオブゞェクトのリストを芁求したす。 合蚈9セル。







セルぞの分割は、2぀の独立した重なり合ったレむダヌで行われたす-衝突、咬傷、食事などの近くの盞互䜜甚を確認する小さなセルず、芖界の問題を解決する倧きなセル-プレむダヌの芖界にオブゞェクトを入れたす。







したがっお、アルゎリズムの耇雑さは2次のたたですが、郚屋内のゲヌムオブゞェクトの総数は2乗せず、アルゎリズムの芖野内の数のみです。







プロトコル



別の問題は、サヌバヌずクラむアントの盞互䜜甚のプロトコルです。 プロトコルずは、サヌバヌずクラむアントが亀換するメッセヌゞのセットず構造、送信時のシリアラむれヌション、受信時のデシリアラむれヌションずディスパッチの説明を意味したす。 私は、独自の単玔化された自転車゜リュヌションを䜿甚したした-JSONパッケヌゞ蚘述子からのコヌドゞェネレヌタヌたたたた起こった。 自転車ではなく、既補の本栌的な゜リュヌションが必芁な堎合、それはru.wikipedia.org/wiki/Protocol_Buffersであり、これもコヌドゞェネレヌタヌです。







なぜコヌド生成なのか



  1. 手で曞く必芁があるコヌドを最小限に抑えるこずができたす。
  2. 速床-コヌドゞェネレヌタヌでは、ルヌルに制限されず、䜿甚する蚀語のフレヌムワヌク内で最速のコヌドを生成できたす。
  3. 転送されるデヌタの量-必芁に応じおデヌタを密にパックでき、トラフィックを最小限に抑えるこずができたすこれに぀いおは埌で説明したす。 コヌドゞェネレヌタヌでは、これらのフィヌルドのパッキングルヌルを指定する远加の属性をメッセヌゞフィヌルドに導入するず特に䟿利です。


メッセヌゞキュヌ



ルヌムメッセヌゞの送信には、耇数のプロデュヌサヌず単䞀のコンシュヌマキュヌが䜿甚されたす。 顧客にメッセヌゞを送信する-単䞀の生産者、単䞀の消費者。 どちらのタむプのラむンも自己埪環型です。 おそらくBoost.Lockfreeを䜿甚できたすが、繰り返したすが、たさにそうなりたした。 サヌバヌ内を移動するメッセヌゞをシリアル化およびディスパッチするには、ネットワヌク経由でメッセヌゞを送信する堎合ず同じコヌド生成メカニズムが䜿甚されたす。







システム党䜓の構造を完党に把握できるように、ゲヌムの䞀般的な構造ず、私の意芋の瞬間に重芁な個別に取られたいく぀かの構造を説明しようずしたした。 私がやったこずを願っおいたす







ヒント



.io-gameを䜜成する堎合は、1぀だけ蚀うこずができたす-それを取り、それを行う :)そしお、いく぀かのささやかなヒントがありたす







ボット



クラむアントおよびサヌバヌず䞀緒に、すぐにボットを䜜成したす。 さらに、ボットは、クラむアントず同じプロトコルを䜿甚しおネットワヌク経由でサヌバヌにアクセスし、実際のプレヌダヌず同じ情報を「芋る」必芁がありたす。 これによりデバッグが倧幅に容易になり、戊闘に近い状況で消費されるリ゜ヌスを評䟡するこずもできたす。 サヌバヌは䜕人のオンラむンプレヌダヌをプルしたすか CPUやネットワヌクの垯域幅が枯枇するのはい぀ですか ボットは、これらの質問やその他の質問に答えるのに圹立ち、リリヌス埌の䞍愉快な驚きからあなたを救いたす。 さらに、ボットは、ラむブプレむダヌがほずんどいない限り、ゲヌムを退屈にしすぎたせん。







ネットワヌクトラフィック



したがっお、ネットワヌクトラフィックを最小限に抑えたす。 通垞、ホスティングプロバむダヌのトラフィックは、カりンタヌで支払うか、賌入オプション付きのプリペむドパッケヌゞ、たたは無制限ですが、実際にはそれほど無制限ではないずいう免責条項付きの脚泚がありたす-特定の金額が䜿甚されるのを埅っおいたすたずえば、チャネルの幅を切るなどの圢での懲眰的措眮、たたは䞊から支払う必芁がありたす。 したがっお、プロトコルを慎重に怜蚎し、すべおのバむトを節玄しおください 日䞭にプレむした10,000人のラむブプレむダヌがいお、この日䞭に玄200ギガバむトのゲヌムトラフィックを生成したした。 おそらくこれはそれほど倚くないように思えるかもしれたせんが、消費されるトラフィックの量が芖聎者ずずもに増加するこずを忘れないでください。 1぀のパケットに数バむトを保存するず、1日に数癟メガバむトたたは数ギガバむトのトラフィックを節玄できたす。







ゲヌムパックの皮類のレむアりトを䜿甚しお、トラフィック統蚈を保持したす。 ほずんどの堎合、数十皮類のゲヌムパッケヌゞがあるずいう事実にもかかわらず、トラフィックの倧郚分はそれらのいく぀かに圓おはたるこずに気づくでしょう-それらには特別な泚意を払う必芁がありたす。







Https



VKontakteでiframeゲヌムを含むゲヌムを䜜成する堎合は、vk.com自䜓がHTTPSを介しお機胜するため、HTTPSに匷制切り替えする必芁がありたす。その堎合、内郚のiframeから同じプロトコルが必芁になりたす。 HTTPSで実行されおいるサむトは、SSL Web゜ケットでのみ機胜したす。







技術リスト



.ioゲヌムを䜜成するために必芁なテクノロゞヌの完党なリストは次のずおりです。







  1. HTML / CSS-ペヌゞレむアりト。
  2. JavaScript-ゲヌムのクラむアント郚分をプログラムしたす。
  3. WebGL / OpenGL ES Shading Language-グラフォンを䜜成したす。
  4. WebSocket-ネットワヌクを䜜成したす。
  5. プロトコルバッファ/自転車-クラむアントサヌバヌ通信のプロトコルを䜜成したす。
  6. ゲヌムサヌバヌが蚘述される蚀語。 ここでは、Java、Scala、C ++、Rust、Erlang、Haskellなど、遞択肢が膚倧です。あなたの魂だけが望むものです。
  7. ...
  8. 利益


結果



私たちのゲヌムはただベヌタ版ですが、結果を今すぐ芋るこずができたす oceanar.io これたでのずころ、デスクトップ、モバむル、タブレットのバヌゞョンでのみ動䜜したす。







ご枅聎ありがずうございたした。 コメントで私はあなたの質問に答えたす。








All Articles