我一直在关注这个关于将 UIKit 与 CCLayer 集成的教程。基本上我想做的就是将手势识别器处理程序添加到我的层并根据这些触发我的游戏动作。
但是我确实有一个问题(这似乎不是新的),因为我添加到图层的 CCMenu 项目没有吸收点击/点击。
简而言之:我确实有一个层,我在其中集成了 Ray 建议的所有代码,它工作得很好,除了 CCMenu 不吸收点击。
我读了这篇文章,但我对修改 CCNode 并添加方法来验证触摸是否在空间等的想法并不满意。
我认为(对我而言)更简单的方法是如果触摸在 CCMenu 区域上方,则只需在 CCMenu 上进行触摸。
这是一个代码片段:
- (void)handleTap:(UITapGestureRecognizer *)tapRecognizer{
UIView * view = [[CCDirector sharedDirector] view];
CGPoint point = [self convertYTouch:[tapRecognizer locationInView:view] ];
if (CGRectContainsPoint([pauseMenu boundingBox], point)) {
[myMenu HowDoIPassTheTouchToTheMenu]
}
else{
//Handle single tap
}
}
关于如何将触摸传递给菜单的任何想法?
我尝试使用 TouchDispatcher 和优先级,但无法使其正常工作。
编辑:我写了这个方法,但似乎没有多大帮助
-(void) activateItemForTouch:(CGPoint)point
{
if( state_ != kCCMenuStateWaiting || !visible_ || ! enabled_)
return;
for( CCNode *c = self.parent; c != nil; c = c.parent )
if( c.visible == NO )
return;
CCLOG(@"in activate item for touch");
selectedItem_ = [self itemForTouchLocation:point];
[selectedItem_ selected];
[selectedItem_ unselected];
[selectedItem_ activate];
state_ = kCCMenuStateWaiting;
}
-(CCMenuItem *) itemForTouchLocation: (CGPoint) touchLocation
{
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
CCMenuItem* item;
CCARRAY_FOREACH(children_, item){
// ignore invisible and disabled items: issue #779, #866
if ( [item visible] && [item isEnabled] ) {
CGPoint local = [item convertToNodeSpace:touchLocation];
CGRect r = [item rect];
r.origin = CGPointZero;
if( CGRectContainsPoint( r, local ) )
return item;
}
}
return nil;
}
编辑二:
我还尝试实现 UIGestureRecognizerDelegate 协议,但即使我将gestureRecognizer 设置为FALSE,它也不会将手势/触摸传递给菜单。
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CCLOG(@"should receive");
return FALSE;
}