使用OC链式调用方式简化SpriteKit的动画调用

一,什么是链式调用?

在网络前端编程里使用JQuery,经常可以看到链式调用,代码易读简洁。

例如:$(“#Test”).css(‘color’,’red’).show(200).removeClass(‘style’); 对id选择器为Test的对象进行了三项操作:先设置其字体颜色为红色,再显示对象,最后移除对象的“style”样式。

通过“.”操作符调用方法执行后返回方法执行的实体,然后可以接着再使用“.”操作符继续调用其它方法。

二,Objective-C里面如何实现链式操作?

非常简单,Objective-C语言里面,跟JQuery里面一样,可以使用Block实现链式调用。

摘抄一个网络上提供的实现例子说明:

1,首先定义一个Person对象,然后定义名为eat、learn、play的几个块为成员变量,声明为property属性

@property (nonatomic, readonly) (Person*(^)())eat;
@property (nonatomic, readonly) (Person*(^)())learn;
@property (nonatomic, readonly) (Person*(^)())play;

2,property属性会默认生成setter和getter方法,我们这里覆写getter方法,传出一个Block,Block调用返回调用者本身。

// Person覆写的方法
- ( Person *(^)() )eat
{
return ^{
NSLog(@"吃饭");
return self;
};
}
- ( Person *(^)() )learn
{
return ^{
NSLog(@"学习");
return self;
};
}
- ( Person *(^)() )play
{
return ^{
NSLog(@"娱乐");
return self;
};
}
// 带参数的链式调用
- ( Person *(^)( NSString* food ) )eat
{
return ^( NSString* food ){
NSLog(@"吃饭---- %@",food);
return self;
};
}

链式调用实例:

Person *p = [ [Person alloc] init ];

无参数情况:

p.eat().learn().play();

输出:

吃饭

学习

娱乐

有参数情况:

p.eat(@”意大利面”).learn().play();

输出:

吃饭—-意大利面

学习

娱乐

三,有实战意义吗?如何使用?

哇哇,看起来是个不错的小窍门啊,但是有实战意义吗?能引入什么方便吗?

好吧,之前写过两个SpriteKit的教程,做相关游戏,里面都有提到动画相关的东东。如果我要指挥一个SpriteNode实体,必须指定相关的SKAction然后让该SpriteNode节点,执行SKAction。如果是一个动作还好,但是如果要执行一系列动作,或者同时运行很多动作的话,就要生成很多SKAction,然后把它们组合在一起成为一个sequence或者group的action一起执行。

具体来举例,向右移动100,向上移动100,向左移动50,向上移动100的动画,需要如下实现:

SKAction *move = [SKAction moveBy:CGVectorMake(100, 0) duration:1];
SKAction *move2 =[SKAction moveBy:CGVectorMake(0, 100) duration:1];
SKAction *move3 = [SKAction moveBy:CGVectorMake(-50, 0) duration:1];
SKAction *move4 = [SKAction moveBy:CGVectorMake(0, 100) duration:1];
SKAction *seq = [SKAction sequence:@[move,move2,move3,move4]];
[SpriteNode runAction:seq];

我自己封装了一个WJSAction的类,可以实现SKAction的链式调用,Github工程地址为https://github.com/halinuya/WJSAction.git,完成上面的调用,仅用如下一行就可以实现。

[SpriteNode runAction:[WJSACTION.SeqStart().moveByV(CGVX(100),1).moveByV(CGVY(100),1).moveByV(CGVX(-50),1).moveByV(CGVY(100),1).SeqEnd()]];

看起来比较简单简洁,不需要很多中间变量。

大家可以到我封装的WJSAction工程里面直接使用链式SKAction,简化代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值