FC2ブログ

Entries

cocos2d タッチと入力を日本語訳の巻

iPhoneの2Dゲーム開発用ライブラリ cocos2d の基本コンセプトである入力とタッチを日本語訳しながら読んでいきます。

普通のタッチイベントとは違う Targeted なイベントというものがあるようです。

わざわざ定義してあるくらいだから、きっととても有効に使えるものなのだろうと期待して読み進めていきたいと思います。

----------------------------
<目次
基本コンセプト
cocos2d タッチと入力

cocos2d ではタッチイベントをハンドリングする方法として2つの異なる方法が提供されています。

それらの方法は、異なる2つのデリゲートの種類で定義されます。(この二つは CCTouchDelegateProtocol.h で定義されています。)

標準の(standard)タッチデリゲート

@protocol CCStandardTouchDelegate 
@optional
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
@end


これらのイベントは標準的な CocoaTouch アプリケーションのイベントと同じです。

すべてのイベントとすべてのタッチをハンドリングできます。マルチタッチな環境で、どのタッチを処理するのかはあなた次第です。

CCLayer のサブクラスでこれらのイベントを有効にするには、以下のように、isTouchEnabled に YES を設定するだけです。

    self.isTouchEnabled = YES;


目的の定められた(targeted)タッチデリゲート

@protocol CCTargetedTouchDelegate 
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
// touch updates:
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
@end


目的の定められた(targeted)これらのタッチイベントと標準的な(standard)タッチイベントには以下に記述する2つの重要な違いがあります。

1. これらのメソッドはシングルタッチのみを取り扱います。それで、このメソッドの名前は、ccTouches というふうに複数形で開始されず、ccTouch というふうに単数形で始まります。
2. ccTouchBegan メソッドは必須となっており、ブール値(boolean)を返却する必要があります。


ccTouchBegan は有効なタッチのそれぞれで、別々に呼び出されます。また、そのタッチに対して処理を行うことを示すために YES を返却する必要があります。

ccTouchBegan で 要求があった(YES を返却した)タッチのみ、その後の Moved や End や Cancelled イベントが呼び出されることとなります。(これら3つのイベントは必須ではありません。)

これらのイベントを受信するためにはグローバルディスパッチャを目的の定められた(targeted)デリゲートとして登録しなければなりません。

CCLayer のサブクラスで、registerWithTouchDispatcher を以下のとおりオーバーライドしてください。

-(void) registerWithTouchDispatcher
{
[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}


(CCTouchDispatcher.h をファイルの一番上でインポートする必要があります。)

どちらを使えばいいのか?

とても複雑な登録のことはさておき、目的の定められた(touched)デリケートの使用は通常の場合簡単です。NSSet を自身で分割したり、Moved/Ended/Cancelled イベントないでそのイベントでの処理が必要かどうかを確認し続けなくてよいからです。

ただし、ひとつのメソッド内で複数のタッチの処理を行いたい(例えば、画面のズームや回転での処理)のであれば、代わりに標準的な(standard)タッチデリゲートを使用したいと考えるでしょう。

メモ:一度に使用できるのはどちらかのデリゲートのみです。

マルチタッチ

マルチタッチイベントを受信するためには、イベントを有効にする必要があります。

AppDelegate の applicationDidFinishLaunching に以下のコードを追加することで、イベントを有効にできます。

   [glView setMultipleTouchEnabled:YES];


CCLayer 以外はのオブジェクトでのタッチの有効化

これまでで解説した isTouchEnabled と registerWithTouchDispatcher は、CCLayer とそのサブクラス(特に、CCMenu ははじめから有効化されています)のみで適用可能です。他のクラスに対して適用するためには、少しやらなければならないことがあります。

・有効化するクラスに CCStandardTouchDelegate または CCTargetedTouchDelegate かどちらかのプロトコルを実装しなければなりません。
・CCNode のサブクラスの場合は OnEnter メソッド内でタッチディスパッチャを登録し、OnExit メソッドでタッチディスパッチャを解除しなければなりません。(CCNode のサブクラスでない場合はそれに似た適切なタイミングで登録、解除を行います。)そのクラスがすでにシーン内で実行中でも、シーンの途中でタッチ入力の変更をする必要があるのであれば、すぐに登録、解除が可能です。

後者は、CCLayer では isTouchEnabled に相当するもので、以下のとおり手動で行わなければいけません。

CCStandardTouchDelegate では、

- (void)onEnter
{
[[[CCDirector sharedDirector] touchDispatcher] addStandardDelegate:self priority:0];
[super onEnter];
}


CCTargetedTouchDelegate では、

- (void)onEnter
{
[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
[super onEnter];
}


両方で、

- (void)onExit
{
[[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];
[super onExit];
}


既知の問題

ccTouch または ccTouches ハンドラ内で NSLog や CCLog を呼び出すことは、パフォーマンスの多大な低下の原因となります。

-----------------------------

一度に二つ以上のタッチを扱わないようなゲームだったら、targeted デリゲートを使えばいいということですね。

たしかに、通常はシングルタッチで十分のような気がします。

みやちかんたろうの大冒険でも、確かにプレイ中はシングルタッチのみですね。

だんだんと核心に迫ってきました。次は、基本動作に関して読み進めていきたいと思います。


スポンサード リンク

コメント

コメントの投稿

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://miyachikantaro.blog.fc2.com/tb.php/13-bc5ff67d
この記事にトラックバックする(FC2ブログユーザー)

Appendix

出演ゲーム

みやちかんたろうの大冒険

↑インストールはこちらから
予告編

21面デモ

ステージ作成

検索フォーム

訪問者

Apple製品紹介

Apple MacBook Air 1.6GHz 13.3インチ MB003J/A

中古価格
¥59,800から
(2013/1/24 06:45時点)

QRコード

QR

メールフォーム

名前:
メール:
件名:
本文:

Extra

プロフィール

みやちかんたろう

Author:みやちかんたろう
種別:きいろいねこ
年齢:10歳
性別:オス
趣味:昆虫採集
twitter:@gatsupport

※このサイトはリンクフリーです。ご自由にリンクしてください。相互リンクもじゃんじゃん募集中です!!

最新記事

最新コメント

最新トラックバック

月別アーカイブ