1

私はいくつかの小さな CCLayer を持つフル キャンバス CCLayer を持っています - それらはボタンです。ボタンでタッチリスナーを有効にしました:

- (id)init {
  if ((self = [super init])) {
    [self setTouchEnabled:YES];
  }
  return self;
}

最初に、デフォルトのタッチ ハンドラを試しました。

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  NSLog(@"This is me: %d", self->button_id);
}

奇妙な結果は、何も呼び出されるべきではないクリーンエリアに触れたとしても、どこに触れても常にすべてのボタンタッチハンドラーをトリガーすることです。

私はドキュメントとブログを読んでいましたが、まっすぐな解決策のようには思えませんでした。以下を追加して、シングルタッチハンドラーも試しました。

- (void)onEnterTransitionDidFinish {
  [CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES];
}

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

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
  NSLog(@"This is me: %d", self->button_id);
}

この場合の唯一の違いは、トリガーされたリスナーが 1 つだけだったことです。常に、最後に定義したリスナーがトリガーされます。また、タッチが発生した場所に関係なく。

問題はイベントの委譲ではなく、CCLayer の境界にあるように思えます。これは私がサイズを設定する方法です:

self.contentSize = CGSizeMake(10.0f, 10.0f);

私が間違っていたアイデアはありますか?たぶん、私は本質的な何かを見逃しました。

ありがとうございました!

4

2 に答える 2

1

クリック可能なボタンが必要な場合はいつでも、 CCMenuを使用することを強くお勧めします。それらtouchEventsはあなたのために処理するので、callBack関数の定義についてのみ気にする必要があります。ここから始めるのに良いチュートリアルがあります.-

http://www.raywenderlich.com/414/cocos2d-buttons-tutorial-for-ios-how-to-create-buttons-in-cocos2d-simple-radio-and-toggle

于 2013-10-03T07:57:04.673 に答える
1

すべてのタッチが最終的に登録されたノードに到達するため、レイヤー階層に大きく依存します。

CCMenuしかし、これをいじる手間を省くために、 クラスとクラスを使用してボタンを簡単に実装できますCCMenuItem

例えば ​​:

 // Create a menu item with action method (when pressed) 
 CCMenuItemImage *buttonItem= [CCMenuItemImage itemFromNormalImage:@"button1.png"  selectedImage:@"button1.png" target:self selector:@selector(button1Pressed:)];

 // Create a menu with the menu item and add it to your canvas layer
 CCMenu *menu= [CCMenu menuWithItems:buttonItem, nil];
 [self addChild:menu];

これにより、小さなレイヤーはもう必要ありません。メニューをキャンバス レイヤーに追加するだけで、メニュー項目の位置が正しく配置されるように設定することを忘れないでください。

于 2013-10-03T07:57:56.657 に答える