Cocos2d iphone 如何在cocos2d中使用转场弹出场景?

Cocos2d iphone 如何在cocos2d中使用转场弹出场景?,cocos2d-iphone,transitions,Cocos2d Iphone,Transitions,在cocos2d中调用RelpaceSecene或pushScene时,我可以向其添加一些过渡,如: CCDirector *director = [CCDirector sharedDirector]; CCScene *currentScene = [director runningScene]; CGSize contentSize = [currentScene contentSize]; CCLayerColor *black = [[CCLayerColor alloc]

在cocos2d中调用RelpaceSecene或pushScene时,我可以向其添加一些过渡,如:

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)]]];
[[CCDirector sharedDirector]替换场景:[CCTransitionFade transitionWithDuration:1场景:场景]]

但当我调用popScene时,它不需要任何参数,也不能添加任何过渡。是这样吗?
如何使用所需的转换来弹出场景?

在cocos2d论坛中,每个人都可以这样做:

将其添加到CCDirector.h,就在声明-(void)popsecene(第402行)之后:

您可以这样调用该方法:

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

您可以按如下方式使用
类别

@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类。

我修改了Kailash的答案以使用cocos2d 2.1

CCDirector+additions.h

#import "cocos2d.h"

@interface CCDirector (additions)
-(void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t;
@end
#import "cocos2d.h"

@interface CCDirector (addition)

- (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
#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

上面的一个更简洁的版本实际上释放了场景,因此可以根据需要清理场景及其纹理

CCDirector+addition.h

#import "cocos2d.h"

@interface CCDirector (additions)
-(void)popSceneWithTransition:(Class)transitionClass duration:(ccTime)t;
@end
#import "cocos2d.h"

@interface CCDirector (addition)

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

@end
CCDirector+addition.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
#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

不必弄乱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)]]];

太好了,成功了。以前我不知道我必须为这个东西修改cocos2d。非常感谢。@willzeng您应该将正确答案标记为正确,以便将来帮助他人。@Scottpetit,为什么要使用[scenesStack\uuu替换objectatindex:c-1 with object:scene]是必需的吗?