如何在cocos2d中使用过渡效果进行页面弹出?

11

当我在cocos2d中调用replaceScene或pushScene函数时,可以添加一些过渡效果,如:

[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1 scene:scene]];

但是当我调用popScene函数时,它不带参数,也不能添加过渡效果。是这样吗? 我该如何使用所需的过渡效果来popScene?

5个回答

20
据cocos2d论坛上的一位用户提供,以下方法可以解决问题:论坛链接 在CCDirector.h文件中,在-(void)popScene (第402行)声明后添加以下内容:
    - (void) popSceneWithTransition: (Class)c duration:(ccTime)t;

Then add this to CCDirector.m, just after the definition of -(void)popScene (line 768):

    -(void) popSceneWithTransition: (Class)transitionClass duration:(ccTime)t;
    {
    NSAssert( runningScene_ != nil, @"A running Scene is needed");

    [scenesStack_ removeLastObject];
    NSUInteger c = [scenesStack_ count];
    if( c == 0 ) {
        [self end];
    } else {
        CCScene* scene = [transitionClass transitionWithDuration:t scene:[scenesStack_ objectAtIndex:c-1]];
        [scenesStack_ replaceObjectAtIndex:c-1 withObject:scene];
        nextScene_ = scene;
    }
}

你可以这样调用该方法:

[[CCDirector sharedDirector] popSceneWithTransition:[CCSlideInRTransition class] durat

太棒了,它起作用了。之前我不知道我必须修改cocos2d来实现这个功能。非常感谢。 - willzeng
1
@willzeng 你应该将正确的答案标记为正确,以帮助未来的人们。 - ScottPetit
@Scottpetit,为什么根本需要这一行代码[scenesStack_ replaceObjectAtIndex:c-1 withObject:scene];呢? - Vasu

3
你可以按照以下方式使用类别(Category)
@interface CCDirector (PopTransition)

- (void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t;

@end

@implementation CCDirector (PopTransition)

- (void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t {

    [self popScene];

    // Make Transition
    if (nextScene_) {
        CCScene* scene = [transitionClass transitionWithDuration:t scene:nextScene_];
        [scenesStack_ replaceObjectAtIndex:([scenesStack_ count] - 1) withObject:scene];
        nextScene_ = scene;
    }
}

@end

这样你就不需要修改CCDirector类。


0

不需要干扰Cocos2d内部,您可以这样做:

CCDirector *director  = [CCDirector sharedDirector];
CCScene *currentScene = [director runningScene];
CGSize contentSize    = [currentScene contentSize];
CCLayerColor *black   = [[CCLayerColor alloc] initWithColor:ccc4(0, 0, 0, 0) width:contentSize.width height:contentSize.height];
[currentScene addChild:black];
[black runAction:[CCSequence actionOne:[CCFadeTo actionWithDuration:1.0f opacity:255]
                                   two:[CCCallFunc actionWithTarget:director selector:@selector(popScene)]]];

0
一个更简洁的版本,实际上释放场景,以便根据需要清理它及其纹理。

CCDirector+addition.h

#import "cocos2d.h"

@interface CCDirector (addition)

- (void) popSceneWithTransition:(Class)transitionClass duration:(ccTime)t;

@end

CCDirector+addition.m

#import "CCDirector+addition.h"

@implementation CCDirector (addition)

- (void) popSceneWithTransition:(Class)transitionClass duration:(ccTime)t {
    [_scenesStack removeLastObject];

    NSUInteger count = [_scenesStack count];
    NSAssert(count > 0, @"Don't popScene when there aren't any!");

    CCScene* scene = [transitionClass transitionWithDuration:t scene:[_scenesStack lastObject]];
    [self replaceScene:scene];
}

@end

0

我修改了Kailash的答案,使其适用于cocos2d 2.1。

CCDirector+additions.h

#import "cocos2d.h"

@interface CCDirector (additions)
-(void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t;
@end

CCDirector+additions.m

#import "CCDirector+additions.h"

@implementation CCDirector (additions)
-(void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t {
    [self popScene];

    // Make Transition
    if (_nextScene) {
        CCScene* scene = [transitionClass transitionWithDuration:t scene:_nextScene];
        [_scenesStack replaceObjectAtIndex:([_scenesStack count] - 1) withObject:scene];
        _nextScene = scene;
    }
}
@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接