我试图理解在Cocos2d中使用CCUIViewWrapper与端口功能的优缺点。例如,在CCUIViewWrapper中使用UITableView或使用CCTableViewSuite会更好吗?乍一看,我认为包装器是更好的方法,因为大概它可以让我做UITableView提供的所有东西,但是我是否缺少关键细节?包装器是否存在严重的限制,无论是实际使用apple sdk对象还是无法利用Cocos2d中带有CCTableView等移植对象的某些功能?
答案 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项目。
创建一个新的cocos 2d应用程序项目。
创建一个新的NSObject文件并将其命名为CCUIViewWrapper。这将为您提供CCUIViewWrapper.h和CCUIViewWrapper.m文件。编辑(通过复制粘贴)它们看起来像Blue Ether已定义它们(请参阅此主题中的第一篇文章。
让您的HelloWorld.h看起来像这样
// HelloWorldLayer.h
#import "cocos2d.h"
#import <UIKit/UIKit.h>
#import "CCUIViewWrapper.h"
@interface HelloWorld : CCLayer
{
UIButton *button;
CCUIViewWrapper *wrapper;
}
+(id) scene;
@end
和你的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上的视图。一个问题是你将无法在其上添加任何其他精灵。非常有限。