【问题标题】:Use Cocos2d Within a Single iPhone View在单个 iPhone 视图中使用 Cocos2d
【发布时间】:2010-06-29 19:47:31
【问题描述】:

我有一个主要使用标准控件的 iPhone 应用程序。有一个在 OpenGL 中渲染的视图(花式图)。为了节省自己的大量工作,我环顾四周,发现了 Cocos2d。看起来它正是我需要的(OpenGL ES,使用起来相对简单),但我遇到了问题。

我不知道如何限制 Cocos2d 只存在于一个视图中。之前,我在一个视图中实现了我的 OpenGL 东西,并使用一个简单的 ViewController 在导航控制器中呈现它。在这里,Cocos2d 似乎需要做的更多,我不确定如何将它填充到与原始 OpenGL 相同的 ViewController/View 方法中。

更新:这就是我正在做的事情。翻到下一个粗体,看看我现在在做什么。

#import <UIKit/UIKit.h>


@interface CocosController : UIViewController {
    UIWindow *window;
}

@property (nonatomic,retain) UIWindow *window;

@end

还有我的 CocosController.m:

#import "CocosController.h"
#import "SomeScene.h"
#import "cocos2d.h"

@implementation CocosController

@synthesize window;

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    // Initialization code
    CC_DIRECTOR_INIT();
    CCDirector *director = [CCDirector sharedDirector];

    //landscape
    [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
    [director setDisplayFPS:true];

    //turn on multi-touch
    EAGLView *cocosView = [director openGLView];
    [cocosView setMultipleTouchEnabled:true];

    self.view = cocosView;

    //default texture formats...
    [CCTexture2D  setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA8888];

    [[CCDirector sharedDirector] runWithScene:[SomeScene scene]];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [[CCDirector sharedDirector] purgeCachedData];
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [[CCDirector sharedDirector] release];
    [window release];
    [super dealloc];
}


@end

最后,我是如何尝试展示它的(通过按钮点击):

CocosController *cocosController = [[CocosController alloc] init];
[[self navigationController] pushViewController:cocosController animated:true];

这是新方法,但结果相同。

我的 AppDelegate 的 ApplicationDidFinish 部分:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
        [CCDirector setDirectorType:kCCDirectorTypeThreadMainLoop];

    CCDirector *director = [CCDirector sharedDirector];
    [director setDisplayFPS:YES];

    state = kStateEnd;

    // Add the navigation controller's view to the window and display.
    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];

    return YES;
}

我用来呈现视图的 CocosController:

#import "CocosController.h"
#import "cocos2d.h"
#import "SomeScene.h"

@implementation CocosController

@synthesize mainView;

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    EAGLView *glview = [EAGLView viewWithFrame:CGRectMake(0, 0, 250,350)];
    [mainView addSubview:glview];

    CCDirector *director = [CCDirector sharedDirector];
    [director setOpenGLView:glview];

    CCScene *scene = [CCScene node];
    id node = [SomeScene node];
    [scene addChild: node];

    [director runWithScene:scene];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

这一点来自我拥有的详细信息 ViewController 中的按钮单击,它应该使整个事情出现:

CocosController *cc = [[CocosController alloc]init];
cc.mainView = self.view;
[[self navigationController] pushViewController:cc animated:false];

【问题讨论】:

    标签: iphone opengl-es cocos2d-iphone


    【解决方案1】:

    你正在做的似乎有点过头了。 CC_DIRECTOR_INIT(); 用于初始化视图和CCDirector,建议您将 cocos2d 附加到主视图。

    如果您查看 Cocos2d 中提供的示例,名为 AttachTest(请参阅文件 attachDemo.m),您可以了解如何将 CCDirector 附加到任何视图。以下是示例使用的代码:

    EAGLView *glview = [EAGLView viewWithFrame:CGRectMake(0, 0, 250,350)];
    [mainView addSubview:glview];
    
    CCDirector *director = [CCDirector sharedDirector];
    [director setOpenGLView:glview];
    

    在这个sn-p中,创建了一个新的EAGLView,然后设置为CCDirectoropenGLView

    我的建议是您像往常一样创建视图控制器和空视图(可能使用 Interface Builder 或上面的代码),然后在 loadView 方法中将 CCDirector 附加到该视图。

    【讨论】:

    • 好的,我已经实现了 AttachTest 演示正在做的事情,但是当我调用“[director setOpenGLView:glview];”时(在创建 EAGLView 并将其添加为子视图之后),它崩溃了。具体来说,CCLabelAtlas 的第 75 行(变量 texStepX 为空)。这与我之前遇到的行为相同,这让我认为我只是没有正确初始化某些东西。
    • 更正:texStepX 是无限的。
    【解决方案2】:
    float row = (a % itemsPerRow) * texStepX;
    

    上面的代码行是每次我尝试另一种方法让视图运行时应用程序崩溃的地方。我最后只是试着查了一下,以为我找不到任何东西。事实证明,cocos2d 假设图像 fps_images.png 被假定在项目中。如果不是这样,cocos2d 的这一特殊部分会引发算术异常。

    只需在 cocos2d 目录中找到 fps_images.png 并将其添加到我的项目的 Resources 文件夹中,就花了两秒钟的时间来修复。

    叹息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2012-07-07
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多