在某些情况下,我希望在我的cocos2d iPhone游戏准备就绪时显示某种加载图形/屏幕。例如,它可能在新场景的CCSprite
方法中创建init
个对象,通过[[CCTextureCache sharedTextureCache] addImage:fnTexture];
缓存纹理等。
不幸的是,所有这些操作都需要在cocos显示线程上运行。这意味着我创建一些漂亮动画(例如旋转图形)的任何尝试在线程工作时基本上都会锁定,而且我的漂亮动画会冻结。
我可以想到三种可能的解决方案......
UIView
粘贴覆盖我的OpenGL
视图,当然在主线程上运行,因此不受这些限制...但是,这需要弄清楚如何将我的相当动画编码为UIKit
#2可能吗?或者......有更好的方法可以解决这个问题吗?
答案 0 :(得分:1)
在git上查看MBProgressHUD。我做了一个快速测试(花了3分钟把它放在我的游戏中):
MBProgressHUD *hud = [[[MBProgressHUD alloc] init] autorelease];
hud.xOffset = kScreenWidth / 2;
hud.yOffset = kScreenHeight / 2;
hud.progress = .5;
[hud show:YES];
[hud setTaskInProgress:YES];
hud.labelText = @"Loading";
[[CCDirector sharedDirector].view addSubview:hud];
给我这个:
通过一些非常强烈的纹理预加载和场景设置/计算,它具有极佳的动画效果。您可以在应用程序中找出“如何集成”...... API很好(委托等等)
答案 1 :(得分:0)
不幸的是,解决方案#3不起作用,因为iPhone上的cocos2d实际上使用了cocos2d线程的主线程(但是,这个解决方案适用于OSX,因为它为cocos2d使用了一个单独的线程)。
我的最终解决方案是基于@ LearnCocos2D(上图)的回复。
首先,使用addImageAsync:
消除了大部分主线程锁定。剩余的延迟与创建CCNode
个对象(例如CCSprite
s)有关。我在解决方案#1中使用了一个变体来在我的loader类中创建预先构建的cocos对象的缓存,然后可以在以后重用它(例如,在渲染层时)以防止需要在运行时分配对象。