【问题标题】:CCLayer UIGestureRecognizer and HUDCCLayer UIGestureRecognizer 和 HUD
【发布时间】:2012-11-16 02:22:01
【问题描述】:

各位 cocos2d 游戏开发者,我有一个简单的问题

我正在实现一个 CCScene,上面有两个 CCLayer,一个是游戏,另一个是 HUD,如下所示:

+ (CCScene *)scene {
    CCScene *scene = [CCScene node];
    LevelLayer *layer = [LevelLayer node];
    LevelHUDLayer *hud = [LevelHUDLayer node];
    layer = [layer init];

    [layer setHUDLayer:hud];
    [hud setParentLevel:layer];

    [scene addChild:hud z:HUD_ZLevel];
    [scene addChild:layer];

    return scene;
}

而且效果很好。我也有一个 UIPinchGestureRecognizer,我是这样实现的:

- (void)onEnterTransitionDidFinish {
    pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(makePinch:)];
    [[CCDirector sharedDirector].view addGestureRecognizer:pinch];
}

然后我稍后在代码中捕捉手势,如下所示:

self.scale = pinch.scale;

这完美无缺,除了我想确保只有游戏层拾取手势,而不是 HUDLayer。现在触摸 HUDLayer 的控件并试图在屏幕上移动角色会导致关卡缩放,这很烦人。

所以我的问题是如何仅分配 LevelLayer 来获取手势识别器?如果我可以访问 CCLayer 的 UIView,我认为这很容易做到,但似乎我只能访问 CCDirector.sharedDirector.view

提前谢谢!

【问题讨论】:

    标签: cocos2d-iphone zooming hud


    【解决方案1】:

    您无法访问 CCLayer 的视图,原因很简单:它不存在。所有 cocos2d 逻辑都在单个 openGL 视图中完成。

    要限制手势识别器的区域,您可以实现委托方法gestureRecognizerShouldBegin:。在那里你可以检查触摸的位置并返回NO,如果它们在你的HUD上,而不是在游戏层上。

    另一种方法是使用 cocos2d 的 CCTouchDispatcher 实现自己的手势识别器。

    【讨论】:

    • 感谢您的输入,我现在正在尝试使用gestureRecognizerShouldBegin 方式,但我想知道如何检查子图层是否已收到输入。这很重要,因为 HUD 控件具有允许触摸传播的透明部分
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多