圖片來自網絡
在游戲中,角色(cocos2d中的術語為精靈)
都是具有豐富的動作效果
,合理的使用這些動作比如閃爍,跳躍,翻轉
,都會帶來體驗上的差異.cocos2d
為我們提供了多種CCAction類
,本文通過對CCAction
的簡單使用示例,幫助大家了解在實際應用
中如何借助這些Action
實現自己的動畫效果
.
在cocos2d 3.0
之前的版本中,位移動作是CCMoveTo
,在3.0新版本
之后所有的命名都發生了變化: CCAction+動作名稱.
(在MainScene.m的init 方法中添加代碼)
// 設置背景 CCNodeColor *bg = [CCNodeColor nodeWithColor:CCColor.grayColor]; [self addChild:bg]; // 創建精靈 CCSprite *qq = [CCSprite spriteWithImageNamed:@"qq.png"]; qq.position = ccp(100, 100); [self addChild:qq]; // 添加動畫 : 用2秒的時間移動到位置(300,100) CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:2.0 position:ccp(300, 100)]; [qq runAction:moveAction]; 運行效果:
moveTo
根據示例我們看到,在cocos2d
中實現動畫非常簡單! 但有時候我們需要游戲角色(精靈)
執行的動畫
可能是比較復雜
的,例如移動一段距離
后翻轉或者放大
或者閃爍
等,因此我們需要執行一組動作
才可以,cocos2d
已經為我們提供了一個CCActionSequence 動作隊列
來實現這種需求.
組合動畫
// 創建精靈 CCSprite *qq = [CCSprite spriteWithImageNamed:@"qq.png"]; qq.position = ccp(100, 100); [self addChild:qq]; // 添加動畫 CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:2.0 position:ccp(300, 100)]; // 添加動畫2 CCActionMoveTo *action2 = [CCActionMoveTo actionWithDuration:2.0 position:ccp(300, 300)]; // 添加動畫3 CCActionMoveTo *action3 = [CCActionMoveTo actionWithDuration:2.0 position:ccp(150, 300)]; // 添加動畫4 : 閃爍3次 CCActionBlink *action4 = [CCActionBlink actionWithDuration:2.0 blinks:3]; // 添加動畫5 : 放大2倍 CCActionScaleTo *action5 = [CCActionScaleTo actionWithDuration:2.0 scale:2]; // 創建動畫執行隊列,并添加需要執行的動作 CCActionSequence *sequence = [CCActionSequence actions:moveAction,action2,action3,action4,action5, nil]; // 運行動畫 [qq runAction:sequence]; 運行效果:
組合動畫
游戲開發中
我們經常需要在某個動作執行完畢
后再做一些業務邏輯上
的處理,這就需要我們監聽某個動畫
的完成情況.cocos2d中我們常常使用CCActionCallFunc
來監聽一個動畫結束
后的回調處理
.
監聽動畫完成
// 創建精靈 CCSprite *qq = [CCSprite spriteWithImageNamed:@"qq.png"]; qq.position = ccp(100, 100); [self addChild:qq]; // 添加動畫 CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:2.0 position:ccp(300, 100)]; // 添加動畫回調動作 CCActionCallFunc *endAction = [CCActionCallFunc actionWithTarget:self selector:@selector(endMoveToAction)]; // 創建動畫執行隊列 CCActionSequence *sequence = [CCActionSequence actions:moveAction,endAction, nil]; [qq runAction:sequence]; - (void)endMoveToAction{ CCLOG(@"動畫執行完畢 ~~"); }
運行效果:
動畫完畢回調
cocos2d
中如果要響應觸摸
,需要在顯示的場景類(MainScene)中開啟用戶交互
:
// 設置開啟觸摸 self.userInteractionEnabled = YES;
然后實現觸摸響應的方法即可:
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ // 獲取觸摸位置 CGPoint p = [touch locationInNode:self]; // 創建動畫 CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:2 position:p]; // 運行動畫 [self.qq runAction:moveAction]; }
示例效果:
觸摸移動效果
運行上面觸摸的例子后,如果你多次連續
點擊屏幕,會發現精靈圖片(本例中的qq圖片)
移動的最后結果
與我們實際希望的
并不相同,甚至會移出屏幕
,不必擔心,這是由于CCActionMoveTo類
自身的原因: 它本身可以被同時多次調用,但某一刻的結果是每個單次調用的總和,下面我們通過stopAction
來修正這個問題~
在cocos2d
中我們可以任意的觸發和停止action
,經常用到的方法是: stopAction:(CCAction * action) : 停止指定的action stopActionByTag:(NSInteger) : 停止指定tag值的action stopAllActions : 停止所有action 在我們的觸摸示例中,我們可以用stopActionByTag
的方式修正代碼,只需要修改兩個地方即可: 1. 在每次觸摸事件開始(touchBegan)時停止上一個動畫
2. 給動畫設置一個tag值
修改后的代碼如下:
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ // 移除上一個動畫效果 [self.qq stopActionByTag:0]; CGPoint p = [touch locationInNode:self]; CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:0.3 position:p]; // 給動畫設置tag值 [moveAction setTag:0]; [self.qq runAction:moveAction];}
如果點擊觸摸在屏幕邊緣
的時候,我們發現精靈
會有一部分內容超出屏幕
,導致顯示不完整
.例如下圖:
精靈超出屏幕
另外,我們希望移動的時間
可以根據距離變化
而不同,最后的代碼如下:
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ [self.qq stopActionByTag:0]; CGPoint p = [touch locationInNode:self]; // 獲取屏幕size CGSize screenSize = [CCDirector sharedDirector].viewSize; // 根據兩點之間的距離計算移動時間 CGFloat duration = ccpDistance(p, self.qq.position) / 200.0; // 限制邊界值 p.x = clampf(p.x, self.qq.contentSize.width / 2, screenSize.width - self.qq.contentSize.width / 2); p.y = clampf(p.y, self.qq.contentSize.height / 2,screenSize.height - self.qq.contentSize.height / 2); CCActionMoveTo *moveAction = [CCActionMoveTo actionWithDuration:duration position:p]; [moveAction setTag:0]; [self.qq runAction:moveAction]; }
clampf是cocos2d
中提供的一個邊界檢測方法,只需要我們提供最大值
和最小值
,它就會確保我們的值
不會超過 這個范圍
,其實它的實現也非常簡單:
float clampf(float value, float min_inclusive, float max_inclusive) { if (min_inclusive > max_inclusive) { CC_SWAP(min_inclusive,max_inclusive); } return value < min_inclusive ? min_inclusive : value < max_inclusive? value : max_inclusive;}
最終效果:
邊界修正效果
我們簡單介紹了游戲開發中
會經常使用CCAction
的用法,很多看似復雜的效果
其實都是通過簡單的動畫組合
而成.而cocos2d
中提供的action
也非常豐富,希望大家能夠通過基本的
練習可以觸類旁通
,因為它們都用法都十分相近
,掌握起來也不會特別困難
.例如大家可以思考一下如何實現
一個始終運動
的游戲背景,就像下面這樣:
運動背景
悄悄提示: CCActionRepeatForever
可以實現不斷重復的效果,然后再根據本文介紹的內容
就完全可以實現這樣的需求
了,大家快動動手吧~~
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
愛主一回贊歌歌詞?讓我追回逝去的歲月,擦去臉上悔恨的淚水,愛主一次,下定決心奉獻一次。就算死而無憾,也只能有一次生命。人的生命只能有一回歌曲?《愛主一回》網絡歌手下定決心獻一次。就算死了也無怨無悔。人生只能有一次。生命的價值有多珍貴?為什么要厭倦今天的名利?為什么要忽略今天的對與錯?救主十字架的愛是多么奇妙!超越人類一千倍的愛。只有上帝的愛是世界上最美的。世界在他面前冷若冰霜。主啊,給我力量和智慧...
表格插入圖片不能浮于文字下方?在Excel中,您可以 不要把圖片放在文字的底部,只能用插入-背景的方法。如下所示:1.打開EXCexcel中文本標注框怎么翻轉?Excel單元格中的文字是反轉的,可以通過使用文本框,旋轉180度來實現。具體步驟如下:1.打開要操作的EXCEL表格,在插入工具欄中找到,點擊 "文本框和。2.在表格中畫一個大小合適的文本框,輸入需要反轉的文本內容,然后點擊文本框上方的綠...
100萬日元在日本人眼里算多嗎?很多人認為100萬日元兌換成大約是6萬元,應該不是很多錢。這只是一個完全錯誤的想法。我也是這么想的,因為日本收入高,物價低。但是,當你接觸到年輕一代的日本人,和日劇的情節進行交叉對比,你會發現,實際的100萬日元真的不是一筆小數目。首先,日本人不 他們沒有像人那樣存錢買房的習慣,所以每個月花在租房上的錢占了他們收入的很大一部分。其次,日本服務的價格都很高,每個月想省...