筋肉とエンジニアリングで すべてを解決するブログ

筋トレ、JavaScript、Ruby で世界を変えてやります。

C++ とか Cocos2d-x のコーディング

f:id:ma3tk:20150114002138j:plain

Cocos2d-x でよく使われる型/クラス 概要

C++ は Cocos2d-x v3.x から C++11 というバージョンが採用されました。

簡単に言えば、前のバージョンに比べて C++11 は便利ではやい!(略

C++ の基本的な型

auto

型を value から判断して自動でつけてくれます。便利。

体感でコードの7割くらい auto って書いて型宣言してそのまま "= 値;" って書く感じですね。頻度大。

auto param = 10;

ただ、明示したい時や宣言だけする場合は そのまま型を明示的に書きます。

int param;
param = 10;

void

bool

true / false が使えます。以上。

int

これも略。

float / double

意外にそこまで利用コストが大きくないので float / double にするか int にするかは後回しでいいと思います。

ただし、細かい数値計算が必要な場合はもちろん float / double 。

int への型変換とか注意。

細かいところは僕も調べきれてませんので略。

std::string

string を使うのはコストが比較的大きいのでなるべく使うのを避けられるように工夫した方がいいです。

僕の場合、php が長いので基本連想配列に文字列使って管理してたたけど、pair とか tuple とか使えばもっと綺麗にかっこよく早くかけます。

連想配列っぽくしたい時は、 enum で宣言した値使えば代用できたりするので、 enum を使う選択肢も考えてみるといいと思います。

その他 char 型との比較だとか c_str() の型変換もよく使います。

enum

列挙。

GenderType とかの指定を enum で持っておくとコード的にも綺麗になりますね。

std::map

連想配列ですね。std::map<int, Vec2> とかやるのに便利です。

key-value で管理できるので、value を識別して使いたい時に。

std::vector

1次元配列。 std::map とかやれば、Vec2 で辿りたい位置 の配列ができますね。

std::pair

2つの組。std::make_pair とかも合わせて知っておくといいと思います。

python とか触ったことあるとわかると思いますが、 PHP しかやってないと PHP には存在しない概念なので、理解が若干戸惑いますねw

std::pair と std::vector と std::map あたり組わせると…

std::map<std::pair<int, Vec2>, std::vector<Vec2>> moveData;

みたいにやると php で言う、

<?php
$array[$unit_type]["start_point"] = array("x" => 100, "y" => 180);

っぽい感じのデータ構造が実現できます。

std::tuple

複数の組。

3つ以上に使えるけどそんなに使うシーンがなかったかも。

pair と同じような形で使えるので、使いドコロがあれば是非使うといいと思います。

例えば、 (性別、年代、住んでる都市) みたいなデータで value を引っ張ってくる時に使えたりしそうですね。

cocos2dx のよく使う型

この記事が勉強になります

http://qiita.com/edo_m18/items/4a53eee51bbc95974770

Vector と Map

std::vector と cocos2d::Vector、 std::map と cocos2d::Map の違いは「 value に指定できる型が Ref を継承しているクラスのみ(つまり cocos2dx の型である Node とか Layer とか Sprite とか…)」になります。

Ref* 継承していない標準の pair とか int とか int や string 等であれば、 std::vector もしくは std::map を使ってください。

Vector

  • .pushBack()
  • .at()
  • .size()
  • .popBack()
  • .clear()

Map

  • .insert(K, V)
  • .erase(K)
  • .at(K)
  • .empty()
  • .size()
  • .begin()
  • .end()

Vec2

ドキュメント見るとわかるけど、Vec2 にはたくさんの便利関数が標準でついてます。

  • .distance(Vec2)
    • .getDistanceSq(Vec2) を使うと sqrt() で処理しない近似値的なもので測定できるのでよほど精度求めなければこちらを推奨します。
  • .add(Vec2)
  • .getAngle()

operator も使えるので Vec2(1, 10) + Vec2(10, 20) みたいなことも簡単にできますね!

Value

cocos のフレームワークでラッピングしてくれてる、汎用的な型ですね。

asString(), asInt(), asFloat()... 便利なメソッドたくさんあります。

Node

超基本の型ですね。

これはある程度舐めるようにメソッドの種類を見ておくといいかもです。

これに合わせて、 Ref クラスも見ておくといいと思います。

Sprite

Node との差分を確認しておくことが重要ですね。

setName, setTag, ... などから、画像の読み込み、自由変形などができるようになります。

Layer

これも Node や Sprite との差分を確認しておくといいと思います。

基本的に View として存在させ、インスタンスへの値のセットくらいに抑えておくとスッキリした設計になります。

CallFunc か FiniteTimeAction

アニメーション用。自分で動きを定義する関数ですね。コールバック関数自体を切り出すパターンにも使えます。

TMXTiledMap

Tiled Map Editor で作ったファイルを読み込む場合に使いました。

cocos では position と coodinate を相互に変換してくれるメソッド等が存在するので使いやすいです。

ui::Text

文字列を変える場合などに使いました。

Clonable

abstract クラスで基本的に継承して使います。

使い方がすこし他と違うので初めての場合難しいのですが、オブジェクトをコピーできるようにします。

例えば、何回もインスタンス生成するんじゃなくて、処理の回数減らしたいときとか使い回したい物があるときとかに役立ちます。

Animation とかは これを既に継承しているので、どちらかというと自前で作ったクラスに適用したいときだとかに非常に有益です。

v2.x にあった CCObject クラスではこのコピーするメソッドが入っていたのですが、 v3.x からの Node は継承してないので、注意。