CCMenuItem独立于手势识别器查看cocos 2D

时间:2013-08-15 10:26:52

标签: objective-c cocos2d-iphone uigesturerecognizer cclayer

我有一个CClayer类,名为GridLayer我将手势识别器(平移,捏合和旋转)添加到视图中,它工作正常,但如果我添加{{1粘贴到视图中因此受旋转和捏合手势的影响,我的问题是谁从视图大小,比例和位置实现了独立的CCMenuItem

CCMenuitem

2 个答案:

答案 0 :(得分:0)

您的GUI控件需要存在于各自的独立层中。

要实现此目的,您应该将两个单独的图层添加到CCScene容器中,或者是图层的父节点。这可能类似于以下内容

@implementation SceneNode

@synthesize actionLayer;

-(id)init {

    self = [super init];

    if (self != nil) {

        UILayer * uiLayer = [UILayer node];

        self.actionLayer = [[ActionLayer alloc] initWithSceneUILayer:uiLayer];

        [self addChild:uiLayer z:UI_LAYER_Z_VALUE];
        [self addChild:actionLayer z:ACTION_LAYER_Z_VALUE];

    } // end if

    return self;


} // end init

@end

棘手的部分是让他们进行沟通,而不会在类之间创建紧密耦合。当控件与GUI层交互时,您可能希望通知操作层(网格层)。在这里,您需要实现Command Design Pattern和/或使用Objective-C协议和委托。

如果您决定使用协议和委托,它可能如下所示

// In a header file
@protocol ControlsProtocols

-(void)fireButtonEvent;

-(void)angleSelectionEvent;

-(void)powerSelectionEvent:(int)powerRec;

@end

在UILayer类中创建委托成员数据变量

@interface ILayer : CCLayer {

    CCMenu * ControlsMenu;
    id <ControlsProtocols> delegate;

} // end ivar

@property (nonatomic, strong) id <ControlsProtocols> delegate;

@end

在使用指向UILayer的指针初始化的动作层(网格层)中,将自身指定为UILayer的委托。

-(id)initWithSceneUILayer:(UILayer *)uiLayer {

    self = [super init];

    if (self != nil) {

        // Store reference to UILayer and set UILayer delegate to self
        UILayer = uiLayer;
        uiLayer.delegate = self;

        // More logic here

    } // end if 

    return self;

} // end init

最后,请务必在Action Layer(网格图层)类中实现协议方法,并将手势识别移动到此图层。我的猜测是你只想在某些手势发生时操纵动作图层,而不是想要包含你的场景和图层的视图。添加逻辑以捕获动作层中的手势,并仅操纵此图层的外观而不是整个视图。

答案 1 :(得分:0)

此近似值基于以下示例

http://www.raywenderlich.com/4817/how-to-integrate-cocos2d-and-uikit

创建一个名为RootViewControler的UIViewController,其中包含所需的所有控件 并使用gridLayer

添加[[CCDirector sharedDirector]视图]子视图
//RootViewcontroler viewDidLoad Method:
    [self.view insertSubview:[[CCDirector sharedDirector] view] atIndex:0];
    CCScene *scene = [GridLayer scene];
    [[CCDirector sharedDirector ]runWithScene: scene];

在Appdelegate中,将RootViewControler实例添加到导航控制器

RootViewControler *rootViewcontroler =[[[RootViewControler alloc] initWithNibName:nil bundle:nil] autorelease];

// Create a Navigation Controller 
    navController_ = [[UINavigationController alloc] initWithRootViewController:rootViewcontroler];

当然不是唯一可行的解​​决方案,但对我来说是有效的。