使用CCUIViewWrapper与移植功能的优缺点

时间:2010-10-01 03:46:12

标签: uikit cocos2d-iphone tradeoff

我试图理解在Cocos2d中使用CCUIViewWrapper与端口功能的优缺点。例如,在CCUIViewWrapper中使用UITableView或使用CCTableViewSuite会更好吗?乍一看,我认为包装器是更好的方法,因为大概它可以让我做UITableView提供的所有东西,但是我是否缺少关键细节?包装器是否存在严重的限制,无论是实际使用apple sdk对象还是无法利用Cocos2d中带有CCTableView等移植对象的某些功能?

2 个答案:

答案 0 :(得分:2)

我已经从here复制了这篇文章,可能有助于回答您的问题。我相信将cocos2d函数与cocos2d包装器一起使用会更好,但是你可以与其他人一起实现它也不会集成。

如果有任何新手(比如我自己)需要额外的帮助,如何将UIKit项目与cocos2d集成,这可能有所帮助。正如您在该主题的第一篇文章中所读到的那样,Blue Ether已经编写了一个用于操作UIViews的包装器。什么是UIView?查看http://developer.apple.com/iphone/library/documentation/uikit/reference/uikit_framework/Introduction/Introduction.html,向下滚动一下,您将看到不同UIView项目的图表;比如UIButton,UISlider,UITextView,UILabel,UIAlertView,UITableView,UIWindow等等。其中有20多个。您可以使用Blue Ethas代码将其中任何一个包装在cocos2d中。在这里,我将包装一个UIButton,但试验你最喜欢的UIView项目。

  1. 创建一个新的cocos 2d应用程序项目。

  2. 创建一个新的NSObject文件并将其命名为CCUIViewWrapper。这将为您提供CCUIViewWrapper.h和CCUIViewWrapper.m文件。编辑(通过复制粘贴)它们看起来像Blue Ether已定义它们(请参阅此主题中的第一篇文章。

  3. 让您的HelloWorld.h看起来像这样

    //  HelloWorldLayer.h
    
    #import "cocos2d.h"
    
    #import <UIKit/UIKit.h>
    
    #import "CCUIViewWrapper.h"
    
    @interface HelloWorld : CCLayer
    
    {
        UIButton *button;
        CCUIViewWrapper *wrapper;
    }
    +(id) scene;
    @end
    
  4. 和你的HelloWorld.m一样

    //  HelloWorldLayer.m
    
         #import "HelloWorldScene.h"
    
    // HelloWorld implementation
    @implementation HelloWorld
    
    +(id) scene
    {
        CCScene *scene = [CCScene node];
        HelloWorld *layer = [HelloWorld node];
        [scene addChild: layer];
        return scene;
    }
    
    -(void)buttonTapped:(id)sender
    {
        NSLog(@"buttonTapped");
    }
    
    // create and initialize a UIView item with the wrapper
    -(void)addUIViewItem
    {
        // create item programatically
        button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchDown];
        [button setTitle:@"Touch Me" forState:UIControlStateNormal];
        button.frame = CGRectMake(0.0, 0.0, 120.0, 40.0);
    
        // put a wrappar around it
        wrapper = [CCUIViewWrapper wrapperForUIView:button];
        [self addChild:wrapper];
    }
    
    -(id) init
    {
        if( (self=[super init] )) {
            [self addUIViewItem];
    
            // x=160=100+120/2, y=240=260-40/2
            wrapper.position = ccp(100,260);
            [wrapper runAction:[CCRotateTo actionWithDuration:4.5 angle:180]];
        }
        return self;
    }
    
    - (void) dealloc
    {
        [self removeChild:wrapper cleanup:true];
        wrapper = nil;
        [button release];
        button=nil;
        [super dealloc];
    }
    @end
    

    构建并运行。这应该在场景中间产生一个旋转按钮。您可以在旋转时触摸按钮。它将在控制台中写入一条短信。

答案 1 :(得分:1)

CCUIViewWrapper不是一个好的解决方案。我试过并删除了它。问题是它将UIKit元素包装在一个容器中,并通过openGL主视图将其添加为director上的视图。一个问题是你将无法在其上添加任何其他精灵。非常有限。