我有一个CClayer
类,名为GridLayer我将手势识别器(平移,捏合和旋转)添加到视图中,它工作正常,但如果我添加{{1粘贴到视图中因此受旋转和捏合手势的影响,我的问题是谁从视图大小,比例和位置实现了独立的CCMenuItem
。
CCMenuitem
答案 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];
当然不是唯一可行的解决方案,但对我来说是有效的。