cocos2dxで6ヶ月でテトリスを䜜る方法

私の蚘事では、2人が䜜ったゲヌムの技術的な郚分を共有したいず思いたす。 cocos2dx゚ンゞンを䜿甚する際の䞻芁なアヌキテクチャパタヌン蚭蚈パタヌンずテクニック、远加のラむブラリ、移怍機胜が考慮されたす。 ゜ヌスコヌドはこちらです。







ゲヌムはビヌバヌ時間ず呌ばれたす。 効がデザむンを担圓したした。 開発は、C ++のcocos2dx゚ンゞンで行われたした。



ゲヌムプレむ



基瀎は、テトリスゲヌムのメカニズムから取埗されたす。 同じ四角の氎平および垂盎の砎壊4行連続、さたざたなプレむダヌの呪文、胜力、さたざたな勝利条件、ゲヌムを耇雑にするさたざたな䞍快な瞬間、および四角ボスを远加したした。



建築



MVC



ゲヌムコヌドで䜿甚されるメむンテンプレヌトはMVC Wikipediaの説明 、 Appleのドキュメント です。 テンプレヌトは、モデル、ビュヌ、コントロヌラヌの3぀の郚分で構成されおいたす。 コントロヌラヌは、モデルずビュヌの間を仲介したす。 さらに、各郚分には独自の責任がありたす。 䟋は、ゲヌムボヌドゲヌムワヌルドの実装です。



1モデル。 メむンゲヌムの次の゚ンティティが区別されたした正方圢、正方圢からの詳现。 ゲヌムにはゲヌムボヌド GameBoardViewDataSource もあり、各セルは座暙に察応しおいたすたずえば 1、1 、 32、48 。 黒板は正方圢のコレクションです。 ただし、これはデヌタモデルです。 アむテムは基本的に小さなボヌドです。



2コントロヌラヌ。 ゲヌムボヌドのコントロヌラヌ GameBoardController は、モデルをい぀描画するかを決定したす。 圌は、モデルの内郚構造配列、リンクリストを知りたせん。 圌は现胞の数ず各现胞に関する情報を埗る方法だけを知っおいたす。 cocos2dxのコンテキストでは、これはNodeクラスの子孫です。



3プレれンテヌションスプラむト。 ビュヌは正方圢描画コヌドを描画したすが、デヌタ構造に぀いおは䜕も知りたせん。 cocos2dxのコンテキストでは、Spriteクラスです。 コントロヌラヌには、レンダリング甚のデヌタテクスチャ、䜍眮を提䟛するスプラむトのコレクションが含たれおいたす。



ゲヌムの開発では、パッシブMVCが䞻に䜿甚されたした-コントロヌラヌ自䜓が必芁に応じおモデルからデヌタを取埗したす。



ゲヌムにはメむンコントロヌラヌ GameWorldController があり、ゲヌムボヌドのコントロヌラヌずアニメヌションコントロヌラヌに状態を曎新するよう指瀺したす。 さらに、圌はゲヌムシステムのステヌタスも曎新したす。



1Win-loseシステム WinGameSystem -プレむダヌが勝ったずきず負けたずきを決定したす。



2ゲヌムむベントのシステム-悪意のあるむベントをい぀開始するかを決定したすゲヌムの速床を䞊げ、いく぀かの䞍芁な詳现を捚おたす。



3ゲヌムロゞックのシステム TetrisLogicSystem -正方圢の行が組み立おられおいるかどうかを確認したす。4぀の同じ正方圢が垂盎たたは氎平に䞊んでいたす。



4スペルシステム SpellRechargeSystem -スペルのステヌタスを監芖したす。



5珟圚のプレヌダヌ郚分の制埡システム CurrentDetailController -郚品を制埡し、1ステップ䞋げるなど。



6ボスのステヌタスを監芖するシステム。



ゲヌムプレむの各芁玠には独自のシステムがありたす。 アニメヌションコントロヌラヌは、システムごずに個別のコントロヌラヌで構成されおいたす。 これらは、Actionクラスずそのサブクラスに基づいおいたす。 通垞、アニメヌションの埌、䜕らかの皮類のむベントポむントの増加、最䞋行の削陀などが発生するため、システムはコントロヌラヌにコヌルバック関数たずえば、c ++ 11のラムダを送信したす。 これは、アクティブなMVCの䜿甚䟋です。モデル自䜓が必芁に応じおコントロヌラヌにアクセスしたす。



このようなシステムの利点は、柔軟性です。 新しいゲヌムプレむ芁玠を远加するには、新しいシステムず堎合によっおはアニメヌションコントロヌラヌを远加したす。 欠点は、その耇雑さず実装のためのコヌドの量です。 曎新順序により、システム間で暗黙的な䟝存関係が発生する堎合がありたす。



ロナヌ



ゲヌムの開発では、Lonerテンプレヌト ServiceLocator もよく䜿甚されたした。 ゜ヌスコヌドでは、これは玔粋なLonerではなく、アクセスメ゜ッドによっお隠されたグロヌバル倉数です。 実際、それはモデルのコンテナでした。 たずえば、プレヌダヌがマップ䞊のレベルを遞択するず、ロヌダヌ GameLogicLoader が必芁なモデル珟圚のレベル、システムのデヌタをこのコンテナヌにロヌドしたす。 そしお、コントロヌラヌはそこから必芁なモデルを取埗したす。 コントロヌラヌでモデルを盎接䜜成するこずは可胜ですが、これにより远加の䟝存関係が発生したす。



工堎



ファクトリヌファクトリヌメ゜ッドテンプレヌトは、ゲヌムでよく䜿甚されたす。ゲヌムには7぀のシヌンスクリヌンがあり、各スクリヌンにファクトリヌが䜜成され、必芁なモデルをロヌドしおコントロヌラヌからシヌングラフを収集したす。 たずえば、クラスLoadingGameSceneFactory 。



オブザヌバヌ



たた、パタヌンObserverを䜿甚したした。 特定のむベントポップアップによっお衚瀺される非衚瀺の芁玠があるシヌンでは、オブゞェクトが䜜成され、オブザヌバヌポップアップは特定のメッセヌゞをサブスクラむブしたす。 次に、むベントが発生するず、このオブゞェクトに通知が送信され、オブゞェクトは必芁なオブザヌバヌに通知を送信し、ポップアップが衚瀺されたす。 たずえば、 RegulateSoundPopUpクラスは、初期化時にGamePopUpsControllerからのメッセヌゞをサブスクラむブしたす。



戊略



たた、Strategyテンプレヌトも䜿甚したした。 たずえば、ボスによっお行動が異なりたす。䜕もしない人もいれば、危険から逃げる人もいたす。 それらの動䜜を実装するために、䞀連の戊略が䜿甚されたした。 戊略のコレクションが䜜成され、必芁なものが蚘入されたす。 異なる戊略を远加するこずにより、䞊叞に異なる動䜜を远加したす。 たずえば、 AIMovementStrategyクラスは、ボスに移動胜力を䞎える戊略の1぀です。



远加のラむブラリ。



プレむダヌの統蚈を収集するために、Google Analyticsを䜿甚するこずが決定されたした。 iOSおよびAndroid甚のGoogleアナリティクスSDKがありたすが、Windowsの実装はありたせんでした。 SDKドキュメントを読んだ埌、 Google Analytics Measurement Protocolを䜿甚するこずが決定されたした。 このようなプロトコルの䜿甚䟋 GATrackerpp は、むンタヌネットでcurlラむブラリを䜿甚しお発芋されたした。 その結果、分析を送信するクロスプラットフォヌムの実装になりたす。 ただし、情報を送信するには、GUID暙準に埓っお䞀意のプレヌダヌ識別子が必芁です。 たた、クロスプラットフォヌムでGUID識別子を生成するためのラむブラリcrossguidも芋぀けたした。 確かに、Androidの最埌には、すべおの人に1぀のGUIDを䜿甚するこずが決定されたした。 C ++をJavaに接続する方法がわかりたせんでした。



レベル蚭定でxmlファむルを解析するために、クロスプラットフォヌムのpugiXMLパヌサヌを䜿甚するこずが決定されたした。 これは、倧きなファむルを解析する必芁がなく、cocos2dxフォヌラムでアドバむスされたために遞択されたDOMパヌサヌです。



移怍機胜。







最初は、通垞のりィンドりアプリケヌションであるりィンドりの開発が行われたした。 その埌、windowsストア甚のポヌトが䜜成されたした-windowsRT䞊。 その埌、アンドロむド甚のバヌゞョンが䜜成されたした。 クロスプラットフォヌムプロゞェクトを敎理するために、gitのブランチシステムが遞択されたした。 プラットフォヌムごずに個別のブランチが䜜成されたす。 䞻な゚ラヌは、ブランチのコヌドベヌスが少し異なるこずでした。 cocos2dxリポゞトリなどの単䞀のカヌネルはありたせん。 埌で、プリプロセッサコマンドをファクトリクラスファクトリテンプレヌトにカプセル化しながら、最初にC ++プリプロセッサを䜿甚できるこずを孊びたした。 しかし、ブランチはただ有甚でした。 プラットフォヌムが異なれば、グラフィックやむンタヌフェむス芁玠の䜍眮も異なりたす。 同時に、Androidのすべおのコヌドは最初にWindowsでテストおよびデバッグされ、その埌Android向けにビルドされたした。



もう1぀の重芁なポむントは、異なるプラットフォヌムのファむルシステムにファむルを保存する方法を怜玢するこず、およびAndroidでapkファむルをアヌカむブするこずでした。



サりンド圢匏は問題を匕き起こしたせんでした-すべおのプラットフォヌムでmp3が䜿甚されたした。



開発䞭の奇劙な点



1ポストむンクリメントi ++が1぀のクラスでコンパむルされなかったため、事前むンクリメント++ iを実行する必芁がありたした-Androidのバヌゞョン。

2゚ンゞンはキリル文字のパスをサポヌトしおいたせんでした。 Windowsナヌザヌ名がロシア語で蚘述されおいる堎合、ゲヌムぱラヌを匕き起こし、起動したせん。

3メ゜ッドの実装が゚ンゞンにないため、サりンドが機胜しないこずが刀明した。 別のクラスを䜿甚する必芁がありたした。



芁玄



結論ずしお、䜿甚された䞻なパタヌンMVC、Factory、Loner、Observer、Strategyに泚目したいず思いたす。 䞻な远加ラむブラリはcurlずpugiXMLでした。 ゲヌムの開発には6か月かかりたした。 それらの



プロゞェクト党䜓の゜ヌスコヌドはここで、フィルタヌ付きのWindowsプロゞェクト゜ヌスファむルのディレクトリはここで衚瀺できたす 。

最埌に、私はゲヌムをリリヌスし、プロゞェクトに取り組んだずきに倚くの経隓ず喜びを埗たした。



ご枅聎ありがずうございたした。



All Articles