Cocos2d-xでSRPGの移動カーソルを表示する
はじめに
今回は、キャラをタップした時に表示される移動可能な範囲を表示します。
参考書籍
結構古い本ですが、C++の技術的には汎用的で勉強になります。 この本に実装されてるものをCocos2d-xで再現とかしても面白いかと思います。
「Chapter 3 RPG キャラクター移動」の辺りです。
書籍のサンプルURLが変わっていたので、一応こちらへ http://www.sbcr.jp/products/4797332611.html#supportDl
移動カーソル表示
表示するカーソルは、以下のようなただの白い四角い画像です。32x32の画像です。
ただそのままSpriteで生成するとノード数が多くて描画がきついことになるので、バッチノードを使いました。 MapIndexはただのtypedefでxとyを持ってるだけです。
void SRPGMapLayer::addMapCursor(MapDataType pMapDataType, std::list<MapIndex> moveMapPointList) { // バッチノードを登録しレイヤに追加 auto* pBatchNode = (SpriteBatchNode*) this->getChildByTag(SRPGMapLayer::kCursorBaseTag); if (!pBatchNode) { // 白い32x32の四角い画像を使う pBatchNode = SpriteBatchNode::create("grid32.png"); this->addChild(pBatchNode, SRPGMapLayer::zCursorBaseIndex, SRPGMapLayer::kCursorBaseTag); } for (MapIndex mapIndex : moveMapPointList) { // 緑半透明50% auto* sprite = Sprite::createWithTexture(pBatchNode->getTexture()); sprite->setPosition(indexToPoint(mapIndex.x, mapIndex.y)); sprite->setColor(Color3B::GREEN); sprite->setOpacity(128); sprite->setZOrder(SRPGMapLayer::zCursorBaseIndex); // バッチノードに登録 pBatchNode->addChild(sprite); // 1.0秒でフェードイン、フェードアウトを繰り返すように設定 FadeTo* fadeIn = FadeTo::create(0.5f, 128); FadeTo* fadeOut = FadeTo::create(0.5f, 0); Sequence* sequence = Sequence::create(fadeOut, fadeIn, NULL); RepeatForever* repeat = RepeatForever::create(sequence); sprite->runAction(repeat); } }
思った以上にあっさり実装できました。 以前AndEngineでC++をJavaで書きなおして実装していたので、その時に理解が深まってたかもしれません。