Cocos2d-x 3.0でスプライトの生成、移動、削除、イベント


現状の最新版、cocos2d-x 3.0のrc1の基本操作と入門用サンプルです。
*新しくなったらまた編集します。

# 画面

画面の幅、原点取得

```cpp
// 画面の幅を取得
Size visibleSize = Director::getInstance()->getVisibleSize();

// 原点を取得
Point origin = Director::getInstance()->getVisibleOrigin();
```


# スプライト(画像)

スプライトの生成、追加、削除、変形

```cpp
// スプライトの作成
Sprite* sprite = Sprite::create("sprite.png");

// スプライトの位置を指定(この場合は画面の中央)
sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));

// 拡大、縮小
sprite->setScale(0.5f); // x, y
sprite->setScaleX(0.5f); // x
sprite->setScaleY(0.5f); // y
```

# アクション(移動)
アクションの作成、実行

```cpp
// アクションの作成
// 第一引数 アクションに要する時間
// 第二引数 目的の座標
MoveTo* move = MoveTo::create(10.0f, Point(100, 100));

// アクションの実行
sprite->runAction(move);
```

# イベント

イベントハンドリング
cppファイル（例：HelloWorld.cpp）

```cpp
// イベントリスナー作成
auto listener = EventListenerTouchOneByOne::create();

// イベントに対するメソッドの設定
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
listener->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled, this);

// ディスパッチャーに登録
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->addEventListenerWithSceneGraphPriority(listener, this);
```

hファイル（例：HelloWorld.h）

```cpp
bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchCancelled(cocos2d::Touch* touch, cocos2d::Event* event);
```

# コールバック(CallFunc)

コールバックの実行


```cpp
// callbackの定義
CallFunc* callback = CallFunc::create([](){
  printf("callback");
});
    
// callbackの実行
callback->execute(); // callback

```

# サンプル

画像をタップして動かし、離すと中央に戻りspriteが消去します。
デフォルトのプロジェクト「HelloWorld」のままです。
*あくまで簡単に見せるサンプルなので、複数回タップには対応していません。

[サンプル動画](https://www.youtube.com/watch?v=6VsmCphMJPY&feature=youtu.be)

hファイル（例：HelloWorld.h）

```cpp
bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
```

cppファイル（例：HelloWorld.cpp）

```cpp

bool HelloWorld::init()
{
    // 画面幅取得
    auto visibleSize = Director::getInstance()->getVisibleSize();

    // sprite
    auto sprite = Sprite::create("sprite.png");
    sprite->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
    sprite->setTag(1);

    // イベント
    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);

    auto dispatcher = Director::getInstance()->getEventDispatcher();
    dispatcher->addEventListenerWithSceneGraphPriority(listener, this);

    this->addChild(sprite);

    return true;
}

// タップした箇所に移動
bool HelloWorld::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
    auto location = touch->getLocation();
    auto sprite = this->getChildByTag(1);
    
    sprite->setPosition(location);
    
    return true;
}

// タップし続けている間、その箇所に移動
void HelloWorld::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event)
{
    auto location = touch->getLocation();
    auto sprite = this->getChildByTag(1);
    
    sprite->setPosition(location);
}

// タップを離したときに、スプライトを中央に移動し消去
void HelloWorld::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event)
{
    // 目的地へのアクションの生成
    auto visibleSize = Director::getInstance()->getVisibleSize();
    auto point = Point(visibleSize.width/2, visibleSize.height/2);
    auto move = MoveTo::create(2.0f, point);
    
    // spriteの取得
    auto sprite = this->getChildByTag(1);

    //callbackでの消去処理
    auto removeSprite = CallFunc::create([this, sprite](){
        this->removeChild(sprite);
    });
    
	// 順次実行 move ➡ removeSprite
    auto sequence = Sequence::create(move, removeSprite, NULL);
    sprite->runAction(sequence);
}
```

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。Cocos2d-x情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)