betway必威登录SpriteKit框架的极全动作介绍 没有之一。SpriteKit之漫谈SKAction常用属性。

</b>

betway必威登录 1

斩断投机的余地,才能够更好地赢得出路。在很多时节,我们还亟需同种植斩断投机退路的胆子。

</br>

</b>

SKAction属性介绍


</br>

每当使动作过程当中,对于性的安装是必要的,本文将说说太常用之特性,分别是速度,时间,曲线方式.下面就分开模块说一下叔独常因此之属于性.我们先是先拿咱的准备工作做好,创建好背景与灵活,代码如下所示.
#import "GameScene.h"

@implementation GameScene

-(instancetype)initWithSize:(CGSize)size{

    if (self = [super initWithSize:size]) {

        self.backgroundColor = [SKColor whiteColor];

    }

    return self;

}

-(void)didMoveToView:(SKView *)view{

    [super didMoveToView:view];

    [self backgroundNode];

    [self planeNode];


}

#pragma mark ----创建背景----

-(void)backgroundNode{

    SKSpriteNode *backgroundNode = [SKSpriteNode spriteNodeWithImageNamed:@"bg_02.jpg"];

    backgroundNode.position = CGPointZero;

    backgroundNode.zPosition = 0;

    backgroundNode.anchorPoint = CGPointZero;

    backgroundNode.size = self.size;

    [self addChild:backgroundNode];



}

#pragma mark ---- 创建两个飞船 ----

-(void)planeNode{

    SKSpriteNode *planeNode = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode.position = CGPointMake(self.size.width/2, self.size.height/2);

    planeNode.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode.zPosition = 1;

    planeNode.name = @"plane";

    [self addChild:planeNode];


    SKSpriteNode *planeNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode1.position = CGPointMake(self.size.width/2+100, self.size.height/2);

    planeNode1.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode1.zPosition = 1;

    planeNode1.name = @"plane1";

    [self addChild:planeNode1];

}

</br>

SKAction简介


在原先之博客中即说罢,动作是一个游玩受不可少的,比如移动,形状的变换等等.比如”超级马里深处”中的马里奥的移动,以及蘑菇,怪兽之运动还是要动作的支持的.

在SpriteKit框架中凡是为此SKAction类来兑现动作.一个SKAction实例是一个动作,通过SKScene场景中的节点来施行。动作可绑定到节点上,用以改变节点的布局以及情节,有时也得以改变面貌。当场景处理其子节点的上,与这些节点相关联的动作将为计算。由于SKAction动作类型过多,所以自己就先用生图进行了分割类.

</br>

speed(速度属性)


SKAction分类


</b>

速度因素调整动作的动画片速度。例如,速度2.0倍意味着动画运行速度的星星倍增。速度之默认值为1.0.底下就API文档中的SKAction的speed属性的介绍.

</b>

betway必威登录 2

准备干活

下面有的动作前提准备都是同的,我们不怕为微信打飞机的面貌吧实例,具体代发如下

-(instancetype)initWithSize:(CGSize)size{

    if (self = [super initWithSize:size]) {

        self.backgroundColor = [SKColor whiteColor];

    }

    return self;

}

-(void)didMoveToView:(SKView *)view{

    [super didMoveToView:view];

    [self backgroundNode];

    [self planeNode];


}

#pragma mark ----创建背景----

-(void)backgroundNode{

    SKSpriteNode *backgroundNode = [SKSpriteNode spriteNodeWithImageNamed:@"bg_02.jpg"];

    backgroundNode.position = CGPointZero;

    backgroundNode.zPosition = 0;

    backgroundNode.anchorPoint = CGPointZero;

    backgroundNode.size = self.size;

    [self addChild:backgroundNode];



}

#pragma mark ---- 创建飞船 ----

-(void)planeNode{

    SKSpriteNode *planeNode = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode.position = CGPointMake(self.size.width/2, self.size.height/2);

    planeNode.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode.zPosition = 1;

    planeNode.name = @"plane";

    [self addChild:planeNode];

}

</br>

状况示意图

</br>

下就因故有限个机智说明速度属于性.代码如下.
#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction *moveAction = [SKAction moveToY:0 duration:1];

    //设置速度
    moveAction.speed = 0.5;

    [planeNode runAction:moveAction];

    SKSpriteNode *planeNode1 = (SKSpriteNode *)[self childNodeWithName:@"plane1"];

    SKAction *moveAction1 = [SKAction moveToY:0 duration:1];

    //设置速度
    moveAction1.speed = 2;

    [planeNode1 runAction:moveAction1];
}


@end

倒动作

移步动作在一个戏被凡极端广泛的动作了.移动动作要分为以点的形式活动与以偏移量的花样移动.且听我慢慢道来.
</br>

  • ##### 其中以点的样式活动的主要有三独SKAction类方法来创建.

+ (SKAction *)moveTo:(CGPoint)location duration:(NSTimeInterval)sec;

location: 用来指定节点移动至的位置.
sec:用来指定移动动作所急需的时间.
</br>

+ (SKAction *)moveToX:(CGFloat)x duration:(NSTimeInterval)sec;

x: 用来指定节点的x轴上活动及的位置.节点的y轴上的价值未变化.
sec:用来指定移动动作所待之时间.
</br>

+ (SKAction *)moveToY:(CGFloat)y duration:(NSTimeInterval)sec;

y: 用来指定节点的y轴上运动至之位置.节点的x轴上之价不变化.
sec:用来指定移动动作所用之时间.
</br>
</br>

  • ##### 以偏移量的形式活动主要发生个别种植简单种植类方法.

+ (SKAction *)moveBy:(CGVector)delta duration:(NSTimeInterval)sec;

delta:是一个矢量,用力啊指定偏移量,类型也CGVector,CGVector是一个可怜简短的结构体,有dx和dy组成.dx代表x轴上之偏移量,dy表示y轴上的偏移量.结构体形式而下.

struct CGVector {
    CGFloat dx;
    CGFloat dy;
};

sec:用来指定移动动作所欲的时间.
</br>

+ (SKAction *)moveByX:(CGFloat)deltaX y:(CGFloat)deltaY duration:(NSTimeInterval)sec;

deltaX:表示在x轴上的偏移量.
deltaY:表示以y轴上之偏移量.
sec:用来指定移动动作所要之时间.

  • ##### 示例:

#pragma mark ---- 以点的形式移动飞船 ----

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    UITouch *touch = [touches anyObject];

    CGPoint  position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveTo:position duration:1];

    [planeNode runAction:moveAction];


}


#pragma mark ---- 以偏移量的形式移动飞船 ----

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveBy:CGVectorMake(50, 50) duration:1];

    [planeNode runAction:moveAction];


}

</b>
方的各自以点的款式与偏移量的款式做出了演示,我们看一下效应图.当我们各个一样次于点击屏幕的时节接触移动动作,下面我们便扣留一下零星种植形式之效用图有哪里不同.

坐碰式活动效果图

盖偏移量形式活动效果图

</br>

效能图如下所示.

betway必威登录 3

效果图

</br>

转动作

打闹受之体的转大多需要用之盘动作,旋转动作之开创方法只有生一致种植,如下所示.

+ (SKAction *)rotateByAngle:(CGFloat)radians duration:(NSTimeInterval)sec;

sec:用来指定旋转动作所欲的时间.
radians:用来指定精灵或者其他节点的团团转量,以弧度为单位;下面所著之常用之角度(框架自带).

#define M_PI        3.14159265358979323846264338327950288   /* 180度             */
#define M_PI_2      1.57079632679489661923132169163975144   /* 90度           */
#define M_PI_4      0.785398163397448309615660845819875721  /* 45度          */
  • ##### 旋转示例:

#pragma mark --- 添加旋转动作 ---

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    SKSpriteNode *windmillNode = (SKSpriteNode *)[self childNodeWithName:@"windmillNode"];

    //删除所有的动作
    [windmillNode removeAllActions];

    SKAction *rotateAction = [SKAction rotateByAngle:M_PI*2 duration:0.3];

    [windmillNode runAction:rotateAction];

}

地方是为一个扇车的快为条例,做旋转动作,每当点击屏幕,精灵就见面旋转360度过.效果图要下.

转效果图

</br>

duration(时间属性)


路线动作

每当嬉戏经过遭到,经常会逢有怪物,它们会按一定之路劲轨迹不断的行路,在SKAciton中即来针对路线动作之创建形式,其经常因此语法形式如下

+ (SKAction *)followPath:(CGPathRef)path duration:(NSTimeInterval)sec;

path:用来指定一个CGPathRef路径,这个途径就是是乖巧的运动路径.
sec:指定这个路子动作一气呵成所用之时间.
</br>

对比于点比较常用的艺术外,下面的语法形式则应算的达成客的增高版,其中包对那路径的接触相对性,以及Z轴的盘属性都好拓展设置操作.

+ (SKAction *)followPath:(CGPathRef)path asOffset:(BOOL)offset orientToPath:(BOOL)orient duration:(NSTimeInterval)sec;

</br>

  • ##### 路径示例:

下面就盖一个矩形路径为示范,给节点添加路径动作,让该展开移动.

#pragma mark ---- 以路径的形式移动飞船 ----

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    CGRect createRect = CGRectMake(0, 0, 100, 100);

    CGPathRef path = CGPathCreateWithRect(createRect, nil);

    SKAction * moveAction =  [SKAction followPath:path duration:2];

    [planeNode runAction:moveAction];

}

</b>
经下面的机能图我们就算可知道路的触及是相对路径.而且节点Z轴在打转的时光属性为是有变更的.

</br>

脚的尽管是一体化版本的途径动作创建.然后我们通过修改Offset(是否是相对路径),以及orientToPath(节点Z轴在转动的时刻属性是否来转移).这两属性看看效果各发什么不同.

#pragma mark ---- 以路径的形式移动飞船 ----

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    CGRect createRect = CGRectMake(0, 0, 100, 100);

    CGPathRef path = CGPathCreateWithRect(createRect, nil);

    SKAction * moveAction =  [SKAction followPath:path asOffset:YES orientToPath:YES duration:2];

    [planeNode runAction:moveAction];


}

</b>
在 *** + (SKAction *)followPath:(CGPathRef)path
duration:(NSTimeInterval)sec; **
这个艺术中默认的offset是YES,orient也是YES,也就是说要上面的代码执行的言辞,是和最常用之措施的效用图一律的,现在我们不怕先就修改offset的价为NO.会发现节点是盖绝对路径进行活动的,也便是均等节点的父类坐标系为条件,进行动作的执行.

offset的值为NO

</b>
连着下去我们唯有修改orient的价为NO,其他非变换,我们见面意识节点Z轴是没产生任何变更之.

</br>

怀念只要装或是赢得动作所需要的年月,需要利用及duration这个属于性.在API文章的duration属性介绍如下图所示.

</b>

betway必威登录 4

API文档中duration属性介绍

</b>
以面的快慢代码中,我们一直上加上取得时间的代码.如下所示,修改duration属性也是相同,这里我们只有做赢得之操作.

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction *moveAction = [SKAction moveToY:0 duration:1];

    //设置速度
    moveAction.speed = 0.5;

    [planeNode runAction:moveAction];

    SKSpriteNode *planeNode1 = (SKSpriteNode *)[self childNodeWithName:@"plane1"];

    SKAction *moveAction1 = [SKAction moveToY:0 duration:1];

    //设置速度
    moveAction1.speed = 2;

    [planeNode1 runAction:moveAction1];

    NSLog(@"动作一的所需时间:%f",moveAction.duration);

    NSLog(@"动作二的所需时间:%f",moveAction1.duration);


}


@end

反向动作

反向动作虽是景中之节点原来往一个样子进行移动,但是于运行时这些节点也于相反的防线进行了挪,如果想只要促成反向运动,就需要使用到反向运动,反向运动的开创方法呢目标方法,是以一个动作调用- (SKAction *)reversedAction;回到动作就会说这个动作的反向动作.
其语法形式如下所示.

- (SKAction *)reversedAction;

</br>

  • ##### 反向示例:

尽管那么方面的路程径动作为例,我们创建它的反向动作,为了更生动形象,我给动作之触发设置了一个BOOL,具体的示范代码如下.

#pragma mark ---- 以反向形式移动飞船 ----

BOOL isReversed = YES;//设置监控反向的BOOL值.

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    isReversed = ! isReversed;

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    CGRect createRect = CGRectMake(0, 0, 100, 100);

    CGPathRef path = CGPathCreateWithRect(createRect, nil);

    SKAction * moveAction =  [SKAction followPath:path duration:2];

    SKAction *reversedAction = [moveAction reversedAction];

    if (isReversed) {
        [planeNode runAction:moveAction];

    }else{

        [planeNode runAction:reversedAction];

    }

}

</br>

正如图所示,这就算是反朝动作的效果图

反而往功能图.gif

</br>

控制台打印信息如下.我们视咱们得到了动作的辰属性.

betway必威登录 5

</br>

快动作

快动作一般是相当着别的位置动作下的,其实不单有速度动作还有速度属性,我们可以被得定的速值来改变面貌中节点执行动作之快.速度动作一个起半点单创造方式,一个凡是设置一个稳住的速度,加速度为0.一个是装一定的增速度.即速增量.语法形式要下.
</b>

+ (SKAction *)speedTo:(CGFloat)speed duration:(NSTimeInterval)sec;

speed:指定节点运动的速度.
sec:指定完成动作所用之时间

+ (SKAction *)speedBy:(CGFloat)speed duration:(NSTimeInterval)sec;

speed:指定节点运动的加速度.即速增量
sec:指定完成动作所需要之日子

</br>

  • ##### 速度示例:

首先是固定的速之代码示例,不过在此之前,+ (SKAction *)group:(NSArray<SKAction*> *)actions;若果举行一下对接下,这是只组动作,可以管有限独动作在同实施,主要的是简单个动作是同时执行.下面我们见面说交者动作之.这里需要引用一下这个动作.

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveTo:position duration:3];

    SKAction *speedAction = [SKAction speedTo:5 duration:1];

    SKAction *groupAction = [SKAction group:@[
                                              moveAction,
                                              speedAction
                                              ]];

    [planeNode runAction:groupAction];
}

</b>
咱看一下功力图,发现节点整体都是坐一个一定的进度做了每一样次走的.

效果图.gif

</br>
连着下去是为一贯的快增量来来运动.示例代码如下

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveTo:position duration:3];

    SKAction *speedAction = [SKAction speedBy:5 duration:1];

    SKAction *groupAction = [SKAction group:@[
                                              moveAction,
                                              speedAction
                                              ]];

    [planeNode runAction:groupAction];
}

下的马上力量图和方面的职能图一律对照,发现,节点的速是无休止增多的.

</br>

timingMode(曲线方式属性)


组动作

组动作,我们当面的位移操作的演示中一度举行了简单的示范,组合动作其实就是是吧两独或简单独以上的动作在一起而执行,组合动作最深的表征就是是同时性,不管几只动作还是以实行的.其语法形式如下:

</b>

+ (SKAction *)group:(NSArray<SKAction*> *)actions;

actions:是一个数组类型,数组中之要素是SKAction.

</br>

  • ##### 组动作演示:

组动作示例的演示代码就不多说了,大家就是参照着上面的速动作的演示代码就好了,当然了,组动作是可另外的动作相当下的.

</br>

动作之曲线方式实际上就是动画片总体变化之年月曲线,动作之曲线方式的安装及取得需要采用及timingMode这个一个特性,timingMode的取值一共发生4单,如下表所示.
曲线方式 功能
SKActionTimingLinear 动画在其持续时间内平均分布
SKActionTimingEaseIn 动画在开始的时候较慢,然后渐渐加快
SKActionTimingEaseOut 动画开始的时候较快,然后渐渐变慢
SKActionTimingEaseInEaseOut 动画开始的时候慢,然后渐渐加速到中间,然后在渐渐变慢到完成

</br>

行动作

班动作跟组动作一样,是一个结动作,序列动作从字面上来拘禁,最要命之特色就是是顺序.序列动作的动状况是差不多个动作要一个一个依次执行,这时候就需因此到队动作.

+ (SKAction *)sequence:(NSArray<SKAction*> *)actions;

actions:是一个数组类型,数组中之素是SKAction.

</br>

  • ##### 序列动作演示:

排动作的言传身教,我便因故有限个走动作,当自己点击屏幕的下,飞船会飞至点击来,然后以返回初始位置.代码如下

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveTo:position duration:1];
    SKAction *moveZeroAction = [SKAction moveTo:CGPointMake(self.size.width/2, self.size.height/2) duration:1];

    SKAction *groupAction = [SKAction sequence:@[
                                                 moveAction,
                                                 moveZeroAction

                                              ]];

    [planeNode runAction:groupAction];
}

</b>
意义图如下

效果图.gif

</br>

若不对准曲线方式属性进行设置的话,默认的凡SKActionTimingLinear.下面我们尽管因故看一下代码示例.我们在速度代码的基础及加以修改,来验证曲线方式.
#pragma mark ---- 创建两个飞船 ----

-(void)planeNode{

    SKSpriteNode *planeNode = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode.position = CGPointMake(self.size.width/2, self.size.height/2);

    planeNode.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode.zPosition = 1;

    planeNode.name = @"plane";

    [self addChild:planeNode];

    SKSpriteNode *planeNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode1.position = CGPointMake(self.size.width/2+100, self.size.height/2);

    planeNode1.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode1.zPosition = 1;

    planeNode1.name = @"plane1";

    [self addChild:planeNode1];

    SKSpriteNode *planeNode2 = [SKSpriteNode spriteNodeWithImageNamed:@"飞机.png"];

    planeNode2.position = CGPointMake(self.size.width/2-100, self.size.height/2);

    planeNode2.anchorPoint = CGPointMake(0.5, 0.5);

    planeNode2.zPosition = 1;

    planeNode2.name = @"plane2";

    [self addChild:planeNode2];

}

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction *moveAction = [SKAction moveToY:0 duration:2];

    //设置曲线方式
    moveAction.timingMode = SKActionTimingEaseIn;


    [planeNode runAction:moveAction];

    SKSpriteNode *planeNode1 = (SKSpriteNode *)[self childNodeWithName:@"plane1"];

    SKAction *moveAction1 = [SKAction moveToY:0 duration:2];

    //设置曲线方式
    moveAction1.timingMode = SKActionTimingEaseOut;

    [planeNode1 runAction:moveAction1];

    SKSpriteNode *planeNode2 = (SKSpriteNode *)[self childNodeWithName:@"plane2"];

    SKAction *moveAction2 = [SKAction moveToY:0 duration:2];

    //设置曲线方式
    moveAction2.timingMode = SKActionTimingEaseInEaseOut;

    [planeNode2 runAction:moveAction1];


}

又动作

更动作与一个动作运行往往或者多不行,其中又动作分为无限重复和具备自然次数的重复.其中有数种语法形式而下.

//无限重复
+ (SKAction *)repeatActionForever:(SKAction *)action;

//具有一定次数的重复
+ (SKAction *)repeatAction:(SKAction *)action count:(NSUInteger)count;

action:用来指定重复的动作.
count:用来指定重复的次数.

</br>

  • ##### 重复动作演示:

俺们即便以地方的以身作则列动作演示来补加在更动作之中.如下代码所示.

#pragma mark ---- 移动飞船 ----

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction * moveAction =  [SKAction moveTo:position duration:1];
    SKAction *moveZeroAction = [SKAction moveTo:CGPointMake(self.size.width/2, self.size.height/2) duration:1];

    SKAction *groupAction = [SKAction sequence:@[
                                                 moveAction,
                                                 moveZeroAction

                                              ]];


    SKAction * repeatAction  = [SKAction  repeatActionForever:groupAction];

    [planeNode runAction:repeatAction];
}

意义图如下,当我们点击屏幕的一个职务的当儿,飞船会没完没了的来往移动.

</br>

成动作注意事项:
地方叙述的组动作,序列动作,重复动作是以子动作的不二法门包含其他动作:
一个行列动作被产生差不多只子动作,序列中的诸一个动作在眼前一个动作结束前起。
一个组动作着起差不多只子动作,动作组中的保有动作同时起履行。
一个还动作受到仅发一个子动作,当还动作被的子动作好时,重复动作将更开实行。
方三种动作好嵌套使用,这种假设动作结合起来的力可以帮忙您啊节点添加非常复杂的动作。

</br>

下面我们就看一下力量图,

betway必威登录 6

依次精灵对象设置的曲线方式

betway必威登录 7

效果图

</br>


总结:SKAction常用属性速度,时间,曲线方式基本就形容及及时了.下一首博客,就是耍受的关键性:物理引擎,希望大家关心,谢谢.最后废话不多说,Demo双手奉上.

</b>

块动作

片动作其实就算是管动作的全部实施进程置于一个Block块中,其中语法形式要出些许栽,一种植是常用之,另外一种是富含线程的.其语法形式而下.

+ (SKAction *)runBlock:(dispatch_block_t)block;

寓GCD线程相关的语法形式要下.

+ (SKAction *)runBlock:(dispatch_block_t)block queue:(dispatch_queue_t)queue;

block:指定执行之block块的系列动作
queue:指定GCD线程

</br>

  • ##### 块动作演示代码

属在以点的还动作的言传身教代码基础及来开,效果图虽使齐了,但是其实的实现过程是发生分之,示例代码如下.

#pragma mark ---- 移动飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction *blockAction  = [SKAction runBlock:^{

        SKAction * moveAction =  [SKAction moveTo:position duration:1];
        SKAction *moveZeroAction = [SKAction moveTo:CGPointMake(self.size.width/2, self.size.height/2) duration:1];

        SKAction *groupAction = [SKAction sequence:@[
                                                     moveAction,
                                                     moveZeroAction

                                                     ]];


        SKAction * repeatAction  = [SKAction  repeatActionForever:groupAction];

        [planeNode runAction:repeatAction];

    }];


    [planeNode runAction:blockAction];
}

</br>

–>动作的性Demo

透明度动作

透明度动作就是因定节点的透明度的动作,虽然看起比较简单,但是语法形式较多,下面就是留心的求证各个语法形式.

</b>

下的片个语法是无须指定alpha值的,一个alpha值为1,一个为0,我们只是待设定两者的动作时便好了.

//alpha值为1
+ (SKAction *)fadeInWithDuration:(NSTimeInterval)sec;

//alpha值为0
+ (SKAction *)fadeOutWithDuration:(NSTimeInterval)sec;

</b>

下面的语法是索要指定alpha值的.

+ (SKAction *)fadeAlphaTo:(CGFloat)alpha duration:(NSTimeInterval)sec;

</b>

下的语法是亟需指定alpha值的增量.

+ (SKAction *)fadeAlphaBy:(CGFloat)factor duration:(NSTimeInterval)sec;

</br>

  • ##### 透明度动作的言传身教

本身不怕以略的绝不指定的透明度的动作为示例.

#pragma mark ---- 飞船的透明度 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];


    SKAction *alphaInAction  = [SKAction fadeInWithDuration:1];

    SKAction *alphaOutAction = [SKAction fadeOutWithDuration:1];

    SKAction *repeatAction = [SKAction repeatActionForever:[SKAction sequence:@[
                                                                                alphaOutAction,
                                                                                alphaInAction
                                                                                ]]];


    [planeNode runAction:repeatAction];
}

当我们点击屏幕的时,效果图要下.

</br>

躲/显示动作

躲藏/显示动作以及整体效果看起和透明度的完整效应差不多,但是还是产生局部界别的,透明度就是改变之是透明度,节点还是在于场面上的,而藏身/显示动作是当真躲了,节点是勿存与场景之中的.其语法形式要下.

//显示节点
+ (SKAction *)hide;

//隐藏节点
+ (SKAction *)unhide;

</br>

  • ##### 隐藏/显示动作示例.

</b>
isHide是自家设置的一个监察之亮/隐藏的BOOL值.不多说,直接上代码.

#pragma mark ---- 隐藏/显示飞船 ----

BOOL isHide = YES;

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    isHide = !isHide;

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];


    SKAction *hideAction  = [SKAction hide];

    SKAction *unhideAction = [SKAction unhide];

    if (isHide) {

        [planeNode runAction:unhideAction];


    }else{

        [planeNode runAction:hideAction];

    }
}

功效图如下所示,每当我接触屏幕的下,飞船的示和隐身状态就会出改变.

</br>

尺寸动作

尺寸动作虽用来修改节点的尺寸的.其语法形式有以下几栽,分别是因目标价调整尺寸,单独调节目标节点的莫大要增幅,以增量的款式调节整体的尺寸.具体语法形式而下.

以目标价调整尺寸

+ (SKAction *)resizeToWidth:(CGFloat)width height:(CGFloat)height duration:(NSTimeInterval)duration;

单独调节目标节点的高度要增幅的少数种植形式语法如下

//调整宽度
+ (SKAction *)resizeToWidth:(CGFloat)width duration:(NSTimeInterval)duration;

//调整高度
+ (SKAction *)resizeToHeight:(CGFloat)height duration:(NSTimeInterval)duration;

因增量的款型调节整体的尺寸.

+ (SKAction *)resizeByWidth:(CGFloat)width height:(CGFloat)height duration:(NSTimeInterval)duration;

</br>

  • ##### 尺寸动作示例:

废话不多说,直接上代码.以因为目标价调整尺寸为例.

#pragma mark ---- 改变尺寸飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction  *sizeAction = [SKAction resizeToWidth:200 height:200 duration:0.5];

    [planeNode runAction:sizeAction];
}

力量图要下.

</br>

缩放动作

缩放动作就是是本着节点进行缩放操作.其语法形式与尺寸动作类似,一共有三栽,语法形式要下.

因为缩放倍数缩放如下.

+ (SKAction *)scaleTo:(CGFloat)scale duration:(NSTimeInterval)sec;

//对宽和高以不同的缩放比例缩放.
+ (SKAction *)scaleXTo:(CGFloat)xScale y:(CGFloat)yScale duration:(NSTimeInterval)sec;

独自对富裕和赛进行缩放.

//宽度缩放
+ (SKAction *)scaleXTo:(CGFloat)scale duration:(NSTimeInterval)sec;

//高度缩放
+ (SKAction *)scaleYTo:(CGFloat)scale duration:(NSTimeInterval)sec;

以增量值进行缩放.

+ (SKAction *)scaleBy:(CGFloat)scale duration:(NSTimeInterval)sec;

//对宽和高以不同的缩放比例增量值缩放.
+ (SKAction *)scaleXBy:(CGFloat)xScale y:(CGFloat)yScale duration:(NSTimeInterval)sec;

</br>

  • ##### 缩放动作演示:

脚就一律最简易的缩放形式进行缩放,其他的缩放类似

#pragma mark ---- 缩放飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction  *sizeAction = [SKAction scaleTo:2 duration:1];

    [planeNode runAction:sizeAction];
}

效果图如下

</br>

颜色动作

水彩动作其实是改变节点的颜料跟混合因子,语法形式共有个别种,一栽是特改变混合因子,另外一种植是反颜色跟交集因子,对于混合因子,类型也CGFloat类型,可以知晓吧颜色的浓度度.具体的语法形式而下.

单变动混合因子

+ (SKAction *)colorizeWithColorBlendFactor:(CGFloat)colorBlendFactor duration:(NSTimeInterval)sec;

再者更改混合因子与颜色

+ (SKAction *)colorizeWithColor:(SKColor *)color colorBlendFactor:(CGFloat)colorBlendFactor duration:(NSTimeInterval)sec;

</br>

  • ##### 颜色动作演示:

下面为仅变动混合因子为示例.

#pragma mark ---- 改变飞船的颜色 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction  *sizeAction = [SKAction colorizeWithColorBlendFactor:0.66 duration:1];

    [planeNode runAction:sizeAction];
}

功能图如下.通过功能图我们会发现飞机整体的水彩会转换浅.

</br>

变更纹理的动作

改纹理的动作,这个动作其实可以掌握吧凡让一个游戏物体动起来,我们看看众多游戏还是这样的,例如下面的爆裂效果图.对于此动作其实是使整合当下纹理集进行落实之,改变纹理的动作吧是比常用的一个动作,具体内容查看SpriteKit框架之SKTextureAtlas立马首文章.
(重要等级:⭐️⭐️⭐️⭐️⭐️)

</br>

待动作

等候动作为叫延时动作.也是以玩耍受时常应用的一个动作,经常为别动作配合使用.其语法形式共有零星种植,比较突出的啊一样种形式是好竭尽全力啊指定演示时间的界定的.代码如下.

旋即等同种延时动作不得不指定延时的时刻

+ (SKAction *)waitForDuration:(NSTimeInterval)sec;

就无异于栽延时动作是好用来指定延时时间之范围.

+ (SKAction *)waitForDuration:(NSTimeInterval)sec withRange:(NSTimeInterval)durationRange;

sec:指定延时的时间.
durationRange:指定延时时间之范围.

</br>

  • ##### 等待动作演示:

俺们就算以点的转移飞创的颜料的动作也底蕴进行等待动作之丰富,代码如下.

#pragma mark ---- 改变飞船的颜色 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];

    SKAction  *sizeAction = [SKAction colorizeWithColorBlendFactor:0.66 duration:5];


    SKAction *waitAction  = [SKAction waitForDuration:1];

    [planeNode runAction:[SKAction sequence:@[
                                              waitAction,
                                              sizeAction
                                              ]]];
}

咱们看一下意义图,当自身点击了屏幕之后,移开鼠标,等待5秒之后.改变颜色动作才见面执行.

</br></br>

自定义动作

设系统的动作还免克满足我们的急需怎么收拾?这时候,我们可以从定义动作,自定义有我们想只要贯彻之机能.其语法形式要下.

+ (SKAction *)customActionWithDuration:(NSTimeInterval)seconds actionBlock:(void (^)(SKNode *node, CGFloat elapsedTime))block;

seconds:指定由定义动作形成所待的岁月
block:block块内指定由定义动作betway必威登录的内容.

</br>

  • ##### 自定义动作演示:

废话不多说,直接上代码

#pragma mark ---- 改变飞船的坐标 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    CGPoint position = [touch locationInNode:self];

    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];


    SKAction *myMoveAction = [SKAction customActionWithDuration:1 actionBlock:^(SKNode * _Nonnull node, CGFloat elapsedTime) {


        SKSpriteNode *plane= (SKSpriteNode *)node;

        plane.position= CGPointMake(position.x, position.y);


    }];

    [planeNode runAction: myMoveAction];

}

效能图要下.

</br></br>

除去动作.

抹动作虽是抹动作,当我们不欲节点的时段,我们可用删除动作去节点.其语法形式而下.

+ (SKAction *)removeFromParent;

</br>

剔除动作演示:

废话不多说,直接上代码,效果图不纵添加了,就是直删除飞船了.

#pragma mark ---- 删除飞船 ----


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];


    [planeNode runAction: [SKAction removeFromParent]];

}

</br>
</br>

末说少句


</b>

SpriteKit所有的动作都以当时了,SKAction创建形式比较多.所以博客篇幅较丰富,这吗未尝法,建议上之当儿每一个艺术还测试一下,因为只有测试后,你才能够懂得他的用处与注意事项,建议本篇博客上时光呢3天.吓了,SKAction动作相关创建方式就是说这么多矣!如果您看就首博客对而有所助就点赞支持一下嘛,没拉就无须碰了,毕竟没有帮忙到你是自己不过深的砸~~😂