COCOS2D:CCScene 中的 ScrollView 块动画

Posted

技术标签:

【中文标题】COCOS2D:CCScene 中的 ScrollView 块动画【英文标题】:COCOS2D: ScrollView inside a CCScene blocks animation 【发布时间】:2011-11-13 19:34:16 【问题描述】:

我有一个 CCScene。在它的右侧,我需要一个带有一些菜单元素的 UIScrollView。正如我在上一个问题Cocos2d and UIScrollView

中解释的那样,我是这样做的

这是创建我的场景的方法

  +(id) scene: (int) wld
    CCScene *scene = [CCScene node];
    LevelsMenu *layer = [LevelsMenu node];
    layer = [layer init:wld];
    [scene addChild: layer];
    [layer setScrollView:[LevelMenuControlView alloc]];
    [[[CCDirector sharedDirector] openGLView] addSubview:layer.scrollView.view];
    return scene;
 

注意 LevelMenuControlView 只是一个这样实现的 UIViewController:

 - (void)loadView
 LevelMenuView *scrollView = [[LevelMenuView alloc] initWithFrame:[UIScreen 
    mainScreen].applicationFrame];

scrollView.contentSize = CGSizeMake(862, 480);

scrollView.delegate = scrollView;
[scrollView setUserInteractionEnabled:TRUE];
[scrollView setScrollEnabled:TRUE];
[scrollView setShowsVerticalScrollIndicator:FALSE];
[scrollView setShowsHorizontalScrollIndicator:FALSE];
self.view = scrollView;

[scrollView release];
 

而 LevelMenuView 是包含菜单元素的 UIScrollView

它工作得很好。现在的问题是,在场景的左侧我有一个精灵动画,如果我没有很好地触摸屏幕但是只要我向上或向下拖动滚动视图就会停止或以与滚动手指相同的速度前进!!!

有什么想法吗?

【问题讨论】:

为 Sprite 设置动画的代码是什么?也许它也会对触摸事件做出反应?你的意思是动画精灵移动(改变位置)还是精灵的帧改变(图像动画)? 我只是在 CCSpriteFrameCache 中加载一个 spritesheet 并安排一个选择器,在该选择器中我会定期使用从 FrameCache 中获取的 sprite 更改 sprite 显示的帧 那么也许您遇到了一个简单的性能问题,是这样吗? 它看起来像,但我想这不是让我的手指保持在一个点而不移动它,动画也会停止。一旦我移动触摸(并且以相同的速度),它就会再次开始移动。这很奇怪,我不知道问题出在哪里。我也尝试在不同的线程中生成精灵更新,但我尝试了相同的行为 每当 UIScrollView 获得焦点时,您是否会在 CCDirector 上调用 pause/resume 或 startAnimation/stopAnimation? 【参考方案1】:

我发现这个链接有人已经遇到过同样的问题并发布了一个实际有效的解决方案

http://www.cocos2d-iphone.org/forum/topic/11645

它基本上包括将此代码添加到滚动视图:

// This should go in your interface.
 NSTimer *timer;

// Override
- (void)setContentOffset:(CGPoint)contentOffset 
// UIScrollView uses UITrackingRunLoopMode.
// NSLog([[NSRunLoop currentRunLoop] currentMode]);

// If we're dragging, mainLoop is going to freeze.
if (self.dragging && !self.decelerating) 

// Make sure we haven't already created our timer.
if (timer == nil) 

 // Schedule a new UITrackingRunLoopModes timer, to fill in for    
 CCDirector while we drag.
        timer = [NSTimer scheduledTimerWithTimeInterval:[[CCDirector sharedDirector] animationInterval] target:self selector:@selector(animateWhileDragging) userInfo:nil repeats:YES];

                    // This could also be NSRunLoopCommonModes
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopModes];
    


// If we're decelerating, mainLoop is going to stutter.
if (self.decelerating && !self.dragging) 

    // Make sure we haven't already created our timer.
    if (timer == nil) 

        // Schedule a new UITrackingRunLoopMode timer, to fill in for CCDirector while we decellerate.
        timer = [NSTimer scheduledTimerWithTimeInterval:[[CCDirector sharedDirector] animationInterval] target:self selector:@selector(animateWhileDecellerating) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    


[super setContentOffset:contentOffset];

- (void)animateWhileDragging 

// Draw.
[[CCDirector sharedDirector] drawScene];

if (!self.dragging) 

    // Don't need this timer anymore.
    [timer invalidate];
    timer = nil;


- (void)animateWhileDecellerating 

// Draw.
[[CCDirector sharedDirector] drawScene];

if (!self.decelerating) 

    // Don't need this timer anymore.
    [timer invalidate];
    timer = nil;


非常感谢这些人

【讨论】:

以上是关于COCOS2D:CCScene 中的 ScrollView 块动画的主要内容,如果未能解决你的问题,请参考以下文章

新的视图控制器出现然后消失在 CCScene 后面

错误更改 CCScene

cocos2d如何预加载资源?

cocos2d_android 第一个游戏

Sprite Kit:如何在运行场景之上添加场景

iPhone OpenGL ES 2.0 与 Cocos2D 的混合产生了意想不到的结果