2015年

1月

18日

SpriteBuilder タッチを検知する (Objective-C Swift C++)

 

 

 

 iPhone・AndroidアプリをObjective-C言語で作る

SpriteBuilder タッチを検知する (Objective-C Swift)

タッチ処理について、チャレンジしてみたいと思います。

 

Cocos2d 3.0:簡単な移行ガイド

Cocos2d 3.xの内のCCNode、タッチ入力を処理することができます。CCNodeは新しいCCLayerです


今回は、SpriteBuilderの画面レイアウトは使いません。
全てCocos2dでのソースコード記述になります。
今までと同じようにSpriteBuilderを起動し新規プロジェクトを作成します。

Publishing」のボタンをクリックしてそのまま「Seve All」をクリックしてください。後はXcodの記述のみです。


Objective-C 言語

MainScene.mを次のように変更してみてください。

#import "MainScene.h"


@implementation MainScene


// viewDidLoadと同じ立ち上げ時に起動動作

-(void) didLoadFromCCB

{

    // タッチイベントを有効にする。

    self.userInteractionEnabled = TRUE;

    

}


// 画面に指を一本以上タッチしたときに実行されるメソッド

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event

{

    NSLog(@"Touch");

}


// 画面に触れている指が一本以上移動したときに実行されるメソッド

- (void)touchMoved:(UITouch *)touch withEvent:(UIEvent *)event

{

    NSLog(@"TouchMoved");

}


// 指を一本以上画面から離したときに実行されるメソッド

- (void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event

{

    NSLog(@"TouchEnded");

}


// システムイベントがタッチイベントをキャンセルしたときに実行されるメソッド

- (void)touchCancelled:(UITouch *)touch withEvent:(UIEvent *)event

{

    NSLog(@"TouchCancelled");


}


@end

 

GitHub Touch01_Objective-C


Swift 言語

MainScene.swiftを次のように変更してみてください。

import Foundation


// CCNodeを継承すれば、タッチ処理が実装できる

// CCResponderインターフェースを継承しており、タッチ処理のメソッドが定義されている

class MainScene: CCNode {

    

    override func onEnter() {

        

        // タッチ処理を検出するには、userInteractionEnabledプロパティをtrueに設定

        self.userInteractionEnabled = true

        

        super.onEnter()

        

    }

    

    // 画面に指を一本以上タッチしたときに実行されるメソッド

    override func touchBegan(touch: CCTouch!, withEvent event: CCTouchEvent!) {

        println("touch!!")

    }

    

    // 画面に触れている指が一本以上移動したときに実行されるメソッド

    override func touchMoved(touch: CCTouch!, withEvent event: CCTouchEvent!) {

        println("touchMoved!")

        

    }

    

    // 指を一本以上画面から離したときに実行されるメソッド

    override func touchEnded(touch: CCTouch!, withEvent event: CCTouchEvent!) {

        println("touchEnded!")

    }

    

    // システムイベントがタッチイベントをキャンセルしたときに実行されるメソッド

    override func touchCancelled(touch: CCTouch!, withEvent event: CCTouchEvent!) {

        println("touchCancel!")

    }

}

 

GitHub Touch01_Swift

 

ビルド&実行後、画面をタップ(クリック)することでコンソールにログとしてtouchxxxxx!!という文字列が出力されます。

Cocos2dx 3.x C++言語

TopTouchScene.hを次のように変更してみてください。

#ifndef __Touch__TopTouchScene__

#define __Touch__TopTouchScene__


#include <cocos2d.h>


// 名前空間 #define USING_NS_CC using namespace cocos2d

USING_NS_CC;


class TopTouchScene : public Layer

{

    

public:

    

    // 初期化のメソッド

    virtual bool init();

    

    

    static cocos2d::Scene* createScene();

    

    //タッチイベント用メソッドの宣言

    //TouchBegan()関数->タッチ開始

    bool onTouchBegan(Touch* pTouch, Event* pEvent);

    

    //TouchMoved()関数->タッチ中

    void onTouchMoved(Touch *pTouch, Event *pEvent);

    

    //TouchCancelled()関数->タッチキャンセル

    void onTouchCancelled(Touch *pTouch, Event *pEvent);

    

    //TouchEnded()関数->タッチ終了

    void onTouchEnded(Touch* pTouch, Event* pEvent);

    

    // create()を使えるようにしている。

    CREATE_FUNC(TopTouchScene);

};



#endif /* defined(__Touch__TopTouchScene__) */

 

※重要

public内にタッチイベント用にそれぞれメソッドの宣言をする必要があります。


public:

    //タッチイベント用メソッドの宣言

    //TouchBegan()関数->タッチ開始

    bool onTouchBegan(Touch* pTouch, Event* pEvent);

    

    //TouchMoved()関数->タッチ中

    void onTouchMoved(Touch *pTouch, Event *pEvent);

    

    //TouchCancelled()関数->タッチキャンセル

    void onTouchCancelled(Touch *pTouch, Event *pEvent);

    

    //TouchEnded()関数->タッチ終了

    void onTouchEnded(Touch* pTouch, Event* pEvent);


TopTouchScene.cppを次のように変更してみてください。

#include "TopTouchScene.h"

//音をならすためにinclude

#include "SimpleAudioEngine.h"


// 名前空間 #define USING_NS_CC using namespace cocos2d

USING_NS_CC;


Scene* TopTouchScene::createScene()

{

    // 「シーン」は自動解放オブジェクトです

    auto scene = Scene::create();

    

    // 「レイアウト」は自動解放オブジェクトです

    auto layer = TopTouchScene::create();

    

    // シーンに子としてレイヤーを追加

    scene->addChild(layer);

    

    // シーンを返す

    return scene;

}



// INIT」初期化

bool TopTouchScene::init()

{

    if ( !Layer::init() )

    {

        return false;

    }

    

    // 画面サイズを取得

    Size winSize = Director::getInstance()->getVisibleSize();

    

    // バックグランドカラー

    auto background = LayerColor::create(Color4B::BLUE,

                                         winSize.width,

                                         winSize.height);

    

    // ラベルを生成

    Label* label1 = Label::createWithSystemFont("Cocos2d-x", "Arial", 120);

    

    // ラベルの設置

    label1->setPosition(Point(winSize.width / 2 ,winSize.height / 2));

    

    // ラベルタイトルを追加

    this->addChild(label1,1);

    

    // バックグランドカラー 第2引数は表示順

    this->addChild(background, 0);

    

    // 3.x系 タップイベントを取得する

    // シングルタッチモード

    auto listener = EventListenerTouchOneByOne::create();

    listener->onTouchBegan = CC_CALLBACK_2(TopTouchScene::onTouchBegan, this);

    listener->onTouchMoved = CC_CALLBACK_2(TopTouchScene::onTouchMoved, this);

    listener->onTouchCancelled =

                         CC_CALLBACK_2(TopTouchScene::onTouchCancelled, this);

    listener->onTouchEnded = CC_CALLBACK_2(TopTouchScene::onTouchEnded, this);

    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority

                                                             (listener, this);

    

    return true;

}


//タッチ開始イベント

bool TopTouchScene::onTouchBegan(Touch *pTouch, Event *pEvent)

{

    CCLOG("タップ開始!");

    

    return true;

}


//タッチ移動イベント

void TopTouchScene::onTouchMoved(Touch *pTouch, Event *pEvent)

{

    CCLOG("タップ中");

}


//タッチキャンセルイベント

void TopTouchScene::onTouchCancelled(Touch *pTouch, Event *pEvent)

{

    CCLOG("タップキャンセル");

}


//タッチ終了イベント

void TopTouchScene::onTouchEnded(Touch *pTouch, Event *pEvent)

{

    CCLOG("タップ終了!");

}



GitHub Touch_Cocos2d-x

ビルド&実行後、画面をタップ(クリック)することでコンソールにログとしてタップxxxxx!という文字列が出力されます。

▫️私が参考にしている書籍