一.概念东西
1.skView是显示动画的视图
2.scene是创建动画的场景
3.SKSpriteNode是精灵(相当于UIImage).
4.position是位置.
5.scale是缩放.
6.SKTexture是添加的纹理(也可以暂时理解为图片).
7.SKAction是动作.
二.执行顺序
1.创建一个Game工程->Game Technology 中选择SpriteKit,并填写工程名->在GameViewController中的ViewDidLoad中创建一个自定义的场景,代码如下
/**1.创建自己的场景*/
Start *scene = [Start sceneWithSize:skView.frame.size];
/**2.添加到skView上*/
[skView presentScene:scene];
2.在自己创建的场景中写上如下代码创建场景中精灵,必须在这个方法里写.
#import "Start.h"
#import "MyScene.h"
@interface Start()
{
/**创建一个精灵*/
SKSpriteNode *_planeSp;
}
@end
@implementation Start
- (instancetype)initWithSize:(CGSize)size{
if (self = [super initWithSize:size]){
[self makeScene];//创建场景
}
return self;
}
3.创建场景里面的精灵及跳转到另一个场景和创建颗粒,代码如下
- (void)makeScene{
------------------------创建一个label
/**1.创建一个label*/
SKLabelNode *label = [[SKLabelNode alloc] init];
/**2.设置文字*/
label.text = @"飞机大战";
/**3.设置label中心点*/
label.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
/**4.添加到场景上*/
[self addChild:label];
-------------------------创建一个固定精灵
/**1.实例化一个精灵*/
_planeSp = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
/**2.位置*/
_planeSp.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)-250);
/**3.缩放*/
[_planeSp setScale:0.4];
/**4.锚点,即坐标点*/
_planeSp.anchorPoint = CGPointMake(0.5, 0);
/**5.添加到场景上*/
[self addChild:_planeSp];
----------------创建一个移动的精灵
/**1.创建一个精灵*/
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"loading_01"];
/**2.设置精灵的位置*/
sprite.position = CGPointMake(CGRectGetMidY(self.frame)-100, CGRectGetMidY(self.frame));
/**3.添加到场景上*/
[self addChild:sprite];
/**4.动作跑步动画*/
NSMutableArray *array = [NSMutableArray array];
for (int i = 1; i <= 12; i++) {
NSString *name = [NSString stringWithFormat:@"loading_%02d.png",i];
/**4.添加纹理,也就是图片*/
SKTexture *texture = [SKTexture textureWithImageNamed:name];
[array addObject:texture];
}
/**5.跑步动作,只会执行一次*/
SKAction *runAction = [SKAction animateWithTextures:array timePerFrame:0.04];
/**6.重复动作*/
SKAction *repeatAction = [SKAction repeatActionForever:runAction];
/**7.精灵上添加动作*/
[sprite runAction:repeatAction];
#pragma mark--moveBy
// /**8移动动作,动作中MoveBy是以你当前,增加某个坐标,如移动到100,100,当前位置加坐标*/
// SKAction *moveBy = [SKAction moveByX:150 y:0 duration:2];
// /**9.往回移动*/
// SKAction *moveBy2 = [SKAction moveByX:-200 y:0 duration:1];
//
#pragma mark--moveTo
/**10,不管你的当前位置在那,都会移动到指定的固定位置*/
SKAction *moveTo = [SKAction moveToX:300 duration:2];
SKAction *moveTo2 = [SKAction moveToX:1 duration:2];
/**11.缩放,-1表示x轴返转过来,1代表往回旋转的位置,duration移动的时间*/
SKAction *scale = [SKAction scaleXBy:-1 y:1 duration:0];
/**12.队列动作,做完一个再做下一个,可以添加许多动作*/
SKAction *sequence = [SKAction sequence:@[moveTo,scale,moveTo2,scale]];
/**13.添加一个移动动作*/
// [sprite runAction:moveBy];
// [sprite runAction:sequence];
[sprite runAction:[SKAction repeatActionForever:sequence]];
}
/**触摸事件*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
CGPoint point = [[touches anyObject] locationInNode:self];
#pragma mark--判断触摸的点是否在飞机上
/**判断触摸的点是否在飞机上*/
if (CGRectContainsPoint(_planeSp.frame, point)) {
/**1.旋转*/
SKAction *rotate = [SKAction rotateByAngle:M_PI duration:1];
/**2.重复次数*/
SKAction *repeat = [SKAction repeatAction:rotate count:1];
[_planeSp runAction:repeat];
/**3.移动*/
SKAction *moveBy = [SKAction moveByX:0 y:self.size.height duration:2];
/**4.组,可以让多个动作一块移动*/
// SKAction *group = [SKAction group:@[repeat,moveBy]];
// [_planeSp runAction:group];
#pragma mark--切换场景,跳转到另一个场景
/**4.block动作*/
SKAction *blockAt = [SKAction runBlock:^{
/**4.1切换场景*/
MyScene *scene = [MyScene sceneWithSize:self.size];
/**4.2过渡效果*/
SKTransition *transition = [SKTransition doorwayWithDuration:1];
[self.view presentScene:scene transition:transition];
}];
/**5.添加粒子效果,飞机喷火的效果*/
SKAction *blockAction = [SKAction runBlock:^{
SKEmitterNode *emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"fire" ofType:@"sks"]];
/**6.颗粒的位置*/
emitter.position = CGPointMake(0,0);
/**7.添加到飞机上*/
[_planeSp addChild:emitter];
}];
/**8.队列,先重复旋转,再添加火焰,再移动飞机,最后切换到另一个场景(另一个控制器页面)*/
SKAction *sequence = [SKAction sequence:@[repeat,blockAction,moveBy,blockAt]];
/**9.队列添加到飞机上*/
[_planeSp runAction:sequence];
}
}
@end
4.跳转到另一个(第二个)场景
#import "MyScene.h"
@interface MyScene()
{/**创建精灵*/
SKSpriteNode *_sprite;
}
@end
@implementation MyScene
/**设置场景必须调用这个方法*/
- (instancetype)initWithSize:(CGSize)size{
if (self = [super initWithSize:size]) {
[self makeScene];
}
return self;
}
- (void)makeScene{
-------------创建一个固定的场景,并添加一个背景
/**1.创建一个场景*/
SKSpriteNode *bgSprite = [SKSpriteNode spriteNodeWithImageNamed:@"10_0.jpg"];
/**2.设置位置*/
bgSprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
/**3.设置大小是当前场景的尺寸*/
bgSprite.size = self.size;
/**4.系统默认的Z轴坐标是0,如果是这样话会遮挡住添加的那个图片,这里设置成-1*/
bgSprite.zPosition = -1;
/**5.添加到场景*/
[self addChild:bgSprite];
---------------------设置浮动效果
_sprite = [SKSpriteNode spriteNodeWithImageNamed:@"1"];
_sprite.position = CGPointMake(100, 100);
[self addChild:_sprite];
_sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.frame.size.width/2];
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
--------------设置引力,可以理解为地理引力
/**物理世界,设置向下的引力*/
self.physicsWorld.gravity = CGVectorMake(0, -100);
self.physicsWorld.gravity = CGVectorMake(0, 10);
}
/**触摸屏幕事件*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
/**精灵上添加图片,或者说添加一个精灵*/
CGPoint point = [[touches anyObject] locationInNode:self];
_sprite = [SKSpriteNode spriteNodeWithImageNamed:@"1"];
_sprite.position = point;
[self addChild:_sprite];
//添加物理
/**刚体的半径*/
_sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_sprite.size.width/2 -4];
/**方形效果*/
// sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.size];
/**设置场景的边缘,屏幕的边缘,不会移出去*/
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
/**外界给一个外力给力,推力*/
_sprite.physicsBody.velocity = CGVectorMake(0, 200);
}
@end