Используйте Cocos2d в одном представлении iPhone - PullRequest
3 голосов
/ 29 июня 2010

У меня есть приложение для iPhone, которое в основном использует стандартные элементы управления.Есть одно представление, которое отображается в OpenGL (причудливые графики).Чтобы сэкономить много работы, я огляделся и нашел Cocos2d.Похоже, что он имеет именно то, что мне нужно (OpenGL ES, с ним относительно просто работать), но я столкнулся с проблемой.

Я не знаю, как ограничить Cocos2d для существования только в одномПосмотреть.Раньше я реализовывал свои OpenGL в виде и использовал простой ViewController для представления его в контроллере навигации.Здесь Cocos2d, похоже, нужно сделать намного больше, и я не уверен, как встроить его в тот же подход ViewController / View, который я использовал с необработанным OpenGL.

ОБНОВЛЕНИЕ: Это то, что я делал делал.Перейдите к следующему жирному шрифту, чтобы увидеть, что я делаю сейчас.

#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];

Это новый подход, но результаты те же.

Часть ApplicationDidFinish моего AppDelegate:

- (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];

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

То, что вы делаете, кажется излишним. 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];

В этом фрагменте создается новый EAGLView, который затем устанавливается как openGLView из CCDirector.

Мое предложение состоит в том, чтобы вы создали свой контроллер представления и пустое представление как обычно (возможно, используя Interface Builder или приведенный выше код), а затем в методе loadView присоедините CCDirector к этому представлению.

1 голос
/ 09 июля 2010
float row = (a % itemsPerRow) * texStepX;

В приведенной выше строке кода приложение зависало каждый раз, когда я пробовал другой способ запустить представление. Наконец я просто попытался найти его, думая, что ничего не найду. Оказывается, cocos2d предполагает, что в проекте предполагается, что изображение fps_images.png. Если это не так, этот конкретный бит cocos2d взрывается с арифметическим исключением.

На исправление ушло две секунды, просто найдя fps_images.png в каталоге cocos2d и добавив его в папку «Ресурсы» моего проекта.

вздыхает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...