Su_*_*toL 5 xcode objective-c ios sprite-kit xcode6
由于xCode已更新为6.0版,因此"GameScene"(创建的默认场景)中SpriteKit的默认方法更改为:
-(void) didMoveToView:(SKView *) view {
/* Scene set up in here */
}
Run Code Online (Sandbox Code Playgroud)
与旧方法相反:
-(id) initWithSize:(CGSize) size {
if (self = [super initWithSize:size]{
/* Scene set up in here */
}
}
Run Code Online (Sandbox Code Playgroud)
我知道新方法(与视图控制器中的更改一样)用于帮助管理xCode 6中新增的.sks文件的导入.但是,如果我不想使用新的,我很好奇作为.sks文件的"storyboard"类型格式,我还应该使用新方法吗?或者我应该将方法更改回initWithSize方法并删除.sks文件?
应该使用Init方法进行初始化,但请记住,在init内部,视图始终是nil.因此,任何需要视图的代码都必须移动到didMoveToView方法(在视图呈现场景后立即调用它).
关于initWithSizeXcode 6 ...默认情况下,场景是从.sks文件加载的.因此,initWithSize实际上从未调用过.initWithCoder被称为:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
// do stuff
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
因此,初始化内部任何内容initWithSize都不会产生任何影响.如果您决定删除.sks文件并以"旧"方式创建场景,则可以在视图控制器中执行以下操作:
- (void)viewDidLoad
{
[super viewDidLoad];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
// Create and configure the scene.
GameScene *scene = [GameScene sceneWithSize:self.view.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以使用initWithSize初始化.
请注意,在viewDidLoad中,视图的最终大小可能还不知道,而使用它viewWillLayoutSubviews可能是一个正确的选择.在这里阅读更多.
为场景初始化目的正确实现viewWillLayoutSubviews将是:
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
//viewWillLayoutSubviews can be called multiple times (read about this in docs ) so we have to check if the scene is already created
if(!skView.scene){
// Create and configure the scene.
GameScene *scene = [GameScene sceneWithSize:self.view.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
}
Run Code Online (Sandbox Code Playgroud)
SWIFT代码:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
// Configure the view.
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = true
skView.showsDrawCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
if(skView.scene == nil){
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2464 次 |
| 最近记录: |