2011-08-11 17 views
11

Khi tôi gọi relpaceScene hoặc pushScene trong cocos2d, tôi có thể thêm một số hiệu ứng chuyển tiếp vào nó như:Làm thế nào để popScene với quá trình chuyển đổi trong cocos2d?

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

nhưng khi tôi gọi popScene, không cần tham số và không thể thêm chuyển đổi. Là vậy sao? Làm thế nào tôi có thể popScene với các chuyển tiếp mong muốn?

Trả lời

20

mỗi Guy trong các diễn đàn cocos2d này dường như làm việc: Link to Forum

Thêm phần này vào CCDirector.h, ngay sau tuyên bố - (void) popScene (dòng 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; 
    } 
} 

Bạn có thể gọi phương thức như thế này:

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

Tuyệt vời, nó hoạt động. Trước đây tôi không biết rằng tôi phải sửa đổi cocos2d cho thứ này. Cảm ơn rất nhiều. – willzeng

+1

@willzeng Bạn nên đánh dấu câu trả lời chính xác là đúng, để giúp mọi người trong tương lai. – ScottPetit

+0

@Scottpetit, tại sao dòng '[sceneStack_ replaceObjectAtIndex: c-1 withObject: scene];' là bắt buộc? – Vasu

3

Bạn có thể sử dụng Category như sau:

@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 

Bằng cách này bạn không cần sửa đổi lớp CCDirector.

0

Tôi đã sửa đổi câu trả lời của Kailash để làm việc với 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 
0

Một phiên bản ngắn gọn hơn những điều trên mà thực sự giải phóng hiện trường để nó và kết cấu của nó có thể được làm sạch khi cần thiết.

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

Mà không cần phải gây rối với Cocos2d internals bạn có thể làm điều đó thích:

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)]]]; 
Các vấn đề liên quan