Sprite Kit学习笔记(一)初探
转载:http://blog.csdn.net/kobbbb/article/details/9093601
OS 7新引入的Sprite Kit类库算是给iOS游戏开发者带来一些福音吧,由于是用底层的东西做开发,在效率方面应该会有很大的提高。也不单单是在游戏方面,任何需要动画效果的app也可以利用Sprite Kit来实现。
每天抽点时间出来学习一下,做一下笔记,今天是第一次学习笔记,先跟大家总体的介绍一下整个Sprite Kit框架,接下来会利用官方的例子带大家进入Sprite Kit。学过cocos2d的朋友可能会学得比较快,其实很多东西都是相通的,有关cocos2d的东西就不多说。
如上图所示,这是每一帧会做的事情,更新每一帧的内容,然后是场景中的行为,再就是物理系统,最后通过SKView进行渲染。可以通过一个UIviewController,将其view object的class属性由UIView改为SKView,然后在上面做你想要渲染的东西,可以通过storyboard对其view进行修改,有了SKView之后就需要SKScene了,再场景中添加你要的游戏对象,这不难理解吧。Sprite Kit好像没有Layer的概念,可以直接在Scene上面直接画东西,SKSpriteNode便是你要在Scene上面呈现的精灵,另外添加文本为SKLabelNode,同样继承SKNode,建议大家去了解一下整一个的Node Tree。
大概的框架逻辑就是,在Sprite View上添加Sprite Scene,Sprite渲染在Scene上,Node Tree展示了所有可以出现在Scene上的东西,node可以执行action,Scene上有物理系统,由于目前相关资料比较少,官方文档都是英文,本人阅读能力有限,大概知道也就这些,在后续学习的过程中会加点补充,或者深入给大家介绍。
好了,有了一个大概了解之后,开始用例子了来学习Sprite Kit
首先iOS 7只能在Xcode5.0或者以上版本进行开发,Xcode5.0的运行环境为OS X 10.8以上,新建一个项目,在class prefix那里填上Sprite,平台选择iPhone,创建之后,第一步在项目中导入Sprite Kit Framwork,在storyboard中,展开Sprite View Controller,选中View,在右边的identity inspector面板里,将custom class改为SKView。目前好像没有SKView可以直接创建的,所以只能通过这种方法来创建SKView。
在SpriteViewController.h文件里添加语句:#import <SpriteKit/SpriteKit.h>
在viewDidLoad函数里对SKview做一些初始化操作
SKView *spriteView = (SKView *)self.view; spriteView.showsFPS = YES; spriteView.showsDrawCount = YES; spriteView.showsNodeCount = YES;
HelloScene *hello = [[HelloScene alloc]initWithSize:CGSizeMake(360, 480)]; SKView *spriteView = (SKView *)self.view; [spriteView presentScene:hello];
- (self)didMoveToView: (SKView*) view { if (!self.contentCreated) { [self createSceneContents]; self.contentCreated = YES; } } - (void)createSceneContents { self.backgroundColor = [SKColor blueColor]; self.scaleMode = SKSceneScaleModeAspectFit; [self addChild: [self newHelloNode]]; } - (SKLabelNode*)newHelloNode { SKLabelNode *helloNode = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; helloNode.text = @"Hello, World!"; helloNode.fontSize = 24; helloNode.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)); return helloNode; }
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ SKNode *helloNode = [self childNodeWithName:@"helloNode"]; if (helloNode != nil) { helloNode.name = nil; SKAction *moveUp = [SKAction moveByX:0 y:100 duration:0.5]; SKAction *zoom = [SKAction scaleTo:2 duration:0.25]; SKAction *pause = [SKAction waitForDuration:0.5]; SKAction *fadeAway = [SKAction fadeOutWithDuration:0.25]; SKAction *remove = [SKAction removeFromParent]; SKAction *moveSequence = [SKAction sequence:@[moveUp, zoom, pause, fadeAway, remove]]; [helloNode runAction:moveSequence]; } }
@interface SpaceshipScene () @property BOOL contentCreated; @end @implementation SpaceshipScene - (void)didMoveToView:(SKView *)view { if (!self.contentCreated) { [self createSceneContents]; self.contentCreated = YES; } } - (void)createSceneContents { self.backgroundColor = [SKColor blackColor]; self.scaleMode = SKSceneScaleModeAspectFit; }
[helloNode runAction: moveSequence completion:^{ SKScene* spaceshipScene = [[SpaceshipScene alloc] initWithSize:self.size]; SKTransition *doors = [SKTransition doorsOpenVerticalWithDuration:0.5]; [self.view presentScene:spaceshipScene transition:doors]; }];
SKSpriteNode *spaceship = [self newSpaceship]; spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); [self addChild:spaceship];
- (SKSpriteNode *)newSpaceship { SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(33,24)]; SKAction *hover = [SKAction sequence:@[ [SKAction waitForDuration:1.0], [SKAction moveByX:100 y:50.0 duration:1.0], [SKAction waitForDuration:1.0], [SKAction moveByX:-100.0 y:-50 duration:1.0]]]; [hull runAction: [SKAction repeatActionForever:hover]]; return hull; }
SKSpriteNode *light1 = [self newLight]; light1.position = CGPointMake(-28.0, 6.0); [hull addChild:light1]; SKSpriteNode *light2 = [self newLight]; light2.position = CGPointMake(28.0, 6.0); [hull addChild:light2];
- (SKSpriteNode *)newLight { SKSpriteNode *light = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:CGSizeMake(8,8)]; SKAction *blink = [SKAction sequence:@[ [SKAction fadeOutWithDuration:0.25], [SKAction fadeInWithDuration:0.25]]]; SKAction *blinkForever = [SKAction repeatActionForever:blink]; [light runAction: blinkForever]; return light; }
SKAction *makeRocks = [SKAction sequence: @[ [SKAction performSelector:@selector(addRock) onTarget:self], [SKAction waitForDuration:0.10 withRange:0.15] ]]; [self runAction: [SKAction repeatActionForever:makeRocks]];
static inline CGFloat skRandf() { return rand() / (CGFloat) RAND_MAX; } static inline CGFloat skRand(CGFloat low, CGFloat high) { return skRandf() * (high - low) + low; } - (void) addRock { SKSpriteNode *rock = [[SKSpriteNode alloc] initWithColor:[SKColor brownColor] size:CGSizeMake(8,8)]; rock.position = CGPointMake(skRand(0, self.size.width), self.size.height-50); rock.name = @"rock"; rock.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rock.size]; rock.physicsBody.usesPreciseCollisionDetection = YES; [self addChild:rock]; }
-(void)didSimulatePhysics { [self enumerateChildNodesWithName:@"rock" usingBlock:^(SKNode *node, BOOL *stop) { if (node.position.y < 0) [node removeFromParent]; }]; }