SKView Transtion
How to move other scene
Use presentScene
- (void)transitToScene:(SKScene *)newScene {
newScene.scaleMode = SKSceneScaleModeAspectFill;
// Transition new scene
SKTransition *transition = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
[self.view presentScene:newScene transition:transition];
}
Transition Directions
- SKTransitionDirectionUp
- SKTransitionDirectionDown
- SKTransitionDirectionRight
- SKTransitionDirectionLeft
SceneController
SceneController is controller for transition.
Use NSNotification to detect transition.
SceneController.h
@interface SceneController : NSObject @property (nonatomic, weak) SKView *view; @end
SceneController.m
@implementation SceneController
- (id)init {
self = [super init];
if(self ) {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(receiveStart:)
name:@"GameStartNotification"
object:nil];
}
return self;
}
- (void)receiveStart:(NSNotification *)notify {
SKScene *scene = [NewScene sceneWithSize:self.view.bounds.size];
[self transitToScene:scene];
}
- (void)transitToScene:(SKScene *)newScene {
newScene.scaleMode = SKSceneScaleModeAspectFill;
// Transition new scene
SKTransition *transition = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
[self.view presentScene:newScene transition:transition];
}
@end
ViewController and Scene
Let’s start example.
GameViewController.m
@interface GameViewController ()
@property (nonatomic)SceneController *sceneController;
@end
@implementation GameViewController
- (void)loadView {
self.view = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}
- (void)viewDidLoad {
[super viewDidLoad];
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
skView.showsDrawCount = YES;
self.sceneController = [[SceneController alloc] init];
self.sceneController.view = skView;
// First scene
SKScene *scene = [TitleScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[skView presentScene:scene];
}
@end
loadView is required to use ViewController from AppDelegate.
TitleScene.h
#import <SpriteKit/SpriteKit.h> @interface TitleScene : SKScene @end
TitleScene.m
#import "TitleScene.h"
@implementation TitleScene
- (id)initWithSize:(CGSize)size {
if(self = [super initWithSize:size]) {
// background color
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
// title
SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
myLabel.text = @"Fun!";
myLabel.fontSize = 34;
myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
[self addChild:myLabel];
// label
SKLabelNode *operation = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
operation.text = @"Tap screen to start.";
operation.fontSize = 17;
operation.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame)-50);
[self addChild:operation];
// blink action
SKAction *fadeOut = [SKAction fadeOutWithDuration:1.0];
SKAction *fadeIn = [SKAction fadeInWithDuration:0.0];
SKAction *blink = [SKAction sequence:@[fadeOut, fadeIn]];
[operation runAction:[SKAction repeatActionForever:blink]];
}
return self;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"GameStartNotification"
object:nil
userInfo:nil];
}
@end
NewScene.h
@interface NewScene : SKScene @end
NewScene.m
@implementation NewScene @end
