你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 使用OC鏈式調用方式簡化SpriteKit的動畫調用

使用OC鏈式調用方式簡化SpriteKit的動畫調用

編輯:IOS開發基礎

一,什麼是鏈式調用?

在網絡前端編程裡使用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,簡化代碼。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved