91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

了解CCMoveTo   CCCallFuncN   CCSequence用法

發布時間:2020-04-04 03:38:06 來源:網絡 閱讀:602 作者:新風作浪 欄目:開發技術

在《iPhone & iPad Cocos2D游戲開發實戰》一書中在看第四章時候遇到陌生知識,然后在網上找到相關知識點,再此記錄;

由序列控制蜘蛛的移動方法代碼

-(void) runSpiderMoveSequence:(CCSprite*)spider { // 隨著時間慢慢增加蜘蛛的移動速度  numSpidersMoved++;//定義的int型變量 if (numSpidersMoved % 8 == 0 && spiderMoveDuration > 2.0f) { spiderMoveDuration -= 0.1f; } // 用于控制蜘蛛移動的動作序列 CGPoint belowScreenPosition = CGPointMake(spider.position.x, -[spider texture].contentSize.height); CCMoveTo* move = [CCMoveTo actionWithDuration:spiderMoveDuration position:belowScreenPosition]; CCCallFuncN* call = [CCCallFuncN actionWithTarget:self selector:@selector(spiderBelowScreen:)]; CCSequence* sequence = [CCSequence actions:move, call, nil]; [spider runAction:sequence];  } 

RunSpiderMoveSequence方法的作用是跟蹤已被放下的蜘蛛數量。每次到第八個蜘蛛時,spiderMoveDuration的值就會被減少,從而提高所有蜘蛛的移動速度。%這個符號叫作“余數運算子”(Modulus Operator),用于得到運用除法以后得到的余數。比如,如果numSpidersMoved可以用8除盡,那么“余數運算子”的計算結果就應該是0。

這里用到的動作序列只有一個CCMoveTo動作和一個CCCallFuncN動作。你可以改進蜘蛛的行為,比如讓它往下移動一點,等個幾秒鐘,然后一直移動到底部,就像真的邪惡的蜘蛛通常會做的那樣。我將把具體的做法留給你去發揮。我選擇CCCallFuncN的目的是給spiderBelowScreen方法傳遞蜘蛛精靈作為它的sender變量。這樣的話,當某只蜘蛛到達屏幕底部時,我就可以直接引用那個蜘蛛,不需要再去到處找了 


1.CCMoveTo  

表示移動到某一個點,還有一個與它類似的CCMoveBy表示移動相對于當前位置某個位置,相當于一個向量;


2.CCCallFuncN

CCCallFuncN 帶有一個參數,這個參數本身是一個Action,相當于他的參數就是一個BUtton;與它類似的還有

CCCallFunc 不帶參數, 執行回調函數方法,

CCCallFuncND 帶兩個參數,一個是Action動作,另一個是自定義的參數

CCCallFuncO 也是兩個參數,和CCCallFuncN參數一樣,


以下是幾個類在CCActionInstant.m文件中的定義,通過他們的-(void)execute函數看出他們參數問題

// // CallFunc // #pragma mark CCCallFunc  @implementation CCCallFunc  @synthesize targetCallback = targetCallback_;  +(id) actionWithTarget: (id) t selector:(SEL) s { 	return [[[self alloc] initWithTarget: t selector: s] autorelease]; }  -(id) initWithTarget: (id) t selector:(SEL) s { 	if( (self=[super init]) ) { 		self.targetCallback = t; 		selector_ = s; 	} 	return self; }  -(NSString*) description { 	return [NSString stringWithFormat:@"<%@ = %p | Tag = %ld | selector = %@>", 			[self class], 			self, 			(long)tag_, 			NSStringFromSelector(selector_) 			]; }  -(void) dealloc { 	[targetCallback_ release]; 	[super dealloc]; }  -(id) copyWithZone: (NSZone*) zone { 	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_]; 	return copy; }  -(void) update:(ccTime)time { 	[self execute]; }  -(void) execute { 	[targetCallback_ performSelector:selector_]; } @end   
 // // CallFuncN // #pragma mark CCCallFuncN  @implementation CCCallFuncN  -(void) execute { 	[targetCallback_ performSelector:selector_ withObject:target_]; } @end   
 // // CallFuncND // #pragma mark CCCallFuncND  @implementation CCCallFuncND  @synthesize callbackMethod = callbackMethod_;  +(id) actionWithTarget:(id)t selector:(SEL)s data:(void*)d { 	return [[[self alloc] initWithTarget:t selector:s data:d] autorelease]; }  -(id) initWithTarget:(id)t selector:(SEL)s data:(void*)d { 	if( (self=[super initWithTarget:t selector:s]) ) { 		data_ = d;  #if COCOS2D_DEBUG 		NSMethodSignature * sig = [t methodSignatureForSelector:s]; // added 		NSAssert(sig !=0 , @"Signature not found for selector - does it have the following form? -(void)name:(id)sender data:(void*)data"); #endif 		callbackMethod_ = (CC_CALLBACK_ND) [t methodForSelector:s]; 	} 	return self; }  -(id) copyWithZone: (NSZone*) zone { 	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_ data:data_]; 	return copy; }  -(void) dealloc { 	// nothing to dealloc really. Everything is dealloc on super (CCCallFuncN) 	[super dealloc]; }  -(void) execute { 	callbackMethod_(targetCallback_,selector_,target_, data_); } @end   
 @implementation CCCallFuncO @synthesize  object = object_;  +(id) actionWithTarget: (id) t selector:(SEL) s object:(id)object { 	return [[[self alloc] initWithTarget:t selector:s object:object] autorelease]; }  -(id) initWithTarget:(id) t selector:(SEL) s object:(id)object { 	if( (self=[super initWithTarget:t selector:s] ) ) 		self.object = object;  	return self; }  - (void) dealloc { 	[object_ release]; 	[super dealloc]; }  -(id) copyWithZone: (NSZone*) zone { 	CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ selector:selector_ object:object_]; 	return copy; }   -(void) execute { 	[targetCallback_ performSelector:selector_ withObject:object_]; }  @end 

3.CCSequence 

sequence是用來按順序執行一系列的動作,即動作按排列的順序一個接一個的執行,示例如下:

id action1 = [CCMoveTo actionWithDuration:2 position:ccp(100,100)]; id action2 = [CCMoveBy actionWithDuration:2  position: ccp(80,80)]; id action3 = [CCMoveBy actionWithDuration:2  position: ccp(0,80)]; [sprite runAction: [CCSequence actions:action1, action2, action3, nil]];

上面這段代碼的意思是,sprite(精靈對象)先移動到坐標(100,100)位置,然后在向右上方移動(8080),然后,再向右移動8080,0)。這一系列動作是不重疊,一個接一個的執行的。 

注意的是,在這些動作中不能有 CCRepeatForever 這種無限的動作(就是不停的一直持續的動作),必須是那種可以在有限的時間內完成的。 


另外在博客上看到其他幾個類似的類的用法,都是cocos2d常用動作 原文連接 http://leeyin.iteye.com/blog/1306557

CCSpawn 

這個與上面的 CCSequence 不同的是,排列的動作是同時執行的,執行的時間以子動作中的最長的時間為準。代碼示例:

id action = [CCSpawn actions: 		[CCJumpBy actionWithDuration:2 position:ccp(300,0) height:50 jumps:4], 		[CCRotateBy actionWithDuration: 2 angle: 720], 		nil];   [sprite runAction:action];

上面這段代碼的意思是,sprite 在兩秒鐘內,向右跳四次,總共跳躍距離是300,跳躍高度是50,在跳躍過程中 同時旋轉720度。 


CCRepeat 

這個是用來重復一個動作有限的次數。當然,你也可以用CCSequence來實現同樣的功能,只是那樣看起來有點傻。示例:

id a1 = [CCMoveBy actionWithDuration:1 position:ccp(150,0)]; id action1 = [CCRepeat actionWithAction: 		[CCSequence actions: [CCPlace actionWithPosition:ccp(60,60)], a1, nil] 		times:3]; [sprite runAction:action1];

上面這段代碼的意思是,先將sprite 放置在(60,60)位置,然后一秒內向右移動150的距離。這兩個動作重復3次。


CCRepeatForever 

上面的是重復有限次數,這個是無限次重復,比如,你想讓一個輪子不停的旋轉,就可以用這個實現。示例:

CCRotateBy* rotate = [CCRotateBy actionWithDuration:1.0f angle:360]; CCRepeatForever* action2 = [CCRepeatForever actionWithAction:rotate]; [sprite runAction:action2];

就像上面講的這段代碼會讓這個 sprite 一直不停的 以每秒360度的轉速永遠的旋轉下去。 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰西县| 洞头县| 休宁县| 潼南县| 麻城市| 庆元县| 沾益县| 射阳县| 阜康市| 大冶市| 科尔| 宣城市| 奎屯市| 张家口市| 罗城| 靖安县| 佛冈县| 灌南县| 柞水县| 灵石县| 晋中市| 河间市| 板桥市| 乌兰察布市| 青冈县| 克拉玛依市| 额尔古纳市| 桃园县| 华容县| 松江区| 互助| 永川市| 方城县| 滨海县| 洛隆县| 富顺县| 克什克腾旗| 阿图什市| 郯城县| 区。| 当涂县|