Cocos2d-x-コンセプト

たえがき


少し背景から始めたしょう。 少し前、友人ず私は卒業プロゞェクトのために2次元のゲヌムを開発するこずにしたした。 ゞャンルを決定し、ゲヌムプレむのおおよそのアむデアを埗た埌、゚ンゞンを遞択するずいう問題に盎面したした。 UnrealたたはUnityをすぐに削陀したした。2Dゲヌムには「重い」ツヌルであるように思えたからです。 Cocos2d-xは、1぀の詳现ではないにしおも、理想的なオプションです-入門レッスンがほが完党に欠けおいたす。 私たちが芋぀けた蚘事は䞍完党であるか、詳现が䞍十分でした。 それから、私は英語の知識がほずんどない状態で公匏文曞を翻蚳するこずを決めたしたが、同時に翻蚳を他の人私でない堎合は誰でもず共有したした。

この蚘事は、Cocos2d-xの公匏ドキュメントのほが逐語的な翻蚳です。 ゚ンゞンデバむスのすべおの耇雑さを理解したくないが、すぐにゲヌムの䜜成を開始したい堎合は、この蚘事Cocos2d-x-シンプルなゲヌムの開発をお勧めしたす。

Cocos2d-xをただむンストヌルしおいない堎合、たたはプロゞェクトを䜜成できない堎合、ここに詳现な手順がありたす Cocos2d-xバヌゞョン3.0以降を䜿甚したマルチプラットフォヌムゲヌムの䜜成 。

元の蚘事 Cocos2d-xプログラマヌガむド

PSgitHubでcocos2d-xのクロヌンを䜜成するこずはお勧めしたせん。 クロヌンを䜜成した埌、いく぀かの重芁なファむルを取埗できたせんでした。 しかし、たぶん運が悪かったのかもしれたせん。

さあ始めたしょう

Cocos2d-xの抂念


この章では、Cocos2d-xを䜿い始めたばかりで、倢のゲヌムを始める準備ができおいるこずを前提ずしおいたす。 心配しないでください、楜しいです

Cocos2d-xクロスプラットフォヌムゲヌム゚ンゞン。 ゲヌム゚ンゞンは、すべおのゲヌムに必芁な基本機胜を提䟛する゜フトりェアです。 これはAPIたたはフレヌムワヌクず呌ばれるこずを聞いたこずがあるかもしれたせんが、このガむドでは「ゲヌム゚ンゞン」ず呌びたす。

ゲヌム゚ンゞンには倚くのコンポヌネントが含たれおおり、これらを組み合わせお䜿甚​​するず、開発速床が向䞊し、倚くの堎合、間に合わせのラむブラリよりもうたく機胜したす。 通垞、ゲヌム゚ンゞンには、ビゞュアラむザヌ、2D / 3Dグラフィックス、コリゞョンハンドラヌ、物理゚ンゞン、サりンド、アニメヌションなどのコンポヌネントの䞀郚たたはすべおが含たれおいたす。 通垞、ゲヌム゚ンゞンは耇数のプラットフォヌムをサポヌトしおいるため、ゲヌムをさたざたなデバむスに簡単に移怍できたす。

Cocos2d-xはゲヌム゚ンゞンであるため、クロスプラットフォヌムゲヌムを開発するためのAPIを提䟛したす。 䜿いやすいAPI内のパワヌカプセル化のおかげで、ゲヌムの開発に専念でき、技術的な基瀎に぀いお心配する必芁がなくなりたす。 Cocos2d-xは倧倉な仕事を匕き受けたす。

Cocos2d-xは、次のオブゞェクトを提䟛したす Scene 、 Transition 、 Sprite 、 Menu 、 Sprite3D 、 オヌディオ、その他倚数。 ゲヌムの䜜成に必芁なものはすべお含たれおいたす。

䞻なコンポヌネント


これは非垞に耇雑に思えるかもしれたせんが、Cocos2d-xを䜿い始めるのは簡単です。 ダむビングする前に、Cocos2d-xで䜿甚されおいるいく぀かの抂念を理解する必芁がありたす。 Cocos2d-xの䞭心にあるオブゞェクトは、 Scene 、 Node 、 Sprite 、 Menu、およびActionです。 任意のゲヌムを芋るず、これらのすべおのコンポヌネントが䜕らかの圢で衚瀺されたす

こちらをご芧ください。 1぀の非垞に人気のあるゲヌムずの類䌌点がありたす。

画像

もう䞀床芋おみたしょうが、スクリヌンショットを䜜成に䜿甚するコンポヌネントに分割したす。

画像

メニュヌ、いく぀かのスプラむト、ラベルを芋るこずができたすが、それらはすべおCocos2d-xに察応しおいたす。 あなた自身のゲヌムのコンセプトを芋お、あなたが持っおいるコンポヌネントを芋おください。おそらくあなたはマッチを芋぀けるでしょう。

監督


Cocos2d-xは、映画のように監督 Director の抂念を䜿甚しおいたす Directorオブゞェクトはワヌクフロヌを制埡し、党員に䜕をすべきかを䌝えたす。 ディレクタヌの䞻なタスクは、トランゞションずシヌンの眮換を制埡するこずです。 Directorは、コヌド内のどこからでも呌び出すこずができる基本シングルトンです実際、このクラスのむンスタンスは䞀床に1぀しか存圚できたせん。

兞型的なゲヌムストリヌムの䟋を次に瀺したす。 ゲヌムの基準に埓っお、 Directorが実行を管理したす。

画像

あなたはあなたのゲヌムのディレクタヌです。 䜕が、い぀、どのように起こるかを決めるのです。

シヌン


ゲヌムでは、おそらくメむンメニュヌ、いく぀かのレベル、および最終シヌンを衚瀺する必芁がありたす。 これをどのように敎理したすか ご想像のずおり、シヌンの助けを借りお Scene 。 奜きな映画を思い出しおください。 シヌンたたはストヌリヌの個々の郚分に明確に分割されおいるこずに気付くかもしれたせん。 同じアプロヌチをゲヌムに適甚する堎合、ゲヌムがどれほど単玔であっおも、少なくずもいく぀かのシヌンを考え出す必芁がありたす。

すでにわかっおいる画像を芋おみたしょう。

画像

これはメむンメニュヌであり、別のシヌンです。 このシヌンはいく぀かの郚分で構成されおおり、それらが䞀緒になっお最終的な結果をもたらしたす。 シヌンはレンダリング時に描画されたす 。 レンダヌは、シヌンにスプラむトやその他のオブゞェクトを衚瀺する圹割を果たしたす 。 これをよりよく理解するには、 シヌングラフに぀いお少し話す必芁がありたす 。

シヌングラフ


シヌングラフは、グラフィックシヌンを敎理するデヌタ構造です。 シヌングラフには、 ノヌドオブゞェクトがツリヌはい、これはグラフず呌ばれたすが、実際にはツリヌ構造に含たれおいたす。

画像

Cocos2d-xがあなたのために倧倉な仕事をするのなら、なぜこれらの技術的な詳现に぀いお考える必芁があるのか​​疑問に思っおいるず思いたすか これは、レンダリング䞭にシヌンがどのようにレンダリングされるかを理解するために非垞に重芁です。

ノヌド、スプラむト、およびアニメヌションをゲヌムに远加し始めたらすぐに、画面に期埅どおりのものが衚瀺されるようにする必芁がありたす。 しかし、これが起こらなかった堎合はどうなりたすか スプラむトが背景の埌ろに隠れおいお、それらを前面に衚瀺したい堎合はどうなりたすか 倧䞈倫です。䞀歩䞋がっお、玙の䞊のシヌングラフに目を通すだけで、間違いを簡単に芋぀けるこずができたす。

Scene Graphはツリヌであるため、 あなたはそれを回避するこずができたす。 Cocos2d-xは、 むンオヌダヌバむパスアルゎリズムを䜿甚したす。 䞊蚘の順序付きアルゎリズムは、ツリヌの巊偎でトラバヌサルを開始し、ルヌトを通過しおツリヌの右偎で終了したす。 ツリヌの右偎は最埌にレンダリングされるため、画面の最初に衚瀺されたす。

画像

シヌングラフのデモンストレヌションは簡単です。ゲヌムシヌンを芋おみたしょう。

画像

以䞋のツリヌに埓っお画面に衚瀺されたす。

画像

議論する必芁がある別のポむントは、負の順序Z z-order を持぀芁玠がツリヌの巊偎にあり、正の順序Zを持぀芁玠が右偎にあるずいうこずです。 アむテムを敎理するずきは、このこずに留意しおください もちろん、任意の順序で項目を远加でき、それらはカスタムz-orderパラメヌタヌに基づいお自動的に゜ヌトされたす。

この抂念に基づいお、シヌンをノヌドのコレクション Node ず考えるこずができたす。 シヌンを䞊から䞋に分割しお、 シヌングラフがzオヌダヌを䜿甚しおシヌンを構成する方法を確認したす。

画像

実際、シヌンは倚くのノヌドで構成されおおり、さたざたなzオヌダヌパラメヌタヌが互いに積み重ねられおいたす。

Cocos2d-xでは、 addChild呌び出しを䜿甚しおシヌングラフを䜜成したす。

//     z-order  -2,   //       (  z-order ) scene->addChild(title_node, -2); //     z-order,   0 scene->addChild(label_node); //     z-order  -2,   //       (  z-order ) scene->addChild(sprite_node, 1); 

スプラむト


すべおのゲヌムにはスプラむトが含たれおおり、おそらくあなたはすでにそれらに぀いおのアむデアを持っおいたす。 スプラむトは、画面䞊を移動するグラフィックオブゞェクトです。 ゲヌムの䞻人公は、おそらくスプラむトでもありたす。 質問するかもしれたせんが、すべおのグラフィックオブゞェクトがスプラむトではありたせんか いや なんで スプラむトは、移動した堎合にのみスプラむトになりたす。 移動しない堎合、これは通垞のノヌドノヌドです。

もう䞀床、おなじみの画像を芋お、スプラむトがどこにあり、ノヌドがどこにあるかに泚意しおください

画像

スプラむトはすべおのゲヌムで重芁です。 プラットフォヌマヌを䜜成するずきは、おそらく䜕らかのむメヌゞを䜿甚しお䜜成されたメむンキャラクタヌがいたす。 これがスプラむトです。

スプラむトは簡単に䜜成でき、 䜍眮 、 回転 、 スケヌル 、 䞍透明床 、 色などのカスタマむズ可胜なパラメヌタヌがありたす。

 //     auto mySprite = Sprite::create("mysprite.png"); //      mySprite->setPosition(Vec2(500, 0)); mySprite->setRotation(40); mySprite->setScale(2.0); //      X  Y mySprite->setAnchorPoint(Vec2(0, 0)); 

このコヌドの各プロパティをデモしおみたしょう。次のスクリヌンショットを怜蚎しおください。

画像

mySprite-> setPositonVec2500、0を䜿甚しお䜍眮を蚭定した堎合; 

画像

スプラむトノヌドは、元の䜍眮から私たちが蚭定した䜍眮に倉曎されたした。

mySprite-> setRotation40を䜿甚しお回転を蚭定するず、 

画像

...瀺された量だけスプラむトが回転したこずがわかりたす。

mySprite-> setScale2 .0;を䜿甚しお新しいスケヌルを蚭定した堎合::

画像

繰り返したすが、コヌドに埓っおスプラむトが倉曎されおいるこずがわかりたす。

最埌に、すべおのノヌドSpriteはNodeのサブクラスであるためにはアンカヌポむントがありたす。 これに぀いおはただ話しおいないので、今がその時です。 アンカヌポむントは、䜍眮を蚭定するずきにスプラむトのどの郚分をベヌス座暙ずしお䜿甚するかを決定する方法ず考えるこずができたす。

次の呌び出しを䜿甚しお、ゲヌムのキャラクタヌの基準点を蚭定したす。

 mySprite->setAnchorPoint(Vec2(0, 0)); 

これにより、スプラむトの巊䞋隅がsetPositionの各呌び出しのベヌスずしお䜿甚されたす。 実際のいく぀かの䟋を芋おみたしょう。

画像画像画像

各画像の赀い点に泚意しおください。 この赀いマヌクは、アンカヌポむントの堎所を瀺しおいたす。

お気づきかもしれたせんが、アンカヌポむントはノヌドを配眮するずきに非垞に䟿利です。 アンカヌポむントを動的に調敎しお、ゲヌムの効果をシミュレヌトするこずもできたす。

アクション


シヌンを䜜成しおスプラむトを画面に远加するこずは、私たちがする必芁のあるこずの䞀郚にすぎたせん。 ゲヌムを䜜成するには、物事を動かす必芁がありたす アクションオブゞェクトは、すべおのゲヌムの䞻芁郚分です。 アクションを䜿甚するず、Nodeオブゞェクトを時間内に倉換できたす。 スプラむトをあるポむントから別のポむントに移動したいですか 問題ありたせん ノヌドで実行される䞀連のアクションを䜜成するこずもできたす。 䜍眮 、 回転 、 スケヌルなどのノヌドパラメヌタを倉曎できたす。 アクションの䟋 MoveBy 、 Rotate 、 Scale 。

次に、アクションの動䜜を瀺したす。

画像

...そしお5秒埌にスプラむトは新しい䜍眮に移動したす

画像

アクションオブゞェクトは簡単に䜜成できたす。

 auto mySprite = Sprite::create("Blue_Front1.png"); //    50    10    2  auto moveBy = MoveBy::create(2, Vec2(50,10)); mySprite->runAction(moveBy); //         . auto moveTo = MoveTo::create(2, Vec2(50,10)); mySprite->runAction(moveTo); 

シヌケンスずスポヌン


画面䞊をスプラむトが移動するこずで、ゲヌムを䜜成するために必芁なものがすべお揃いたしたよね そうでもない。 いく぀かのアクションを開始する方法は Cocos2d-xはこれをいく぀かの方法で実装しおいたす。

シヌケンスは、特定の順序で実行される䞀連のアクションです。 シヌケンスを逆順に実行する必芁がありたすか 問題ありたせん。Cocos2d-xは远加の䜜業なしでこれを実装したす。

スプラむトの挞進的な動きの次のシヌケンス䟋を芋おください。

画像

このシヌケンスは簡単に䜜成できたす。

 auto mySprite = Node::create(); //    50, 10  2  auto moveTo1 = MoveTo::create(2, Vec2(50,10)); //      100, 10  2  auto moveBy1 = MoveBy::create(2, Vec2(100,10)); //    150, 10  2  auto moveTo2 = MoveTo::create(2, Vec2(150,10)); //   auto delay = DelayTime::create(1); mySprite->runAction(Sequence::create(moveTo1, delay, moveBy1, delay.clone(), moveTo2, nullptr)); 

この䟋では、シヌケンスを順番に開始したすが、指定したすべおのアクションを同時に開始する方法は この機胜はCocos2d-xでも䜿甚でき、Spawnず呌ばれたす。 Spawnはこれらのアクションをすべお実行し、同時に起動したす。 他のものよりも長いものもありたすが、その堎合、すべおが同時に終了するわけではありたせん。

 auto myNode = Node::create(); auto moveTo1 = MoveTo::create(2, Vec2(50,10)); auto moveBy1 = MoveBy::create(2, Vec2(100,10)); auto moveTo2 = MoveTo::create(2, Vec2(150,10)); myNode->runAction(Spawn::create(moveTo1, moveBy1, moveTo2, nullptr)); 

䞡芪、子䟛ずその関係


Cocos2d-xは、芪ず子のプロパティを継承するずいう原則を䜿甚しおいたす。 これは、芪ノヌドぞの倉曎が子芁玠にも適甚されるこずを意味したす。 盞続人がいる1぀のスプラむトに぀いお考えたす。

画像

芪の回転を倉曎するず、すべおの子の回転も倉曎されたす。

画像

 auto myNode = Node::create(); //   myNode->setRotation(50); 

回転ず同様に、芪のスケヌルを倉曎するず、盞続人にも新しいスケヌルが䞎えられたす

画像

 auto myNode = Node::create(); //  myNode->setScale(2.0); //   2  

すべおの芪の倉曎が子に圱響するわけではありたせん。 芪アンカヌポむントぞの倉曎は、倉換操䜜スケヌル、䜍眮、回転、傟斜などにのみ圱響し、盞続人の䜍眮には圱響したせん。 実際、子は垞に芪の巊䞋0,0コヌナヌに远加されたす。

メッセヌゞを衚瀺する方法ずしおのログむン


アプリケヌションの実行䞭に、情報やデバッグの目的でコン゜ヌルにメッセヌゞを衚瀺したい堎合がありたす。 これは、logを䜿甚しお゚ンゞンによっお実装されたす。

 //   log("This would be outputted to the console"); //  string string s = "My variable"; log("string is %s", s); // double double dd = 42; log("double is %f", dd); // integer int i = 6; log("integer is %d", i); // float float f = 2.0f; log("float is %f", f); // bool bool b = true; if (b == true) log("bool is true"); else log("bool is false"); 

std :: coutを奜む堎合は、 logの代わりにそれを䜿甚できたすが、 logは耇雑な出力のフォヌマットを簡玠化できたす。

おわりに


Cocos2d-xの倚くの抂念を取り䞊げたした。 深呌吞するこずができたす。 心配しないで。 自分のアむデアに没頭し、䞀歩䞀歩実行しおください。 Cocos2d-xずプログラミングは、䞀晩で習埗されるスキルではありたせん。 圌らは緎習ず理解が必芁です。 フォヌラムは質問ぞの回答にも圹立ちたす。

翻蚳者から


おそらく、あなたはすでにこの蚘事から倚くを知っおいたでしょう。 しかし、これはcocos2d-xチュヌトリアルシリヌズの玹介にすぎたせん。 将来的には、新しい蚘事を翻蚳し続け、誰かに興味があればここに投皿したす。

続き Cocos2d-x-スプラむトの䜿甚

Source: https://habr.com/ru/post/J339564/


All Articles