LoginSignup
6

More than 5 years have passed since last update.

cocos2d-x入門 -4-

Last updated at Posted at 2013-11-11

スプライトをタップしてみる

まずは駒を配置します。とりあえず、王将だけにしておきます。
makePiecesメソッドを実装します。
駒スプライトのTagに1を設定しておきます。

GameScene.h
class GameScene : public cocos2d::Layer
{
private:
    void makeBackground();
    void makePieces();
GameScene.cpp
bool GameScene::init()
{
    if (! CCLayer::init()) {
        return false;
    }
    // 背景を作成する.
    makeBackground();
    // 駒を配置する.
    makePieces();
    return true;
}

// 駒を配置する.
void GameScene::makePieces()
{
    Size winSize = Director::getInstance()->getWinSize();
    Sprite *spPiece = Sprite::create("sgl01.png");
    Size pieceSize = spPiece->getContentSize();
    spPiece->setPosition(Point(winSize.width * 0.5, winSize.height * 0.5 - 4 * pieceSize.height));
    spPiece->setTag(1);
    this->addChild(spPiece);
}

実行すると、王将が配置されています。

実行結果

さらに、タップして駒を動かすためにメンバ変数とイベントを受け取るメソッドを作成します。
タップ中の駒スプライトのTagを覚えておくmovePieceを追加しています。

GameScene.h
class GameScene : public cocos2d::Layer
{
private:
    int movePiece;

    void makeBackground();
    void makePieces();

public:
    static cocos2d::Scene *createScene();
    virtual bool init();
    CREATE_FUNC(GameScene);

    virtual bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    virtual void onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    virtual void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
};

タップしたときにイベントを受け取れるように、setTouchEnableとsetTouchModeメソッドで設定しています。
今回はシングルタップにしています。

GameScene.cpp
bool GameScene::init()
{
    if (! CCLayer::init()) {
        return false;
    }
    movePiece = 0;

    setTouchEnabled(true);
    setTouchMode(Touch::DispatchMode::ONE_BY_ONE);

    // 背景を作成する.
    makeBackground();
    // 駒を配置する.
    makePieces();
    return true;
}

あとは、各イベントに対応する処理を実装します。

GameScene.cpp
bool GameScene::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    Director *pDirector = Director::getInstance();
    Point touchPoint = pDirector->convertToGL(pTouch->getLocationInView());
    Node *pPiece = this->getChildByTag(1);
    if (! pPiece) {
        return false;
    }
    Rect pieceRect = pPiece->getBoundingBox();
    if (pieceRect.containsPoint(touchPoint)) {
        movePiece = 1;
        return true;
    }
    return false;
}

void GameScene::onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    if (movePiece == 0) {
        return;
    }
    Node *pPiece = this->getChildByTag(movePiece);
    if (! pPiece) {
        return;
    }
    Director *pDirector = Director::getInstance();
    Point touchPoint = pDirector->convertToGL(pTouch->getLocationInView());
    pPiece->setPosition(touchPoint);
}
void GameScene::onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent)
{
    movePiece = 0;
}

実行すると、このようにタップして駒を移動させることができます。

実行結果

今回はここまで。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6