我的问题涉及将UIKit与Cocos2d一起使用。
该应用程序以cocos2d app开始,使用CCDirector作为导航控制器的rootViewController。我通过抓取glView的屏幕截图并立即显示该视图然后动画到新视图上,在没有动画的情况下将另一个视图控制器推到顶部。新视图是一个包含先前场景缩略图的图库。
[self.shelf animateOffScreen];
[UIView animateWithDuration:.2 animations:^{
self.deleteButton.center = CGPointMake(kAnimateButtonOffX, self.deleteButton.center.y);
self.infoButton.center = CGPointMake(kAnimateButtonOffX, self.infoButton.center.y);
self.galleryButton.center = CGPointMake(kAnimateButtonOffX, self.galleryButton.center.y);
self.cameraButton.center = CGPointMake(kAnimateButtonOffX, self.cameraButton.center.y);
} completion:^(BOOL finished) {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SSGalleryViewController *gallery = [storyboard instantiateViewControllerWithIdentifier:@"gallery"];
gallery.startImage = self.scene.lastScreenGrab;
gallery.playarea = self.scene;
gallery.delegate = self;
[self pushViewController:gallery animated:NO];
}];
当用户选择要启动的其他场景时,已保存场景的缩略图图形将缩放以覆盖整个屏幕。
self.playarea.sceneName = feltBoard.filename;
[[NSUserDefaults standardUserDefaults] setObject:feltBoard.filename forKey:kDataArchiveKey];
[[NSUserDefaults standardUserDefaults] synchronize];
SSScene *aScene = [[SSScene alloc] initWithDelegate:self.playarea];
[aScene restoreScene];
GMGridViewCell *cell = [self getCellForKey:feltBoard.filename];
UIImageView *endView = (UIImageView*)[cell viewWithTag:kCellImageTag];
endView.center = [self.view convertPoint:endView.center fromView:cell];
[self.view addSubview:endView];
[UIView animateWithDuration:.3 animations:^{
endView.frame = CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
if (finished) {
[self.delegate dismissGallery:self];
}
}];
然后弹出视图控制器,以便rootViewController(CCDirector)重新获得控制权。发生这种情况时,会在显示恢复的场景之前瞬间显示最后一个场景。
UIView *tempView = [gallery.view viewWithTag:50];
[tempView removeFromSuperview];
[self.view insertSubview:tempView atIndex:0];
[self popViewControllerAnimated:NO];
[self.shelf animateOnScreen];
[UIView animateWithDuration:.2 animations:^{
self.deleteButton.center = CGPointMake(kAnimateButtonOnX, self.deleteButton.center.y);
self.infoButton.center = CGPointMake(kAnimateButtonOnX, self.infoButton.center.y);
self.galleryButton.center = CGPointMake(kAnimateButtonOnX, self.galleryButton.center.y);
self.cameraButton.center = CGPointMake(kAnimateButtonOnX, self.cameraButton.center.y);
} completion:^(BOOL finished) {
if (finished) {
[tempView removeFromSuperview];
}
}];
我试图通过删除节点和添加新节点来更新一个场景(这样实际上只有一个场景被使用)并且我得到了闪光灯。
我尝试创建一个新场景并用它替换正在运行的场景,但我仍然看到了闪光灯。
我相信当我离开现场时,我正在看到openGL缓冲区中剩下的内容。但是,glFlush()没有效果。
我想我需要一种方法来刷新glView并显示我在画廊uiView覆盖时所做的更改。
有关可能发生的事情或我如何纠正此问题的任何想法?
答案 0 :(得分:0)
您可以强制CCDirector将内容绘制到帧缓冲区。在设置新场景后立即运行。
您可以执行以下操作,具体取决于cocos2d版本:
[[CCDirector sharedDirector] visit];
或
[[CCDirector sharedDirector] drawScene];
立即强制更新帧缓冲区。否则cocos2d将在下一个显示链接刷新事件上绘制,该事件可能在下一帧之前不会发生,并且可能会延迟更长时间,因为所有耗时的设置代码都发生在第一帧中。