1

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

//Adding Rotation Recognicer onEnter Method
    self.rotationRecognicer =[[[UIRotationGestureRecognizer alloc]initWithTarget:self
                                                                          action:@selector(rotate:)]autorelease];
        [[[CCDirector sharedDirector] view] addGestureRecognizer:_rotationRecognicer];

//Adding CCMenuItem On Init Method  
        CCMenuItem *starMenuItem = [CCMenuItemImage
                                        itemWithNormalImage:@"ButtonStar.png"
                                        selectedImage:@"ButtonStarSel.png"
                                        target:self
                                    selector:@selector(starButtonTapped:)];

    starMenuItem.position = ccp(60, 60);
    CCMenu *starMenu = [CCMenu menuWithItems:starMenuItem, nil];
    starMenu.position = CGPointZero;
    [self addChild:starMenu];



//Rotation Method
- (void)rotate:(UIRotationGestureRecognizer *)gestureRecognizer
{

    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformRotate([[gestureRecognizer view] transform], [gestureRecognizer rotation]);
        [gestureRecognizer setRotation:0];
    }


}
4

2 回答 2

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 实例添加到 Navigation Controler

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

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

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

于 2013-08-15T19:03:36.637 回答
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 层上的控件交互时通知操作层(您的网格层)。这是您想要实现命令设计模式或使用带有委托的 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(网格层)类中的协议方法,并将手势识别移到这一层。我的猜测是,您只希望在某些手势发生时操纵动作层,而不是包含您的场景和图层的视图。添加逻辑以在您的操作层中捕获手势,并且仅操作该层的外观而不是整个视图。

于 2013-08-15T10:43:42.547 回答