C ++で曞かれたiOSおよびAndroidのモバむルゲヌム「Make words from words」にマルチプレむダヌを固定したす

以前、私はAndroidずiOSでモバむルワヌドゲヌムを開発した経隓に぀いお曞きたした。これは非垞に人気があり、2人のプレヌダヌが互いに競い合うずきにマルチプレヌダヌモヌドを固定し、順番に蚀葉を曞き、Sergey Suponevのテレビ番組の最終ラりンドずしお時間。」







マルチプレむダヌの孊習ず実装に1か月半かかりたした。この蚘事では、゜ヌスコヌドの䟋を䜿わずに抂念を説明し、実行した䜜業量から絞り蟌みたす。



ちょっずした歎史



アプリケヌションは、Marmalade SDKを䜿甚しおC ++で䜜成されたした。 それ以来、ベンダヌはこのプラットフォヌムのサポヌトを停止し、その皮類を日本に販売し、この開発環境の未来は非垞に霧になりたした。







珟圚のプロゞェクトをさらにサポヌトするために移怍するものに぀いお疑問が生じたした。



なぜcocos2d-xではありたせんか







Cocos2d-xは、C ++で最も䞀般的なクロスプラットフォヌムモバむルゲヌム開発゚ンゞンの1぀です。 どうやら、その無料でオヌプン゜ヌスのコヌドのため。 ゚ンゞンの文曞化は䞍十分です。 説明ぱンゞンのわずかな郚分をカバヌしおおり、ほずんどの資料は叀くなっおいたす。



ある期間の結果に基づいお、アプリケヌションのプロトタむプを䜜成するこずができたした。 しかし、印象は非垞に悪かったそれはcocos2d-xが膝の䞊に組み立おられおいるように感じる。 抜象化のレベルScene、Sprite、Application Delegateは私には非垞に䞍快に思われたした。 おそらく私の手は間違った堎所から成長しおいたす。



私の遞択はSDLに萜ちたした







SDLは 、Marmalade SDLず同様に、゚ンゞンではなく、プラットフォヌムです。 それは䜎レベルのAPIを提䟛し、そこから私にずっお䟿利な抜象化レベルを構築したす。 これらはすべおCで蚘述されおおり、゜ヌスコヌドは公開されおいたす。



簡単に蚀えば、SDLは、グラフィックス、サりンド、およびオペレヌティングシステムからのメッセヌゞを凊理するための無料のクロスプラットフォヌムラむブラリです。 win32ビルドを䜜成し、Windowsでゲヌムのロゞックをデバッグするず、モバむル゚ミュレヌタヌず物理デバむスのみがOS固有の機胜をデバッグできるため、非垞に䟿利です。



幞いなこずにたたは残念なこずに、SDLはiOSやAndroid向けのマルチプレむダヌの開発などの狭いタスク向けのツヌルを提䟛しおいないため、察応するサヌビスず自分で統合する必芁がありたした。



マルチスレッドアプリケヌションアヌキテクチャ



アプリケヌションロゞックずグラフィックのすべおの動䜜は、メむンスレッドで実装されたす。メむンスレッドは、メッセヌゞ凊理サむクルであり、メむン関数で開始されたす。 このストリヌムSDLスレッドを呌び出したす。 次に、他のスレッドは、凊理するためのむベントSDL_PushEventをキュヌにスロヌし、SDL_WaitEventおよびSDL_PollEventを䜿甚しおむベントを読み取りたす。 これらは、システムによっおスロヌされ、そのサポヌトがSDLにすでに実装されおいるシステムむベント、たたはSDL機胜を超えお既に実装されおいるコヌルバックずリスナヌの呌び出しのいずれかです。







すべおのゲヌムロゞックはC ++で蚘述されおいたす。 プロゞェクトディレクトリには、* .cppファむルのセットが含たれおおり、3぀のグルヌプに分けるこずができたす。





したがっお、各プラットフォヌムの蚭蚈には3぀の個別のディレクトリがありたす。





マルチプレむダヌサヌビスずの統合



ここで、次のような機胜を担圓する別のレむダヌを接着する必芁がありたす。





iOSずAndroidの䞡方のプラットフォヌムは、リアルタむムマルチプレむダヌRTMPをサポヌトしおいたす。 Androidの堎合、Google Play ServicesGPS、iOSの堎合はGame Centerず統合したす。 以前は、GoogleはiOSずの統合をサポヌトしおいたしたが、今幎はそれを攟棄するこずにしたした。



この蚘事では、マルチプレむダヌを構成するためにGoogle Playコン゜ヌルずAppStoreConnectで実行する必芁があるアクションに぀いおは説明したせん。クラスず統合メ゜ッドの仕様に぀いおは説明したせん。これらはすべおベンダヌのサむトで説明したす。



次に、各プラットフォヌムのプロゞェクトで行う必芁がある倉曎を簡単に説明したす。



Android



どうやっお 私はただこれを蚀っおいたせんか Android NDKは 、C ++コヌドのコンパむルに䜿甚されたす。 ただし、Android開発者であれば、すでに知っおいたす。



Google Play ServicesをAndroidプロゞェクトに統合するための䞀般的な手順は、Android開発者向けのサむトで説明されおいたす。 私のプロゞェクトでは、次の䟝存関係を䜿甚したす。



implementation 'com.google.android.gms:play-services-games:16.0.0' implementation 'com.google.android.gms:play-services-nearby:16.0.0' implementation 'com.google.android.gms:play-services-auth:16.0.1'
      
      





最初は、゜ヌスなしでコンパむルされた静的ラむブラリの圢匏で提䟛されるC ++ APIを䜿甚するこずでした。 ラむブラリのリストにx86_64プラットフォヌム甚のアセンブリがないずいう事実のため、GoogleのスタッフはこのSDKの関連性を実際に監芖しないず刀断し、 JNIラッパヌでラップしおこの局をJavaで蚘述するためにバむクを発明するこずにしたした 。 そしお、なぜJavaの内郚でJavaをプルする゜ヌスコヌドのないlibsの圢で䜙分な䟝存関係が必芁なのですか Javaクラスの関連性に加えお、これらのラむブラリの関連性も監芖する必芁がありたす。



ガむドずしお、 Google Samplesの良い䟋を䜿甚したした。 googleに感謝したす。 アップル、グヌグルから䟋を挙げおください



iOS



Game Centerず統合するには、GameKitフレヌムワヌクを接続する必芁がありたす。 Game Centerずの統合レむダヌ党䜓を1぀の* .mファむルで蚘述し、別の* .hファむルを介しおむンタヌフェむスを提䟛したす。 C ++はObjective-C蚀語のサブセットであるため、1぀のプロゞェクトでの* .cppおよび* .mファむルのアセンブリに問題はありたせん。



公匏ドキュメントに加えお、圌はこのプロゞェクトGameCenterManagerのガむドを受けたした。 確かに、この䟋の䞀郚はすでに叀くなっおいたす。Xcode10はこれを瀺し、叀い機胜を新しい機胜に眮き換えたす。



マルチプレむダヌレむダヌでの䜜業の原則



単䞀の゚ントリポむント



䞡方のプラットフォヌムでマルチプレむダヌを䜿甚する機胜を研究した埌、アプリケヌション甚に単䞀のC ++抜象化を䜜成し、コンパむル時に、察応する実装が特定のプラットフォヌムに応じお「適合する」ようにしたした。 ぀たり、私のアプリケヌションは、Google Play Services、Game Center、およびそれらの機胜に぀いおは知りたせん。 提䟛されるC ++ APIのみを認識したす。たずえば、次のようなメ゜ッドがありたす。



 SignIn() //     SignOut() //     LeaveRoom() //    SendMessage(...) //    ShowLeaderboards() //    SubmitScore(...) //    ...
      
      





盞手を探す



プレヌダヌは、連絡先のリストから友人を招埅するか、ランダムな盞手ずゲヌムを開始できたす。 招埅を受けたプレヌダヌは、招埅を受け入れるか拒吊するこずができたす。 これらのすべおのシナリオでは、䜿甚するサヌビスの暙準むンタヌフェむスを䜿甚したす。 Googleの銃口はiOS iOSよりもずっず芋栄えが良いこずに泚意しおください。 い぀か私の手が届き、ドミノや若い女性ずのむンタヌフェヌスを曞くかもしれたせん。



ゲヌムルヌムに接続する



2人のプレむダヌが仮想ゲヌムルヌムに接続するず、察応するコヌルバックを受け取りたす。 次に、ホストずなるナヌザヌを遞択する必芁がありたす。



ホスト遞択



プレむダヌの䞭からホストを遞択し、ゲヌムの初期状態を決定する必芁がありたす。

䞀般的な堎合、プレヌダヌ間でメッセヌゞをルヌティングする可胜な方法を怜蚎しおください。 第の実斜圢態では、ホストにはルヌタの圹割も割り圓おられおいるこずに留意されたい。







ゲヌムには垞に2人のプレむダヌしかいないため、ピアツヌピア接続の特殊なケヌスがあるこずがわかりたした。 したがっお、初期状態の定矩のみがホストの圹割、぀たり、単語を構成する単語の遞択に圓おはたりたす。



そのため、プレヌダヌがゲヌムルヌムに接続した埌、各プレヌダヌは開始したゲヌムの参加者の識別子のリストを知っおいたす。 それをParticipantIDのリストず呌びたす。 ParticipantIDは、ゲヌム参加者の特定の䞀意の文字列識別子であり、サヌビスによっお割り圓おられたす。 あなたはそれらのどれがホストになるかを遞択し、ホスト自身に持っおきお、盞手がホストずしお遞択されおいるこずを盞手に䌝える必芁がありたす。 どうやっおやるの



Androidホストの遞択


Google Dockでホストを遞択する際のアドバむスは芋぀かりたせんでした。 圌らは沈黙しおいる、パルチザン。 しかし、 stackoverflow.comの善良な人々は、次の原則を詳现に説明するビデオぞのリンクを投げたした。





iOSでのホスト遞択


iOSには、 chooseBestHostPlayerWithCompletionHandlerメ゜ッドがありたす。これは、Androidに぀いお説明したものず比范しお、ホスト遞択シナリオを倧幅に簡玠化したす。 ただし、このメ゜ッドの呌び出し䞭の顕著な遅延によっお刀断するず、ネットワヌクの応答パラメヌタヌを掚定し、pingを枬定し、これらの統蚈に基づいお誰がホストになるかを決定したす。 これは、ホストがルヌタヌずしお機胜する䞊蚘のクラむアント/サヌバヌアヌキテクチャにより適しおいたす。 プラむベヌトピアツヌピア接続の私のバヌゞョンでは、これは意味がありたせん。時間を節玄するために、Androidで行ったのず同様の原則を䜿甚したす。



プレむダヌ間のメッセヌゞング



メッセヌゞずは䜕ですか メッセヌゞはバむトの配列です。





送信メッセヌゞには2぀のタむプがありたす。





Unreliableは䞀般にReliableよりも速く配信されたす。 詳现に぀いおは、ベンダヌのWebサむトをご芧ください。





この配列をどのように䜿甚したすか 非垞にシンプル





そのため、ゲヌム䞭にプレむダヌが盞互に亀換するメッセヌゞのタむプを列挙型で定矩したす。





アプリケヌションが盞手から着信メッセヌゞを受信するず、察応するコヌルバックが呌び出され、凊理のためにメむンSDLスレッドにメッセヌゞが枡されたす。



接続監芖



ゲヌムサヌビスGoogleのサヌビス、Appleのサヌビスには、䜕らかの圢で、盞手からの切断を通知するように蚭蚈されたリスナヌ機胜がありたす。 しかし、プレヌダヌの1人がむンタヌネットから切断されおいる堎合、2番目のプレヌダヌは、最初のプレヌダヌが切断され、誰もプレむしおいないこずをすぐには知りたせん。 このような堎合、コヌルバックは呌び出されないか、かなり長い時間埌に呌び出されたす。 この堎合、2番目のプレむダヌは山でガンが口whiを吹くのを埅たないように、接続の監芖を独自に行い、原則に基づいお䜜業する必芁がありたした。





結果



仕事の結果、友人や家族ず䞀緒にプレむするゲヌムを手に入れたした。 iOSずAndroidの䞡方でプレむしおいたす。



確かに、iOSには埮劙な違いがありたす-䜕らかの理由で、リヌダヌボヌドでメガネが固定されおいたせん。これに぀いおは、珟圚Appleサポヌトに察応しおいたす。



この蚘事が私のチヌムのメンバヌずモバむルアプリケヌションの開発に興味のある人の䞡方に圹立぀こずを願っおいたす。 ご枅聎ありがずうございたした。



All Articles