きょこみのーと

技術に関係ないほうのブログ

Cocos2d-xでSRPGの移動カーソルを表示する

はじめに

今回は、キャラをタップした時に表示される移動可能な範囲を表示します。

参考書籍

結構古い本ですが、C++の技術的には汎用的で勉強になります。 この本に実装されてるものをCocos2d-xで再現とかしても面白いかと思います。

 「Chapter 3 RPG キャラクター移動」の辺りです。

書籍のサンプルURLが変わっていたので、一応こちらへ http://www.sbcr.jp/products/4797332611.html#supportDl

移動カーソル表示

表示するカーソルは、以下のようなただの白い四角い画像です。32x32の画像です。

f:id:kyokomi:20131006173250p:plain

ただそのまま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);
    }
}

f:id:kyokomi:20131006173252p:plain

思った以上にあっさり実装できました。 以前AndEngineでC++Javaで書きなおして実装していたので、その時に理解が深まってたかもしれません。