iphone - COCOS2D : ScrollView inside a CCScene blocks animation

标签 iphone ios cocoa-touch cocos2d-iphone

我有一个 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 动画,如果我没有很好地触摸屏幕,但是一旦我向上或向下拖动 ScrollView 就会停止或以与滚动手指相同的速度移动!!!

有什么想法吗?

最佳答案

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

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

它基本上包括将此代码添加到 ScrollView :

// 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;
}
}

非常感谢这些人

关于iphone - COCOS2D : ScrollView inside a CCScene blocks animation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114086/

相关文章:

iphone - 我希望在 iPhone 中实现 Platinum UPnP

ios - 从图库照片导入屏幕截图并在 Xcode 6.3 Swift 中设置为背景

iphone - 从我的应用程序中打开 iPod 应用程序?

ios - 如何从委托(delegate)在线程内构建我的单元格?

带有部分的 iOS tableView - 如何获取全局索引

iphone - 确定 iOS 设备上可能的最大同时触摸数?

IOS。复杂的拉伸(stretch)?

ios - xcode 7 中找不到 facebooksdk.h 文件错误

ios - App中的iOS自定义网址方案在第一次使用网址方案时无法打开

ios - 我如何在 iOS 上以编程方式为图像着色?