iOSCocos2dx封装为view方便做3D动画效果
Posted yofer张耀琦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOSCocos2dx封装为view方便做3D动画效果相关的知识,希望对你有一定的参考价值。
版权声明:本文为博主原创,如需转载请注明出处。
写在前面
本文件只是将Cocos2dx 封装为一个 UIView,方便直接添加使用
使用的 coco2d-x 版本为 3.13.1
添加过程
首先将 ~/cocos2d/build/cocos2d_lib.xcodeproj 添加到工程中
然后对照new出来的工程,修改配置:
然后添加两个 Header Search Paths,同样对照样本工程
设置TARGETS中Header Search Paths
PROJECT中设置Header Search Paths,相对路径
设置预处理的宏定义,Debug和Release
修改Custom Compiler Flags
至此,不出意外编译可以成功了。
设置view
然后在CocosViewController(我自己建立的测试界面)中设置弹出HelloWorld界面,HelloWorld界面的两个类 AppDelegate
和 HelloWorldScene
要添加到工程中。
注意这个文件是C++混编,所以
CocosViewController.m
文件要改后缀为CocosViewController.mm
#import "CocosViewController.h"
#import "CocosAppDelegate.h"
#import "platform/ios/CCEAGLView-ios.h"
#import "platform/ios/CCDirectorCaller-ios.h"
// cocos2d application instance
static CocosAppDelegate s_sharedApplication;
@interface CocosViewController ()
@property (weak, nonatomic) UIView *blackView;
@property (weak, nonatomic) CCEAGLView *eaglView;
@end
@implementation CocosViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
[self drawButton];
#pragma mark - 绘制按钮
- (void)drawButton
UIButton *cocoaButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 70, 80, 50)];
[cocoaButton setTitle:@"动画开关" forState:UIControlStateNormal];
[cocoaButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[cocoaButton addTarget:self action:@selector(presentCocosView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:cocoaButton];
- (void)presentView
if (self.blackView)
[self.blackView removeFromSuperview];
self.blackView = nil;
else
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(50, 120, [UIScreen mainScreen].bounds.size.width / 2.0, [UIScreen mainScreen].bounds.size.height / 2.0)];
[view setBackgroundColor:[UIColor blackColor]];
[self.view addSubview:view];
self.blackView = view;
- (void)presentCocosView
if (self.eaglView)
[self destroyCocosView];
else
[self addCocosView];
- (void)addCocosView
cocos2d::Application *app = cocos2d::Application::getInstance();
// Initialize the GLView attributes
app->initGLContextAttrs();
cocos2d::GLViewImpl::convertAttrs();
// Initialize the CCEAGLView
CCEAGLView *eaglView = [CCEAGLView viewWithFrame: CGRectMake(0, 120, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height * 0.8)
pixelFormat: (__bridge NSString *)cocos2d::GLViewImpl::_pixelFormat
depthFormat: cocos2d::GLViewImpl::_depthFormat
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0 ];
// Enable or disable multiple touches
[eaglView setMultipleTouchEnabled:NO];
// Set EAGLView as view of RootViewController
// self.view = eaglView;
[self.view addSubview:eaglView];
self.eaglView = eaglView;
cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)eaglView);
//set the GLView as OpenGLView of the Director
cocos2d::Director::getInstance()->setOpenGLView(glview);
//run the cocos2d-x game scene
app->run();
- (void)destroyCocosView
// cocos2d::Director::getInstance()->getTextureCache()
cocos2d::PoolManager::destroyInstance();
cocos2d::Director::getInstance()->purgeCachedData();
cocos2d::Director::getInstance()->purgeDirector();
[CCDirectorCaller destroy];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
@end
此时就可以重复开启关闭cocos动画界面了。
释放cocos单例
检查单例
这里先对所有的cocos2dx中的单例进行检查,主要是想用Director销毁其他的单例,经过检查的结果也证明了王哲说的:用Director来管理项目中的单例,具体释放在上面的 destroyCocosView
方法中。即为:
- (void)destroyCocosView
// cocos2d::Director::getInstance()->getTextureCache()
cocos2d::PoolManager::destroyInstance();
cocos2d::Director::getInstance()->purgeCachedData();
cocos2d::Director::getInstance()->purgeDirector();
[CCDirectorCaller destroy];
下面为检查结果表格:
单例 | 是否被cocostudio释放 | 启动时是否被实例化 |
---|---|---|
ArmatureNodeReader::destroyInstance() | 是 | 否 |
ButtonReader::destroyInstance() | 是 | 否 |
ActionManagerEx::destroyInstance() | 是 | CCActionNode 和 CCSGUIReader |
BoneNodeReader::destroyInstance() | 否 | 否 |
ActionTimelineCache::destroyInstance() | CSLoader销毁时会调用这个销毁 | CSLoader |
Animation3DCache::destroyInstance() | 否 | 否 |
AnimationCache::destroyInstance() | 是 | CCNodelLoader 和 CCSprite |
ScriptEngineManager::destroyInstance() | 否 | 有一堆类用到这个实例,但没有被销毁,但可以用Application销毁 |
PoolManager::destroyInstance() | 否 | 同上 |
ArmatureDataManager::destroyInstance() | 是 | 否 |
AsyncTaskPool::destroyInstance() | 是 | 其他3个类有用到 |
Configuration::destroyInstance() | 是 | 二十几个类用到 |
FileUtils::destroyInstance() | 是 | |
GLProgramCache::destroyInstance() | 是 | |
GLProgramStateCache::destroyInstance() | 是 | |
NodeLoaderLibrary::destroyInstance() | 否 | 否 |
__NotificationCenter::destroyInstance() | 否 | 否 |
GUIReader::destroyInstance() | 是 | 十几个类调用 |
Sprite3DCache::getInstance() | 否 | 自己调用 |
Sprite3DMaterialCache::destroyInstance() | 否 | |
SpriteFrameCache::destroyInstance() | 是 | |
SceneReader::destroyInstance() | 是 | |
DictionaryHelper::destroyInstance() | 是 | |
UserDefault::destroyInstance() | 是 | |
CheckBoxReader::destroyInstance() | 是 | |
NodeReader::destroyInstance() | 是 | |
SingleNodeReader::destroyInstance() | 是 | |
SpriteReader::destroyInstance() | 是 | |
ParticleReader::destroyInstance() | 是 | |
GameMapReader::destroyInstance() | 是 | |
ProjectNodeReader::destroyInstance() | 是 | |
ComAudioReader::destroyInstance() | 是 | |
WidgetReader::destroyInstance() | 是 | |
CheckBoxReader::destroyInstance() | 是 | |
ImageViewReader::destroyInstance() | 是 | |
TextBMFontReader::destroyInstance() | 是 | |
TextReader::destroyInstance() | 是 | |
TextFieldReader::destroyInstance() | 是 | |
TextAtlasReader::destroyInstance() | 是 | |
LoadingBarReader::destroyInstance() | 是 | |
SliderReader::destroyInstance() | 是 | |
LayoutReader::destroyInstance() | 是 | |
ScrollViewReader::destroyInstance() | 是 | |
PageViewReader::destroyInstance() | 是 | |
ListViewReader::destroyInstance() | 是 | |
Node3DReader::destroyInstance() | 是 | |
Sprite3DReader::destroyInstance() | 是 | |
UserCameraReader::destroyInstance() | 是 | |
Particle3DReader::destroyInstance() | 是 | |
CSLoader::destroyInstance() | 是 | |
FlatBuffersSerialize::destroyInstance() | 否 | 一堆调用这个 |
GameNode3DReader::destroyInstance() | 否 | 否 |
HttpClient::destroyInstance() | 否 | 否 |
Light3DReader::destroyInstance() | 否 | 否 |
JsonLocalizationManager::destroyInstance() | 否 | 否 |
BinLocalizationManager::destroyInstance() | 否 | 否 |
ObjectFactory::destroyInstance() | 否 | 是 |
SkeletonNodeReader::destroyInstance() | 否 | 否 |
SocketIO::destroyInstance() | 否 | 否 |
TabControlReader::destroyInstance() | 否 | 否 |
TabHeaderReader::destroyInstance() | 否 | 否 |
TabItemReader::destroyInstance() | 否 | 否 |
TriggerMng::destroyInstance() | 是 |
以上是关于iOSCocos2dx封装为view方便做3D动画效果的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D之Mecanim动画系统学习笔记:Animation View
Android动画之ViewPropertyAnimator(专用于view的属性动画)