如何按顺序将音乐,图像和其他内容加载到进度条和移动条平滑的场景中... 我猜进度条的逻辑是创建新的线程 - 加载数据并销毁线程 这是我的代码加载东西,但它不起作用,进度条出现但没有更新值
-(void)s1
{
[[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"game_music.caf"];
}
-(void)s2
{
[[SimpleAudioEngine sharedEngine] preloadEffect:@"tap.caf"];
}
-(void)startThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
EAGLContext *context = [[[EAGLContext alloc]
initWithAPI:kEAGLRenderingAPIOpenGLES1
sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease];
[EAGLContext setCurrentContext:context];
[self performSelector:@selector(loadBar)];
//[self schedule:@selector(tick:)];
[self performSelector:@selector(s1)]; // uploading file
[self performSelector:@selector(progressUpdateValue)]; // add 10 value to progress
[self performSelector:@selector(s2)]; // uploading file
[self performSelector:@selector(progressUpdateValue)]; // add 10 value to progress
[self performSelector:@selector(replaceScene)
onThread:[[CCDirector sharedDirector] runningThread]
withObject:nil
waitUntilDone:false];
[pool release];
}
-(void)replaceScene
{
[[CCDirector sharedDirector]replaceScene:[GameScene node]];
}
-(id)init
{
self = [super init];
if (self != nil)
{
[NSThread detachNewThreadSelector:@selector(startThread) toTarget:self withObject:nil];
}
return self;
}
提前致谢。
界面..你去..)
@interface LoadScene : CCScene
{
GPLoadingBar *loadingBar;
float value;
}
答案 0 :(得分:3)
好的,所以你应该在后台加载资源,同时在主线程中更新loadBar。对于SimpleAudioEngine,您确实需要NSThread,但CCTextureCashe具有-addImageAsync方法,允许您异步加载图像而不会出现问题。所以你的代码应该是这样的:
-(void)s1
{
[[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"game_music.caf"];
}
-(void)s2
{
[[SimpleAudioEngine sharedEngine] preloadEffect:@"tap.caf"];
}
-(void)startThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self s1];
loadingBar.value = 0.5;
[self s2];
[self performSelectorOnMainThread:@selector(replaceScene)
withObject:nil
waitUntilDone:false];
[pool release];
}
-(void)replaceScene
{
[[CCDirector sharedDirector]replaceScene:[GameScene node]];
}
-(id)init
{
self = [super init];
if (self != nil)
{
[self loadBar];
[NSThread detachNewThreadSelector:@selector(startThread) toTarget:self withObject:nil];
}
return self;
}
-(void) loadingFinished
{
[self replaceScene];
}
Cocos2d有自己的更新循环,因此您无需创建用于更新loadingBar的循环。它还有一个绘图循环,所以如果你想在屏幕上动态更新某些内容,你应该只设置更新值而不是用加载资源来停止主线程
另外,您可以使用[self s1]而不是[self performSelector:@selector(s1)],因为它们是相同的。希望这会有所帮助