cocos2d-xでカウンター(カウントアップ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kimura
記事: 4
登録日時: 11年前

cocos2d-xでカウンター(カウントアップ)

#1

投稿記事 by kimura » 11年前

[1] 質問文
 cocos2d-x でカウンターを表示し、ボタンをタップするとカウンターの数字が1つずつ増えていくようにしたいのです。
 カウンターを表示(000)させ、ボタンをタップしてLogでタップされたことを確認するところまではできています。

[2] 今何がわからないのか、知りたいのか
 GameScene.hに int m_count; を記述して、GameScene.cppに以下のように記述しています。

コード:


bool GameScene::init()
{
    if(!CCLayer::init())
    {
        return false;
    }
    
    
    //カウンターを表示する
    showCounterLabel();


    // ボタンを表示する
    CCMenuItemImage *pBtnItem = CCMenuItemImage::create("xxx_1.png", "xxx_2.png", this, menu_selector(GameScene::myCallback));
    
    CCMenu* pBtn = CCMenu::create(pBtnItem, NULL);
    
    pBtn->setPosition(ccp(size.width * 0.40, size.height * 0.05));
    this->addChild(pBtn);
    
    return true;
}


    //カウンターを表示する
    void GameScene::showCounterLabel()
{

    CCSize size = CCDirector::sharedDirector()->getWinSize();
    

    CCString* levelString = CCString::createWithFormat("Count %03d", m_count);
    CCLabelTTF* pCount = CCLabelTTF::create(levelString->getCString(), "", 35.0);
    pCount->setPosition(ccp(size.width * 0.5, size.height * 0.23));
    pCount->setColor(ccc3(102,0,255));
    this->addChild(pCount);
    
}


   void GameScene::myCallback(CCObject* pSender)
{   
    CCLog("ボタンが押されました");
}

 

自分で調べたところカウンターの数字を増やしていくのはインクリメントとif文を使用するのではないかと
考えて以下のようにしてからその後がよくわかりません。
ボタンをタップしてカウンターの数字を増やすのだから上記の//カウンターを表示するコードは以下のコードの
中に記述するのでしょうか? 具体的にどのように記述すればいいでしょうか?

コード:

void GameScene::myCallback(CCObject* pSender)
{
     if(m_count < 999)
     {
       m_count++;
     }

  CCLog("ボタンが押されました");
}
  

まだ初心者で基本的な文法が理解できていないためだとは承知しているのですが、よろしくお願いいたします。


[2] 環境  
 OS : Mac osx 10.9.2
cocos2d-x : ver.2.2.2

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: cocos2d-xでカウンター(カウントアップ)

#2

投稿記事 by ISLe » 11年前

cocos2d-x は使ったことがなく、ネットで調べて想像で書いてます。

まず、ラベルテキストを変更するのにCCLabelTTFオブジェクトへのポインタが必要なので、showCounterLabelメンバ関数のpCount 一時変数をメンバ変数に変更してください。
もっと適切な名前に変更したほうが良いでしょう。

m_countを加算したあとに以下のコードを追加すればラベルのテキストが変化すると思います。

コード:

    CCString* levelString = CCString::createWithFormat("Count %03d", m_count);
    pCount->setString(levelString->getCString()); // メンバ変数に覚えておいたのを使う

kimura
記事: 4
登録日時: 11年前

Re: cocos2d-xでカウンター(カウントアップ)

#3

投稿記事 by kimura » 11年前

ISLeさん、教えてくださりありがとうございます。

「showCounterLabelメンバ関数のpCount 一時変数をメンバ変数に変更してください。」の一時変数→メンバ変数のところが
まだよく理解できてないかもしれませんが、以下のようにやってみました。

(GameScene.h)

コード:

#include "cocos2d.h"

class GameScene : public cocos2d::CCLayer
{
    
private:
    // メンバ変数
    int m_countLabel;

    int count;
};


(GameScene.cpp)

コード:

#include "GameScene.h"

using namespace cocos2d;
using namespace std;

CCScene* GameScene::scene()
{
    CCScene* scene = CCScene::create();
    GameScene* layer = GameScene::create();
    
    scene->addChild(layer);
    
    return scene;
}



bool GameScene::init()
{
    if(!CCLayer::init())
    {
        return false;
    }

    //カウンターを表示
    void GameScene::showCounterLabel()

 
    // ボタンの表示
    CCMenuItemImage *pBtnItem = CCMenuItemImage::create("xxx_1.png", "xxx_2.png", this, menu_selector(GameScene::myCallback));
    
    //メニューの作成 pBtnの中にpBtnItemを入れる
    CCMenu* pBtn = CCMenu::create(pBtnItem, NULL);
    
    //pBtnを配置
    pBtn->setPosition(ccp(size.width * 0.40, size.height * 0.05));
    this->addChild(pBtn);
    
    
    return true;
}


    // カウンターの表示
    CCString* levelString = CCString::createWithFormat("Count %03d", count);
    CCLabelTTF* m_countLabel = CCLabelTTF::create(levelString->getCString(), "", 35.0);
    m_countLabel->setPosition(ccp(size.width * 0.5, size.height * 0.23));
    m_countLabel->setColor(ccc3(102,0,255));

    this->addChild(m_countLabel);
    
}

    //ボタンがタップされた時の処理
void GameScene::myCallback(CCObject* pSender)
{
  
    if(0 < 999)
    {
        count++;
    }
    showCounterLabel();
    //CCString* levelString = CCString::createWithFormat("Count %03d", count);
    //m_countLabel->setString(levelString->getCString());
    
    
    CCLog("Count %03d", count);
    
    CCLog("ボタンが押されました");
}

上記の状態でLogはきちんとCount○○○と出ているのですが、カウンターラベルは000の上にカウントアップした数字が重なるように表示してしまいます。教えていただいたようにif文のところでcount++して(現在コメントアウトしている)次のコード

コード:

CCString* levelString = CCString::createWithFormat("Count %03d", count);
m_countLabel->setString(levelString->getCString());
を追加するとm_countLabel->setString(levelString->getCString());のところに
「Member reference type 'int' is not a pointer」というエラーが出ます。
m_countLabelはint型ではダメですよと言われているように思いますが、カウントする数字はint型なのでは?と考えてしまい、
ここで止まっています。間違っているのはint型のところでしょうか?それともメンバ変数の記述の仕方が間違っているのでしょうか?

もしわかるようでしたら、ひきつづきご指導いただけませんでしょうか
よろしくお願い致します。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: cocos2d-xでカウンター(カウントアップ)

#4

投稿記事 by ISLe » 11年前

コピペミスかシグネチャが消えてますが、showCounterLabelメンバ関数の中では、
CCLabelTTF* m_countLabel = ~
と宣言してますね。
これをメンバ変数にして欲しいのですが。

つまり
int m_countLabel;
ではなく
CCLabelTTF* m_countLabel;
です。

showCounterLabelメンバ関数の中は、
CCLabelTTF* m_countLabel = ~

m_countLabel = ~
に変更してください。

以上でコメントアウトしているコードのコンパイルエラーが解消するはずです。


showCounterLabelメンバ関数は、ラベルを生成しています。
呼び出すたびに新しいラベルが生成され追加されていきます。
数字が重なっているように見えるのはそのためです。

kimura
記事: 4
登録日時: 11年前

Re: cocos2d-xでカウンター(カウントアップ)

#5

投稿記事 by kimura » 11年前

ISLeさん、出来ました!

私のような初心者にも理解できるようにご丁寧に教えていただいて
本当にありがとうございました。

まだまだ基本文法からですがコツコツと一歩一歩学んでいきたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る