Nana Live+の進捗ですが、コレクション画面にとりかかっています。
実装しないといけないことは、

・一度も獲得したことのないアイテムはハテナマークにする
・獲得したことのあるアイテムは表示し、かつLVを付ける
・アイテムをタップすると詳細情報を表示する

機能的にはたったのこれだけです。
日曜日から着手はしていましたが、今日やっとまともに動かせるようになりました。

なぜかというと、、プログラムの話になってしまいますが、以前「SelectiveScrollを使ってみる」という記事を書きました。これをそのまま使えばもちろんすぐに完成していたのですが、しかし、SelectiveScrollにはスクロールに弱点があり、ものすごいスピードでスクロールさせると、ちゃんと戻ってくれないことがあります。

ですので、今回はSelectiveScrollは使わないことにし、CCTableViewを使ったりCCScrollViewを使ったりいろいろ試していたため、時間が大幅に食われてしまったというわけです。

最終的にCCScrollViewに落ち着きました。やはり、ここにも罠が仕掛けられておりスムーズに必要な機能を実装させてはくれませんでした。そうです、CCScrollViewの上に配置したCCMenuに触れてしまった場合は、スクロールしようとしても、これが働いてくれません。

どうやらイベントの優先度が違うようで、これを解決するための記事を書いている方がおられました。

iOS Coder Talk
tappli blog





現在の画面を貼っておきます

フレームワークの話になりますが、開発を開始する時期が少し早かったために、Nana Live+には最新のcocos2d-xのバージョンを使えていません。別のアプリには、cocos2d-x3.0台を利用しているのですが、バージョン2台から変更されているわかりにくい部分があったので紹介します。(Webで調べても出ないので、当たり前に知られている方法があるのかもしれないのですが。)


つまずいたのが「Component」を使う時です。
以前では、何か処理をさせたいNodeに対してComponentをくわせることで、そのNodeを貼り付けると同時にComponentのUpdate処理が動作していました。ところが、バージョン3.0ではNodeを貼り付けてもComponentのUpdate処理が自動的に動作しません。

ComponentContainer.cppの中身を見ると違いがありました。

bool ComponentContainer::add(Component *com)
{
    bool ret = false;
    CCASSERT(com != nullptr, "Argument must be non-nil");
    CCASSERT(com->getOwner() == nullptr, "Component already added...");
    do
    {
        if (_components == nullptr)
        {
            _components = new Map<std::string, component*="">();
        }
        Component *component = _components->at(com->getName());
        
        CCASSERT(component == nullptr, "Component already added...");
        CC_BREAK_IF(component);
        com->setOwner(_owner);
        _components->insert(com->getName(), com);
        com->onEnter();
        ret = true;
    } while(0);
    return ret;
}


bool CCComponentContainer::add(CCComponent *pCom)
{
    bool bRet = false;
    CCAssert(pCom != NULL, "Argument must be non-nil");
    CCAssert(pCom->getOwner() == NULL, "Component already added...");
    do
    {
        if (m_pComponents == NULL)
        {
            m_pComponents = CCDictionary::create();
            m_pComponents->retain();
            m_pOwner->scheduleUpdate();
        }
        CCComponent *pComponent = dynamic_cast<cccomponent*>(m_pComponents->objectForKey...
        
        CCAssert(pComponent == NULL, "Component already added...");
        CC_BREAK_IF(pComponent);
        pCom->setOwner(m_pOwner);
        m_pComponents->setObject(pCom, pCom->getName());
        pCom->onEnter();
        bRet = true;
    } while(0);
    return bRet;
}





「m_pOwner->scheduleUpdate();」がバージョン3.0にはありませんでした。
ですので、試しにスケジュールを追加してみるとバージョン2と同じような動作ができるようになりました。

bool ComponentContainer::add(Component *com)
{
    bool ret = false;
    CCASSERT(com != nullptr, "Argument must be non-nil");
    CCASSERT(com->getOwner() == nullptr, "Component already added...");
    do
    {
        if (_components == nullptr)
        {
            _components = new Map<std::string, component*="">();
            _owner->scheduleUpdate(); // 追加
        }
        Component *component = _components->at(com->getName());
        
        CCASSERT(component == nullptr, "Component already added...");
        CC_BREAK_IF(component);
        com->setOwner(_owner);
        _components->insert(com->getName(), com);
        com->onEnter();
        ret = true;
    } while(0);
    return ret;
}


前回の記事での不具合ですが、どうやら、Viewportの範囲外にあるボタンが押せてしまうがために発生するものらしいです。ですので、いちいちボタンが見えている位置にあるか計算しないと悪いということですね。ボタンをCell上に乗せるか迷いましたが、やっぱり面倒なのでやめました。


残ってる作業は山積みですが、今日は新たに追加した「ナネッ島」について紹介します。

こちらはいわゆる収穫ゲームとなっております。
ここは、時間が経過するとグッズが出現するという素晴らしい島です。
グッズの種類によって、出現する時間が異なるとか。
また、この島の通貨であるナナマネー(NM)のもらえる値も異なるらしいです。

この島で手に入れたグッズについては、コレクション画面にて確認することができます。
ぜひ、全部コンプリートしてみて下さい。