サイトのトップへ戻る

Cocos2d-x ドキュメント 日本語訳

サイト内検索

3D

あなたはおそらく、Cocos2d-xを2D ゲームエンジンと思って開発を始めたことでしょう。 バージョン3以降では3D機能が追加され、より高機能になっています。 3D ゲームは巨大市場となっており、Cocos2d-x では3Dゲーム開発に必要な機能を全て追加しています。 3D 開発はあなたにとってまだ経験が浅く、馴染みのない用語がいくつか使われているかもしれません。 また、追加で使い方を覚えなければならないソフトウェアツールもあります。 それでは、まずは手始めにやってみましょう。



用語

3Dを使用する時に、覚えておくべき一般的な使用用語がいくつかあります。:

  • メッシュ - あなたが描写する形状とテクスチャを構成する頂点。

  • モデル - 描写することができるオブジェクト。これはメッシュの集合体です。 Cocos2d-xでは Sprite3Dがこれに該当します。

  • テクスチャ - 3D モデルの全ての表面と頂点は、テクスチャに紐付けすることができます。 In most cases you will have multiple textures per model, unwrapped in a texture atlas.

  • カメラ - 3D 世界は平坦ではないので、その世界を見るためのカメラを設定する必要があります。カメラのパラメータを変更すると表示されるシーンが変わります。

  • 光源 - 光源が適用されると、シーンがよりリアルに見えるようになります。 オブジェクトをリアルに見せるためには、光源に応じて色を変更する必要があります。 あなたが光源を向いている時、光を向いている側が明るくなってその反対側は暗くなります。 オブジェクトに光を当てる ということは、光源に応じてオブジェクトの色を算出するということを意味します。



Sprite3D

2D ゲームと同様に、 3D ゲームにもSprite オブジェクトがあります。 Sprite オブジェクトは全てのゲームにおいて中核となる基本的なものです。 SpriteSprite3D の間の主な違いの一つは、 Sprite3Dオブジェクトはxyzの三つの軸上に配置できるということです。 通常のSpriteと同様にSprite3D は多くの方法で動作します。 Sprite3D オブジェクトの読み込みと表示は簡単です:

auto sprite = Sprite3D::create("boss.c3b"); //c3b file, created with the FBX-converter
sprite->setScale(5.f); //sets the object scale in float
sprite->setPosition(Vec2(200,200)); //sets sprite position
scene->addChild(sprite,1); //adds sprite to scene, z-index: 1

上記コードでは .c3bファイルから Sprite3D オブジェクトを作成して位置を設定しています。例:

それでは、このモデルを延々と回転させてみましょう。そのためにはアクションを作成して実行します:

//rotate around the X axis
auto rotation = RotateBy::create(15, Vec3(0, 360, 0));
//our sprite object runs the action
sprite->runAction(RepeatForever::create(rotation));

SpriteSprite3Dにアンカーポイントを設定するには、以下を使用します:

sprite->setAnchorPoint(Point(0.0f,0.0f));


3D モデルをSprite3D オブジェクトに取り付ける。

前述の、 3Dモデルは メッシュの集合体ということを思い出してください。 3D モデルを他の 3D モデルに取り付けて、より豪華なエフェクトを作成することができます。 例ではキャラクターに武器を追加しています。 これを行うためには、武器を追加するための付着点を見つける必要があります。 そのためには getAttachNode(attachment_point_name)関数を使用します。 そして addChild()を使って新しいモデルをその付着点に子として追加します。 これは複数の単純な3Dモデルを組み合わせてより複雑なモデルを作成していると考えることができます。 例えば、モデルをSprite3D オブジェクトへ追加するには以下のようにします:

auto sp = Sprite3D::create("axe.c3b");
sprite->getAttachNode("Bip001 R Hand")->addChild(sp);



3D モデルを取り替える

3D 開発を行っている時、使用しているモデルを動的に変更したいことがあるかもしれません。 パワーアップ、衣装変更、モデルの状態変化をユーザーに伝えるための視覚的な合図といった理由などがあるでしょう。 使用している3Dモデルが メッシュで構成されている場合、 getMeshByIndex()getMeshByName()を使って メッシュデータ にアクセスすることができます。 この機能を使えば、キャラクターの武器や衣装の切り替えといったエフェクトを実現することが可能です。 それではコードを着ている少女の例を見てみましょう:

使用しているメッシュオブジェクトの可視性を変更することで、少女が着ているコートを変更することができます。 以下の例で、この処理を行う方法を例示しています:

auto sprite = Sprite3D::create("ReskinGirl.c3b");

// display the first coat
auto girlTop0 = sprite->getMeshByName("Girl_UpperBody01");
girlTop0->setVisible(true);

auto girlTop1 = sprite->getMeshByName("Girl_UpperBody02");
girlTop1->setVisible(false);

// swap to the second coat
girlTop0->setVisible(false);
girlTop1->setVisible(true);

結果:



アニメーション

Sprite3D オブジェクトは私達のゲームにとって不可欠なものです! 私達はこれを操作する方法を学びました。 しかし、より豪華な体感が必要かもしれません。 アニメーションを取り入れましょう! 3Dアニメーションを実行するには、 Animation3D オブジェクトとAnimate3Dオブジェクトを使用します。 それからAnimation3D オブジェクトを使用してAnimate3Dアクションを作成します。 例:

// the animation is contained in the .c3b file
auto animation = Animation3D::create("orc.c3b");

// creates the Action with Animation object
auto animate = Animate3D::create(animation);

// runs the animation
sprite->runAction(RepeatForever::create(animate));

プログラマーガイドサンプルのコード例を実行して動きを見てください! 3D アニメーションは2Dアニメーションとほぼ同じコンセプトということを忘れないでください。 2Dアニメーションについてはこのガイドの第四章を参照してください。



複数のアニメーション

複数のアニメーションを同時に実行したい場合はどうすれば良いのでしょうか? アニメーションの開始時間アニメーションの長さ の引数を両方使用して、 複数のアニメーションを作成することができます。 それら引数の単位は秒になります。 例:

auto animation = Animation3D::create(fileName);

auto runAnimate = Animate3D::create(animation, 0, 2);
sprite->runAction(runAnimate);

auto attackAnimate = Animate3D::create(animation, 3, 5);
sprite->runAction(attackAnimate);

上記の例では実行されているアニメーションが二つあります。 一つ目のアニメーションは即座に開始されて2 秒間続きます。 二つ目のアニメーションは3 秒後に開始して5 秒間続きます。



アニメーション速度

アニメーションの速度 が正の値だと通常再生のアニメーションが行われ、速度が負の値だと逆再生のアニメーションが行われます。 速度に 10が設定された場合。 それはつまりアニメーションの長さが10秒だと考えることができます。



アニメーションのブレンド処理

複数のアニメーションを使用する場合、各アニメーションの間には自動的にブレンド処理が適用されます。 ブレンド処理の目的は、エフェクト間の遷移をスムーズにすることです。 AとB二つのアニメーションがあったとして、アニメーションAの最後の数フレームとアニメーションBの最初の数フレームを重ね合わせて、アニメーションの変化が自然に見えるようにします。

既定の遷移時間は 0.1 秒です。Animate3D::setTransitionTimeを使用して遷移時間を設定することができます。

Cocos2d-x でキーフレーム間の 線形補間のみをサポートしています。 これは線をスムーズに見せるために曲線上の隙間を埋める技術です。 モデルの作成で他の補間方法を使用する場合は、内蔵ツールの fbx-conv では追加のキーフレームを生成して補間を行います。 This compensation is completed in accordance with the target frame. fbx-conv の詳細情報については この章の最後のfbx-convについて説明した項目を参照してください。



Camera

Camera オブジェクトは3D開発において重要な役割を担っています。 3D世界は平坦ではないので、その世界を見て移動するためには Camera を使う必要があります。 Just like when you are watching a movie and the scene pans to the left or right. Camera オブジェクトを使用する時もこれと同じコンセプトが適用されます。 Camera オブジェクトはNodeを継承しており、従って同じAction オブジェクトのほとんどをサポートしています。 Camera オブジェクトには、 perspective cameraorthographic cameraの二つの種類があります。

perspective camera は遠近法を使ってオブジェクトを見るのに使用されます。 perspective cameraでの見え方は以下のようになります:

perspective cameraで見ると、近くにあるオブジェクトは大きく見えて 遠く にあるオブジェクトは小さく見えます。

The orthogonal camera is used to see objects as large distance. これは3D世界を2Dに変換する表現方法として考えることができます。 orthogonal cameraでの見え方は以下のようになります:

orthogonal cameraで見ると、オブジェクトが Cameraオブジェクトからどれだけ離れているかに関わらず同じサイズになります。 ゲーム内でのミニマップ は、一般的にはorthogonal cameraで描写されます。 もう一つの例は、見下ろし型視点のダンジョン型ゲームです。



カメラの使用

心配しないでください! Camera オブジェクトは複雑に聞こえるかもしれませんが、 Cocos2d-x を使えば簡単に操作できます。 3Dを使用する際に、何か特別なことをして Camera オブジェクトを作成する必要はありません。 Director オブジェクトのprojectionプロパティに基づき、各Scene は自動的に既定のカメラを作成します。 複数のカメラが必要な場合は、以下のコードを使ってカメラを作成することができます:

auto s = Director::getInstance()->getWinSize();
auto camera = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000);

// set parameters for camera
camera->setPosition3D(Vec3(0, 100, 100));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));

addChild(camera); //add camera to the scene


orthogonal cameraの作成

既定のCameraperspective cameraです。 orthogonal cameraを作成したい場合は、以下を実行することで簡単にできます:

Camera::createOrthographic();

例:

auto s = Director::getInstance()->getWinSize();
auto camera = Camera::createOrthographic(s.width, s.height, 1, 1000);


カメラからオブジェクトを隠す

場合によっては、オブジェクトの一部を Cameraの視界から見えなくしたいこともあるでしょう。 カメラからオブジェクトを隠すのはとても簡単です。 NodesetCameraMask(CameraFlag) 関数とCamerasetCameraFlag(CameraFlag) 関数を使用します。例:

//Camera
camera->setCameraFlag(CameraFlag::USER1);

//Node
node->setCameraMask(CameraFlag::USER1);


キューブマップテクスチャ

キューブマップテクスチャ とは、架空のキューブの各面上に配置する六つ正方形のテクスチャの集合体です。 ほとんどの場合、キューブマップテクスチャはオブジェクト上で無限に続く画像を表示するのに私用されます。 sky boxがバックグラウンドに無限に続く風景を表示する方法と似ています。 これは以下のように展開したキューブのようなものです:

Cocos2d-xでは、以下のようにして キューブマップテクスチャ を作成することができます:

// create a textureCube object with six texture assets
auto _textureCube = TextureCube::create("skybox/left.jpg",  "skybox/right.jpg",
"skybox/top.jpg", "skybox/bottom.jpg", "skybox/front.jpg","skybox/back.jpg");

// set cube map texture parameters
Texture2D::TexParams tRepeatParams;
tRepeatParams.magFilter = GL_NEAREST;
tRepeatParams.minFilter = GL_NEAREST;
tRepeatParams.wrapS = GL_MIRRORED_REPEAT;
tRepeatParams.wrapT = GL_MIRRORED_REPEAT;
_textureCube->setTexParameters(tRepeatParams);

// create and set our custom shader
auto shader = GLProgram::createWithFilenames("cube_map.vert","cube_map.frag");
auto _state = GLProgramState::create(shader);

// bind cube map texture to uniform
_state->setUniformTexture("u_cubeTex", _textureCube);


Skybox

Skybox is a wrapper around your entire scene that shows what the world looks like beyond your geometry.Skyboxを使えば、無限に広がる空や山やその他現象を再現することができます。

以下で Skyboxを作成します:

// create a Skybox object
auto box = Skybox::create();

// set textureCube for Skybox
box->setTexture(_textureCube);

// attached to scene
_scene->addChild(box);


光源

光源はゲームの雰囲気や気分を出すために非常に重要です。 現時点では四つの光源技術をサポートしています。 必要に応じて異なる光源技術を使用します。 各光源エフェクトではそれぞれ異なる結果が得られます。



全方向性照明

AmbientLightオブジェクトは、シーン内にある全ての物に均等に光を当てます。 オフィス環境の照明で考えてみてください。 照明は頭上にあり、オフィス内にあるものを見た時にすべて同じ光の当たり具合になります。 例:

auto light = AmbientLight::create (Color3B::RED);
addChild(light);

上記コードは以下のようになります:



指向性照明

DirectionalLight は大抵の場合、太陽のような光源を再現するのに使用されます。 DirectionalLight を使用する時、光源との距離に関わらず光の密度は変わらないということを覚えておいてください。 晴れた日の室外で太陽光があなたに降り注ぐ状況を想像してみてください。 太陽を直接見上げた時、あなたがどこかに数歩移動しても太陽の強い光量は変わらないですよね。 例:

auto light = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B::RED);
addChild(light);

上記コードは以下のようになります:



点照明

PointLight は大抵の場合、電球やランプや松明を再現するのに使用されます。 The direction of a PointLight is from the lighted position to the PointLight. PointLightからの距離に応じて光の密度が変わるということを覚えておいて下さい。 これはどういう意味でしょうか? あなたがPointLightの開始点に近づくと、光量が強くなります。 PointLight の終点へ行くと、薄暗くなります。 また、投影させる距離が長くなるとPointLight の光量は弱くなります。例:

auto light = PointLight::create(Vec3(0.0f, 0.0f, 0.0f), Color3B::RED, 10000.0f);
addChild(light);

上記コードは以下のようになります:



スポット照明

SpotLight オブジェクトは大抵の場合、懐中電灯を再現するのに使用されます。 これはつまり、光が円錐の形状で一つの方向のみに放出されるということです。 あなたの家が停電になった時のことを考えてみてください。 ブレーカーを入れ直すために懐中電灯を持って地下室へ行く必要があるかもしれません。 懐中電灯は円錐型の光を放ち、あなたはその円錐状の中にあるものだけを見ることができます。 もう一つの例は、真っ暗な中で松明によって道を照らす、ダンジョン型のゲームです。 あなたは松明が照らした円錐状の範囲のみを見ることができます。 例:

auto spotLight = SpotLight::create(Vec3(-1.0f, -1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f),
Color3B::RED, 0.0, 0.5, 10000.0f) ;
addChild(spotLight);

上記コードは以下のようになります:



Light Masking

キッチンやリビングでは照明に何を使用していますか? おそらく、いくつかのランプでしょうか? 部屋の特定の位置を照らすのにはランプのみを使用していることに気づいていますか? あなたは気づかないうちに lighting maskを使用しているのです!

lighting maskNodeに特定の光源のみを適用するために使用されます。 例えば、Sceneに複数の照明がある場合、全ての照明ではなくその中のうちの一つのみでNodeを照らすことができます。 setLightFlag(LightFlag)を使って、 Nodeオブジェクトにどの照明を当てるのかを制御することができます。 全ての光源はシングルパスで描写されるということは重要なので、注意してください。 携帯プラットフォームのパフォーマンスの問題により、複数の光源を使用することはお勧めしません。 光源の既定最大数は1です。複数の光源を使用したい場合は、info.plistファイルに以下のキーを定義する必要があります。:

<key> cocos2d.x.3d.max_dir_light_in_shader </key>
<integer> 1 </integer>
<key> cocos2d.x.3d.max_point_light_in_shader </key>
<integer> 1 </integer>
<key> cocos2d.x.3d.max_spot_light_in_shader </key>
<integer> 1 </integer>


Terrain

Terrain は3D ゲームにおいて重要なコンポーネントです。 テクスチャを使ってハイトマップを表現します。 さらに最大四つのテクスチャを使って地形、草、道路、などを合成することができます。



HeightMap

HeightMap オブジェクトは terrainの中核となるものです。 一般的な画像と違い、ハイトマップは頂点の高さを表現します。 これにより地形のジオメトリ形状が決定されます。



DetailMap

DetailMapオブジェクトは地形の詳細を決定するためのテクスチャ一覧で、最大四つのテクスチャを使用できます。



AlphaMap

AlphaMap オブジェクトは、 detail mapsのブレンド量データを持つ画像です。 このブレンドの結果が、最終的な地形の外観になります。



LOD ポリシー

Terrain では、Level Of Detail もしくはLODと呼ばれる最適化技術を使用しています。 これは、オブジェクトがカメラから離れるにつれて描写される 頂点 (もしくは三角形)の数を減らすという描写技術です。 ユーザーはTerrain::setLODDistance(float lod1, float lod2, float lod3) メソッドを呼び出すことでCameraとの距離を設定できます。

Terrain オブジェクトの隣に異なるLODを持つものがあるとcrack artifactsを引き起こす可能性があります。 それらを避けるために、Terrain には二つの機能が用意されています。:

Terrain::CrackFixedType::SKIRT

Terrain::CrackFixedType::INCREASE_LOWER

Terrain::CrackFixedType::SKIRT は対象物の各へり部分に四つのskirt-like メッシュを作成します。

Terrain::CrackFixedType::INCREASE_LOWER は対象物を継ぎ目なく接続できるように、各対象物のインデックス を動的に調整します。



地形を作成する方法

Terrain の作成にはいくつかの手順が必要です。例:

以下のコードでは、プレイヤーを作成してそれを地形上に配置しています。:

auto player = Sprite3D::create("chapter9/orc.c3b");
player->setScale(0.08);
player->setPositionY(terrain->getHeight(player->getPositionX(),player->getPositionZ()));

  • 全てのDetailMap オブジェクト(最大四つまで)を作成します。DetailMapオブジェクトはTerrain::DetailMap 構造体に引数として渡す必要があります:
  Terrain::DetailMap r("dirt.dds");
  Terrain::DetailMap g("grass.dds");
  Terrain::DetailMap b("road.dds");
  Terrain::DetailMap a("greenSkin.jpg");
  • detail maps,を使って TerrainData 変数を作成するには、地形で使う height map ファイルのパスと alpha map ファイルのパスを設定する必要があります。:
Terrain::TerrainData data("chapter9/heightmap16.jpg","TerrainTest/alphamap.png", r, g, b, a);
  • Terrain::createTerrainDataオブジェクトを引数として渡します。最後の引数で LOD ポリシー(上記で説明したように)が決まります 。例:
_terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);
  • If you set a Terrain objects camera mask and add it to a Node or a Scene, be careful. When Terrain is added into a Node or a Scene, you can not use transform(translate, scale) on it anymore. If you do this after calling addChild(), some of the terrain's methods may calculate wrong results.


地形の高さを取得する

Terrain::getHeight(float x, float z, Vec3 * normal= nullptr)メソッドを使用して指定して位置の高さを取得します。 このメソッドはSprite3Dオブジェクトや任意のNodeを地表に配置したい時に便利です。



Ray-Terrain intersection test

A Ray-Terrain intersection test will calculate the intersection point by giving a specified position.

Terrain::CrackFixedType::SKIRT will generate four skirt-like meshes at each chunks edge.

Terrain::CrackFixedType::INCREASE_LOWER will dynamically adjust each chunks index to seamlessly connect them.



3D ソフトウェアパッケージ



3D エディター

3D エディターとは3D画像を作成するのに使用するツール集です。 商用ツールと無料ツールの両方があります。以下が最も人気のあるエディターです:

通常ほとんどの 3D エディターは、ゲームエンジンがインポートして使用できるファイル形式だけでなく、他のエディターでも簡単に使用できる共通のファイル形式でもファイルを保存します。



Cocos2d-x が提供するツール

Cocos2d-x では3DモデルをCocos2d-xが使用する形式に変換するのを手助けするツールを用意しています。 これを使うことで、3Dファイルのあらゆる部分に触れることができるようになります。



fbx-conv コマンドラインツール

fbx-conv を使用することで、 FBX ファイルを Cocos2d-x 独自のファイル形式に変換することができます。 FBX は最も人気のある3D ファイル形式で、メジャーなエディター全てでサポートされています。 既定ではfbx-conv.c3b形式のファイルを出力します。 いくつかのパラメータを設定するだけなので使用は簡単です。:

fbx-conv [-a|-b|-t] FBXFile

The possible switches are:

  • -?: ヘルプを表示
  • -a: テキスト形式とバイナリ形式の両方で出力
  • -b: バイナリ形式で出力
  • -t: テキスト形式で出力

例:

fbx-conv -a boss.FBX

fbx-convについて注意すべきことがいくつかあります: モデルは、少なくとも一つのテクスチャを内包したマテリアルを持つ必要があります。 モデルはスケルトンアニメーションのみをサポートしています。 モデルは一つの skeleton オブジェクトのみサポートしており、複数 skeleton はサポートしていません。 複数の静的モデルをエクスポートすることで3D Sceneを作成できます。 * 頂点やメッシュインデックスの最大量は 32767です。



3D ファイル形式

Cocos2d-x は現時点では二つの 3D ファイル形式をサポートしています:

  • Wavefront Object ファイル: .obj ファイル。
  • Cocos2d-x 3d ad-hoc 形式:.c3t, .c3b ファイル。

3Dエディターで広く採用されており、解析も非常に簡単なため、Wavefront ファイル形式はサポートされています。 しかしこれには制限があり、アニメーションのような高度な機能はサポートしていません。

一方 c3tc3b は Cocos2d-x 独自のファイル形式で、アニメーション・マテリアル・その他高度な3D機能を使用するために作成されました。 c3tの語尾 tテキストを意味し、c3bの語尾 bバイナリを意味します。 c3bの方がより効率的なため、開発者は製品版では c3bを使用するようにしてください。 ファイルのデバッグや、Git やその他バージョン管理システムでの変更点を追跡をしたい場合は、代わりにc3t を使用してください。 また、objファイルをアニメーションさせることはできないので、Animation3Dオブジェクトの作成にはstrong>c3bファイルやc3tファイルを使用します。



Advanced Topics



BillBoard

あなたはこれまでにBillBoard について聞いたことがないかもしれません。 違います、高速道路の横にある看板広告のことではありません。 そうではなく、 Billboard とは常にCameraの方を向いている特殊な Spriteのことです。 Cameraを回転させるように、 Billboard オブジェクトも回転します。 BillBoardの使用は、非常に一般的な描写技術です。 ダウンヒルのスキーゲームを例にとってみましょう。 スキーのコース上にある木や岩やその他オブジェクトはBillboardオブジェクトです。

以下が、 Cameraオブジェクトと Billboard オブジェクトがどのような関係性なのかを表したものになります。

Billboard オブジェクトは簡単に作成できます。 BillBoardSpriteを継承しているので、 Spriteオブジェクトとしての機能をほとんどサポートしています。 以下のcreate メソッドを使ってBillboardを作成できます:

auto billboard = BillBoard::create("Blue_Front1.png", BillBoard::Mode::VIEW_POINT_ORIENTED);

BillBoard オブジェクトのモードを変更することで、 XOY 平面(床面のような)のカメラ 向けのBillboard オブジェクトを作成することもできます。:

auto billboard = BillBoard::create("Blue_Front1.png", BillBoard::Mode::VIEW_PLANE_ORIENTED);

追加でBillBoard::Mode引数を渡しているため、これらのcreate メソッドはこれまでと少し違って見えます。 BillBoard::Mode には、VIEW_POINT_ORIENTEDVIEW_PLANE_ORIENTED二つの種類があります。

VIEW_POINT_ORIENTED is where the BillBoard object is oriented to the Camera. 例:

VIEW_PLANE_ORIENTED is where the BillBoard is oriented towards the XOY plane of the Camera. 例:

他の Nodeと同じ様に、BillBoardにもプロパティを設定することができます。 scale, position, rotationなど設定でき、これ以外にも色々あります。 例:

billboard->setScale(0.5f);
billboard->setPosition3D(Vec3(0.0f, 0.0f, 0.0f));
billboard->setBlendFunc(BlendFunc::ALPHA_NON_PREMULTIPLIED);
addChild(billboard);


ParticleSystem3D

第七章では、 2D パーティクルエフェクトとその使用方法について学びました。 3Dを使用する時には、より豪華で高度なエフェクトを使うために 3Dのパーティクルシステムを使いたいのではないでしょうか。 2Dパーティクルシステムで使われたコンセプトの多くは、3Dパーティクルシステムにも適用できます。 現在Cocos2d-x では、パーティクルシステムの構築用に Particle Universe (http://www.fxpression.com/)をサポートしています。 Particle Universeでは、爆発や炎や流血やその他特別なエフェクトといった、様々なエフェクトを素早く簡単に設定できる特別なパーティクルエディターが用意されています。 このエディターでは、ファイルの保存や出力の際にpu ファイル拡張子を使用しています。

作成したパーティクルの出来に満足してそれをコード上で使用する準備ができたら、pu形式に出力すれば大丈夫です! Cocos2d-x はこのファイル形式を直接サポートしています。 また、 ParticleSystem3DNodeを継承しているので、Node がサポートしている機能のほとんどをサポートしています。 PUParticleSystem3DParticle Universe パーティクルを扱うための特別なタイプのオブジェクトです。 PUParticleSystem3Dでは、パーティクルを作成するための方法を二通り用意しています。

一つ目は Particle Universe ファイルとそれに対応する material fileを引数として渡してパーティクルを構築するの方法です。 第七章で、material file はパーティクルを記述するものとあったのを思い出してください。 この引数は必ず設定しなれければならないものです。例:

auto ps = PUParticleSystem3D::create("lineStreak.pu", "pu_mediapack_01.material");
ps->startParticleSystem();
this->addChild(ps);

二つ目は、particle universeファイルのみを引数として渡してパーティクルを構築するの方法です。 この方法でパーティクルを作成する場合、 besides loading the particle, all material files in the same folder as the particle file will automatically be loaded. 以下が例になります:

auto ps = PUParticleSystem3D::create("electricBeamSystem.pu");
ps->startParticleSystem();

this->addChild(ps);

注意: 全てのものを読み込むことになるため、この方法を使用すると読み込み時間が増えてメモリも多く消費します。 使用したい materialが何なのか分かっていて全てのファイルを読み込む必要がない場合、一つ目の方法を使うことを推奨します。

以下の画像にて、左の画像は particle universeの画面上のパーティクルで、一方右の画像はそれをCocos2d-x上で実行したエフェクトです。:

Once you have your particle, you can interact with it it fairly obvious ways. You can interact with with the particle system as a whole, starting, stopping, pausing, resuming and obtaining the total number of particles:

virtual void startParticleSystem() override;
virtual void stopParticleSystem() override;
virtual void pauseParticleSystem() override;
virtual void resumeParticleSystem() override;
virtual int getAliveParticleCount() const override;

PUParticleSystem3DNode を継承しているので、パーティクル上で Actionオブジェクトと Sequenceオブジェクトを実行できます! 例:

auto ps = PUParticleSystem3D::create("blackHole.pu", "pu_mediapack_01.material");
ps->setPosition(-25.0f, 0.0f);

auto moveby = MoveBy::create(2.0f, Vec2(50.0f, 0.0f));
auto moveby1 = MoveBy::create(2.0f, Vec2(-50.0f, 0.0f));

ps->runAction(RepeatForever::create(Sequence::create(moveby, moveby1, nullptr)));
ps->startParticleSystem();

Actionオブジェクトと Sequenceオブジェクトを組み合わせることで、面白いブラックホールのエフェクトを作成しました:

他の3D オブジェクトと同様に、AttachNodeを使って3Dオブジェクトを組み合わせることも出来ます。 これを使うことでより豪華なモデルを作成できます。例:

auto sprite3d = Sprite3D::create("orc.c3b");
sprite3d->setPosition3D(Vec3(0.0f, 0.0f, 0.0f));
sprite3d->setRotation3D(Vec3(0.0f, 180.0f, 0.0f));

auto animation = Animation3D::create("orc.c3b");
if (animation)
{
    auto animate = Animate3D::create(animation);
    sprite3d->runAction(RepeatForever::create(animate));
}

auto handler = PUParticleSystem3D::create("lightningBolt.pu");
handler->startParticleSystem();
sprite3d->getAttachNode("Bip001 L Hand")->addChild(handler);

this->addChild(sprite3d);