私の問題は、Cocos2d で UIKit を使用することです。
アプリは、CCDirector をナビゲーション コントローラーの rootViewController として使用する cocos2d アプリとして起動します。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];
}
}];
ノードを削除して新しいノードを追加して (実際には 1 つのシーンのみが使用されるようにするため)、1 つのシーンを更新しようとしましたが、フラッシュが発生しました。
新しいシーンを作成して、走っているシーンを差し替えてみましたが、まだフラッシュが見えます。
シーンを離れたときに openGL バッファに残っていたものを見ていると思います。ただし、glFlush() は効果がありません。
glView を更新して、ギャラリー uiView でカバーされたときに行った変更を表示する方法が必要だと思います。
何が起こっているのか、またはこの問題をどのように修正できるのかについてのアイデアはありますか?