2013-08-31 27 views
1

我的问题涉及与Cocos2d使用UIKit。Cocos2d glView不刷新时不在视图

该应用程序以使用CCDirector作为导航控制器的rootViewController的cocos2d应用程序启动。我通过抓住glView的屏幕快照并立即显示该视图,然后将视图动画到新视图上,将顶部的另一个视图控制器放在没有动画的位置。新视图是包含先前场景缩略图的图库。

​​

当用户选择不同的场景开始,所保存的场景的缩略图图形被缩减到覆盖整个屏幕。

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

您可以强制CCDirector将内容绘制到帧缓冲区。在安装新场景后运行此操作。

根据cocos2d的版本,你可以这样做:

[[CCDirector sharedDirector] visit]; 

[[CCDirector sharedDirector] drawScene]; 

强制立即更新帧缓存。否则,cocos2d将绘制下一个显示链接刷新事件,该事件可能在下一帧之前不会发生,并且可能会延迟更长时间,因为所有耗时的设置代码都发生在第一帧中。

+0

used [[CCDirector sharedDirector] drawScene];这就像一个冠军!我一直在为此挣扎好几天。你太棒了。 – Dave