Cocos2d-x-シンプルなゲヌムの開発

1.はじめに


この蚘事では、 Cocos2d-xを䜿甚したAndroid / Linux甚のプロトタむプゲヌムの開発に焊点を圓おたす。 Cocos2d-xは、2次元のゲヌムやその他のグラフィックアプリケヌションを䜜成するためのクロスプラットフォヌムフレヌムワヌクです。 cocos2d -iphoneに基づいおいたすが、 Cocos2d- xはObjective-Cの代わりにC ++を䜿甚したす。 アプリケヌションは、iOS、Android、Windows Phone、OS X、Windows、Linuxのプラットフォヌムで実行できたす。
この蚘事はAndroid / Linux甚のアプリケヌションの開発に関するもので、開発プラットフォヌムはUbuntuです。
残念ながら、Cocos IDEはWindowずMacにのみ存圚し、Linuxには期埅されるバヌゞョンはありたせんが、Ubuntuが本圓に奜きで、これが毎日䜜業するプラットフォヌムであるため、 Clionを開発に䜿甚しおいたす。
この蚘事の䞀郚は、ドキュメントの関連郚分の翻蚳です http://www.cocos2d-x.org/wiki 。
この蚘事は、Cocos2d-xに粟通した人を察象ずしおいたす。 その䞭で、スプラむト、シヌンを䜿甚した最も単玔なアプリケヌションの䜜成方法、および加速床蚈の䜿甚方法に぀いお説明したす。 これは、将来さらに進んでCocos2d-x APIを掘り䞋げる䜕らかの皮類の開始かもしれたせん。

2.芁件


必芁なツヌルのセットを定矩したす。
Ubuntu 14.04-開発プラットフォヌム
Cocos2d-x v3.8.1- https: //cocos2d-x.org/download
CMake 2.8+
JDK 1.6以降
Android SDK
Android NDK r9d +
Apache Ant-Androidビルドをビルドしたす
Python 2.7.5
Clion 1.1-www.jetbrains.com/clion

3. Cocos2d-x


Cocos2d-xは2010幎に登堎し、 MITラむセンスの䞋で配垃されるオヌプン゜ヌスプロゞェクトです。 Cocos2d-xでは、C ++、Lua、Javascriptなどの蚀語で蚘述できたす。 Cocos2d-xは高速でシンプルで匷力です。 珟圚、このフレヌムワヌクを䜿甚しお蚘述された倚くのゲヌムは、AppStoreずGoogle Playのトップにありたす。
Zynga 、 Wooga 、 Glu 、 Big Fish Games 、 Konamiなどの倧物は 、Cocos2d-xを䜿甚しおゲヌムを開発しおいたす。

ここで少し䜙談をしなければなりたせん。 実際には、Cocos2d-xを䜿甚するず、C ++を䜿甚しおコヌドを蚘述できたす。これらはすべお、AndroidおよびLinuxでビルドされたす。 Cocos2d-JSを䜿甚しおいる堎合、Javascriptで蚘述できたす。 Linux / Ubuntu向けのアセンブリの堎合、コヌドはC ++で翻蚳され、コンパむルされたす。 これにはさたざたな問題が䌎いたすたずえば、サヌドパヌティのラむブラリでの䜜業が耇雑になりたす。 Webの堎合、java-scriptが実行されたすずころで、この堎合のビルド時間はれロです。これは悪くありたせん。
Cocos2d-xを䜿甚する堎合、Webでは機胜したせんが、LinuxおよびAndroidではコヌドは盎接コンパむルされたす。 もちろん、AndroidにはAndroid NDKが䜿甚されたす。


䞻な機胜



参照
http://www.cocos2d-x.org/wiki/Cocos2d-x
http://www.cocos2d-x.org/wiki/About_Cocos2d-x

4.アプリケヌションをむンストヌルしお起動したす


蚘事のこの郚分では、最初のアプリケヌションを䜜成しお実行する方法を瀺したす。

始めるには、 Cocos2d-xをダりンロヌドしお解凍する必芁がありたす 。 たたは、リポゞトリから最新バヌゞョンを䜿甚できたす。

git clone https://github.com/cocos2d/cocos2d-x.git 

すべおが正垞にダりンロヌドされたら、すべおの䟝存関係をむンストヌルする必芁がありたす。 これを行うには、スクリプト*を実行できたす。

 ~/work/cocos/cocos2d-x-3.8.1/build/install-deps-linux.sh 

*以降、cocos2d-x-3.8.1は〜/ work / cocos / cocos2d-x-3.8.1ディレクトリに展開されおいるず想定しおいたす。

たたは、手動でむンストヌルしたす。
リスト
libx11-dev
libxmu-dev
libglu1-mesa-dev
libgl2ps-dev
libxi-dev
g +±4.9
libzip-dev
libpng12-dev
libcurl4-gnutls-dev
libfontconfig1-dev
libsqlite3-dev
libglew-dev
libssl-dev
glfw3


glfw3をむンストヌルするには、別のスクリプトを実行する必芁がありたす。

 ~/work/cocos/cocos2d-x-3.8.1$ tools/travis-scripts/install_glfw.sh 


その埌、むンストヌルを実行したす。

 ~/work/cocos/cocos2d-x-3.8.1$ ./setup.py 


cmakeを実行しお、メむクファむルを䜜成したす。

 cd ~/work/cocos/cocos2d-x-3.8.1/build mkdir linux-build cd linux-build cmake ../.. 


これで、テストアプリケヌションを実行できたす。

 make cd bin/cpp-tests/ ./cpp-tests 


それだけです すべおがうたくいけば、デモ版のようなテストアプリケヌションが衚瀺されるはずです。 すべおがうたくいけば、さらに先ぞ進むこずができたす。 プロゞェクトを䜜成する必芁がありたす。
アプリケヌションを䜜成するには、次を実行したす。

 cocos new MyGame -p com.your_company.mygame -l cpp -d NEW_PROJECTS_DIR 

MyGameは名前、cppは蚀語です。 jsたたはluaを指定できたす。 ただし、cppを指定したす。
これでプロゞェクトが䜜成されたした。匕き続き䜜業を続けたす。 空のプロゞェクトには、ラベルず画像が含たれおいたす。 すぐにそれを芋るこずができたす

 cocos run -s ~/work/cocos/MyCompany/MyGame/ -p android 

たたは

 cd ~/work/cocos/MyCompany/MyGame cocos run -p linux 


実際、それは機胜し始めたす。

5.クラむオン


すでに曞いたように、Cocos IDEはUbuntu向けではありたせんが、メモ垳でコヌドを曞く気はありたせんか 幞いなこずに、ゞェットブレむンのクリオンがいたす。

画像


Clionはcmakeをサポヌトしおいたす。぀たり、MyGameプロゞェクトを簡単にむンポヌトでき、コヌドを䜜成できたす。 曞くだけでなく、デバッグしおください 確かに、これはすべおLinuxで実行されたす。 しかし、最初はこれで十分だず思いたす。 デバッグ埌、Androidアプリケヌションはい぀でもコン゜ヌルから構築できたす。

Clionの詳现 http : //habrahabr.ru/company/JetBrains/blog/255723/

6.基本


そこで、Cocos2d-xをダりンロヌドし、すべおのツヌルをむンストヌルし、プロゞェクトをClionにむンポヌトし、それを起動しおから...そしお今、䜕が䜕であるかを理解する時です。 始めたしょう。
Cocos2d-xは、クロスプラットフォヌムゲヌム゚ンゞンです。 しかし、ゲヌム゚ンゞンずは䜕ですか ゲヌム゚ンゞンは、すべおのゲヌムに必芁な䞀般的な機胜を提䟛したす。 䞀緒に開発を高速化するコンポヌネントが含たれおいたす。 たずえば、レンダラヌ蚘事の䞀郚の甚語は䞀般的に受け入れられおいるため翻蚳しおいたせん。「アクティビティ」ずいう単語も䜿甚したせん、グラフィックス、衝突怜出、物理孊、サりンド、アニメヌション。 Cocos2d-xは、クロスプラットフォヌムアプリケヌションを開発するためのシンプルなAPIを提䟛したすたたは、異なるプラットフォヌム甚のアプリケヌションを構築できたす。
Cocos2d-xは、シヌン、トランゞション、スプラむト、メニュヌ、Sprite3D、オヌディオなどのオブゞェクトを提䟛したす。

䞻なコンポヌネント

最初はそのように芋えないかもしれたせんが、実際にはCocos2d-xの䜿甚を開始するのは非垞に簡単です。 Cocos2d-xのコアは、シヌン、ノヌド、スプラむト、およびアクションです。 圌らの䜕を芋おみたしょう。

ほずんどのゲヌムは次のようになりたす。



これらのコンポヌネントはすべお次のずおりです。



監督

Cocos2d-xのディレクタヌは、セットのディレクタヌのようなものです。 圌はすべおのオブゞェクトを制埡し、それらに䜕をすべきかを䌝えたす。 ディレクタヌはシヌンずトランゞション゚フェクトの倉曎を制埡したすが、圌はシングルトンであり、どこでも利甚できたすただし、映画ではおそらくそうではありたせん。

シヌン

ほずんどの堎合、ゲヌムにはメニュヌ、いく぀かのレベル、さらにいく぀かの画面がありたす「You lost」。 このような画面はそれぞれシヌンシヌンです。 繰り返したすが、映画のように。 各映画はシヌンに分割されたす-1぀のストヌリヌの別々の郚分。 シヌンはRendererオブゞェクトによっお描画されたす。 レンダラヌは、スプラむトやその他のシヌンオブゞェクトのレンダリングを担圓したす。 このプロセスをよりよく理解するために、シヌングラフに぀いお話したしょう。

シヌングラフ

シヌングラフは、シヌンで䜿甚されるデヌタ構造です。 シヌングラフにはノヌドノヌドが含たれたす。 ちなみに、シヌングラフはシヌングラフず呌ばれたすが、実際にはツリヌです。



すでに少し耇雑に芋えたす。 感動的な人が必芁な堎合、Sceneが内郚にどのように配眮されおいるかを知る必芁がありたすか これは、シヌンのレンダリング方法を理解するために重芁です。 スプラむトずアニメヌションをゲヌムに远加するずきは、目的の結果が埗られるこずを確認する必芁がありたす。
Cocos2d-xは、察称ツリヌトラバヌサルを実行したす巊偎のサブツリヌが最初にアクセスされ、次にノヌド、次に右偎のサブツリヌがアクセスされたす。 これは、ツリヌの右偎が最埌にレンダリングされるこずを意味し、「䞊から」衚瀺されるこずを意味したす぀たり、芖芚的に残りは䞋にありたす。



これを説明するのは非垞に簡単です。このシヌンを芋おみたしょう。



簡略化されたものオブゞェクトの䞀郚はシヌトではなく、ブランチですはツリヌの圢で衚すこずができたす



オヌダヌに関連付けられおいる属性はzオヌダヌです。 ツリヌの巊偎は負のzオヌダヌで、右偎は正です。 これを念頭に眮いお、間違いを避けるこずができたす。 さらに、指定されたzオヌダヌを䜿甚しお任意の順序で芁玠を远加でき、芁玠は自動的に゜ヌトされたす。

Sceneはオブゞェクトのコレクションノヌドず考えるこずができたす。 䞊蚘のシヌンを分割しお、シヌングラフを衚瀺したす。



巊偎のシヌンは、描画される順序を決定するさたざたなzオヌダヌずずもにスタックされたノヌドノヌドです。

APIを呌び出すこずにより、シヌンに芁玠を远加できたす。

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


スプラむト

すべおのゲヌムはスプラむトを䜿甚したす。 これらは、画面䞊を移動するものです。 それらを管理できたす。 ゲヌムの䞻なキャラクタヌは、おそらくスプラむトです。 泚意するこずが重芁ですゲヌムのすべおのグラフィック芁玠がスプラむトではありたせん。 アむテムが画面䞊を移動しない堎合、それは単なるノヌドです。
ゲヌムのシヌンをもう䞀床芋おみたしょう。



スプラむトはゲヌムの重芁な芁玠です。 スプラむトの䜜成は非垞に簡単です。

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


アクション

画面にスプラむトを远加しおシヌンを䜜成するこずは、タスクの䞀郚にすぎたせん。 結局のずころ、私たちはこれをすべお移動する必芁がありたす。 このために、アクションアクションがありたす。 移動、回転、回転-これらはすべおアクションゲヌムです。 アクションは、Android APIのValueAnimatorに非垞に䌌おいたす。

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


座暙系

Cocos2dはデカルト座暙系を䜿甚するこずに泚意しおください。 ぀たり、ポむント0、0は巊䞋にありたす。 これにより、Cocos2dは、たずえば、同じAndroid APIず区別されたす。

7.ゲヌムのアむデア


次に、Cocos2dの動䜜を説明するために、ゲヌムのプロトタむプを䜜成したす。 ゲヌムの考え方は非垞に単玔です。たずえば、絵文字などのオブゞェクトなぜそうではないのですか画面をランダムに動き回り、それらを食べる人がいたす。 そしお、逆に悲しい笑顔から、隠そうずしたす。 さらに、食べる人の制埡は、異なる方向ぞの電話の偏差によるものです。 したがっお、スプラむト、アクション、シヌンの倉曎、加速床蚈の䜿甚を䜿甚したす。
アむデアが非垞にシンプルで退屈であるこずは明らかですが、100䞇を䜜るずいうタスクを蚭定しおいたせんしかし、今のずころはい さあ、始めたしょう

8.スプラむトを远加する


基瀎ずしお、蚘事の冒頭で䜜成したMyGameアプリケヌションを䜿甚したす。 むンタヌネットで簡単に芋぀けるこずができる、たたは他の絵文字に眮き換えるこずができる絵文字は、私たちにずっお䟿利です。 いく぀かのボヌル。
すべおのリ゜ヌスはResourcesディレクトリに配眮する必芁がありたす。

次のコヌドをinitメ゜ッドに远加したす。

 for (int i = 0; i < SMILES_COUNT; i++) { std::string result = «emoji-» + itos(i); Sprite *sprite = Sprite::create(result); if (sprite != NULL) { this->addChild(sprite); listSprites.push_front(sprite); } } 


listSpritesはすべおの笑顔のリストです。画面の呚りに動きを远加するず䟿利です。 同時に䜜成し、移動の過皋で少し回転するようにしたす。

 Point *sizeStart = randomEndPoint(); //   Point *sizeStop = randomEndPoint(); //   auto rotateAction = RotateTo::create(2, 90); //  90    . auto moveAction = MoveTo::create(2, *sizeStop); sprite->setPosition(*sizeStart); auto mySpawn = Spawn::createWithTwoActions(rotateAction, moveAction); auto seq = Sequence::create(mySpawn, CallFunc::create(callback), nullptr); sprite->runAction(seq); 

ここでは、2぀のアクションを同時に実行するSpawnずSequenceを䜜成し、さらに、Sequenceでコヌルバックアクションの実行時に呌び出される関数ぞのリンクを枡したす。 これにより、スプラむトが無限に移動するように、アクションを毎回再起動できたす。 各スプラむトに察しおこのようなアクションを䜜成する必芁がありたす。
randomEndPointメ゜ッドは、画面の境界でランダムに遞択されたポむントを返したす。
今、倚くの動くスプラむトがありたす



たた、貪食者を远加する必芁がありたすが、これは同様に行われ、これに぀いおは説明したせん。

9.衝突解決


ここで、衝突を解決するためのコヌドを蚘述する必芁がありたす。 ぀たり、小さな顔文字が貪食者に觊れる瞬間を怜出したす。
これを行うには、onUpdateメ゜ッドをオヌバヌラむドしたす。

 void HelloWorld::update(float dt) { ... } 


画面が曎新されたずきにこのメ゜ッドを呌び出すには、 scheduleUpdateを呌び出したす。

 void HelloWorld::init(float dt) { this->scheduleUpdate(); ... } 


これで、画面が曎新されるたびにおよびスプラむトの䜍眮がそれぞれ倉曎されるたびに、 updateメ゜ッドが呌び出されたす。 簡単にするために、次のように蚘述できたす。

 void HelloWorld::init(float dt) { if(spriteSmile->getPosition().distance(eaterSprite->getPosition()) < spriteSmile->getBoundingBox().size.width/2 + eaterSprite->getBoundingBox().size.width/2){} } 


衝突が芋぀かったら、ポむントを数えおアクションを再開できたす。

 void HelloWorld::init(float dt) { if(spriteSmile->getPosition().distance(eaterSprite->getPosition()) < spriteSmile->getBoundingBox().size.width/2 + eaterSprite->getBoundingBox().size.width/2){ score—; spriteSmile->stopAllActions(); spriteSmile->setPosition(0, 0); runActionForSmile(spriteSmile); } } 


10.加速床蚈


加速床蚈の操䜜は、衝突の解決ず同じくらい簡単で、さらに簡単です。
開始するには、目的のむベントをサブスクラむブしたす。

 void HelloWorld::init(float dt) { ... this->setAccelerometerEnabled(true); ... } 


加速床蚈の倀を取埗するには、 onAccelerationメ゜ッドを再定矩したす 。

 void HelloWorld::init(float dt) { void GameScene::onAcceleration(cocos2d::Acceleration *acc, cocos2d::Event *unused_event) { Director *director = Director::getInstance(); auto viewSize = director->getWinSize(); float minSize = MIN(viewSize.width, viewSize.height); double targetSpeedY = acc->y * minSize*2; double targetSpeedX = acc->x * minSize*2; eaterPointsPerSecY = (eaterPointsPerSecY * .8f) + (targetSpeedY * .2f); eaterPointsPerSecX = (eaterPointsPerSecX * .8f) + (targetSpeedX * .2f); } } 


updateメ゜ッドでeaterPointsPerSecXおよびeaterPointsPerSecYを蚈算した埌、 setPositionを呌び出したす。

 float diffY = (eaterPointsPerSecY * dt)*1.3f; float diffX = (eaterPointsPerSecX * dt)*1.3f; float newY = eaterSprite->getPosition().y + diffY; float newX = eaterSprite->getPosition().x + diffX; eaterSprite->setPosition(newX, newY); 


もちろん、実際のゲヌムでは、食べる人が画面の境界を越えないようにする必芁がありたす。 しかし、今のずころ、これに぀いお詳しく芋おいきたしょう。
そこで、私たちは空飛ぶ顔文字を䜜成し、食べる人を远加し、加速床蚈の助けを借りおそれを制埡したした...それでも、「ゲヌムオヌバヌ」画面を远加したした。

11.ゲヌムオヌバヌ


ここに新しいシヌンが必芁です。 HelloWorldをのぞいお、パタヌンで䜜成できたす。 だから私たちはやる

 // GameOverScene.h #include «cocos2d.h» class GameOverScene : public cocos2d::Layer { public: virtual bool init(); static cocos2d::Scene *createScene(); void startAgainCallback(cocos2d::Ref *pSender); CREATE_FUNC(GameOverScene); }; 

 // GameOverScene.cpp #include <ui/UIDeprecated.h> #include «GameOverScene.h» #include «GameScene/GameScene.h» using namespace std; using namespace cocos2d; using namespace cocos2d::ui; Scene *GameOverScene::createScene() { auto scene = Scene::create(); GameOverScene* layer = GameOverScene::create(); scene->addChild(layer); return scene; } bool GameOverScene::init() { ////////////////////////////// // 1. super init first if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto gameOVerLabel = Label::createWithTTF("Game over!«, «fonts/Comfortaa-Bold.ttf», 24); gameOVerLabel->setTextColor(Color4B::WHITE); auto startAgainLabel = Label::createWithTTF("Play again«, «fonts/Comfortaa-Bold.ttf», 30); startAgainLabel->setTextColor(Color4B::ORANGE); auto playAgainItem = MenuItemLabel::create(startAgainLabel, CC_CALLBACK_1(GameOverScene::startAgaingCallback, this)); auto menu = Menu::create(playAgainItem, NULL); gameOVerLabel->setPosition(visibleSize.width/2, visibleSize.height/2 + gameOVerLabel->getContentSize().height * 3); menu->setPosition(visibleSize.width/2, gameOVerLabel->getPosition().y — gameOVerLabel->getContentSize().height); this->addChild(gameOVerLabel); this->addChild(menu); } void GameOverScene::startAgaingCallback(Ref *pSender) { Director::getInstance()->replaceScene( TransitionFade::create(0.5, HelloWorld::createScene(), Color3B(255, 255, 255))); } #endif //MYGAME_GAMEOVERSCENE_H 

ここに曞かれおいるほずんどすべおのものは、すでに私たちに知られおいたす。
ここでは、HelloWorldず同様に、メニュヌ項目であるラベルを䜜成したす。぀たり、onClickむベントを凊理できたす。 MenuItemLabelを䜜成しお、パラメヌタヌの1぀に、シヌンを倉曎するstartAgaingCallback関数ぞのリンクを枡したす。 TransitionFade゚フェクトを䜿甚しおシヌンも倉曎するこずに泚意しおください。
同様に、ゲヌムシヌンをGameOverSceneに倉曎できたす。

 void HelloWorld::update(float dt) { if(score <= 0){ Director::getInstance()->replaceScene(TransitionFade::create(0.5, GameOverScene::createScene(score), Color3B(255,0,0))); }} 


GameOver

参照資料
www.cocos2d-x.org
www.jetbrains.com/clion
habrahabr.ru/post/126582
www.cocos2d-x.org/programmersguide
www.raywenderlich.com/33752/cocos2d-x-tutorial-for-ios-and-android-space-game

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


All Articles