[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/532.html](http://www.himigame.com/iphone-cocos2d/532.html "【iOS-Cocos2d游戲開發之二十二")
[](http://blog.csdn.net/xiaominghimi/article/details/7009503)
最近也一直在忙,所以也只能每周的某一天抽出時間來分享一些知識點給童鞋們,希望童鞋們體諒下~
那么廢話不多說了,本篇知識點兩個:
1.利用CCSpeed當精靈執行CCAnimate動作途中設置其播放的速度;
2.設置游戲的速率,讓你自由設置整個游戲的速度;
首先介紹第一個知識點:
對于第一個知識點,精靈執行CCAnimate動作途中設置播放速度,說白一點就是當主角或者怪物播放一套幀動作(動畫)的時候,可能突然受到其他因素影響希望主角或者怪物等動作放慢,也就是慢動作的感覺,那么這時候我們就需要設置動作的播放速度拉,也就是今天要介紹的CCSpeed這個類;可能Himi這里哇哇哇的說這么多還是沒亭臺明白吧...=。 = 那么下面我們來看看代碼等就應該明白了;
至于精靈如何利用CCAnimate實現幀集合動畫教程在之前已經講述過,那么這里就不在贅述,如果還不清楚如何利用很多幀形成動畫讓精靈播放的童鞋請移步到:[【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!](http://blog.csdn.net/xiaominghimi/article/details/6993764)
直接上一段代碼如下:
~~~
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];
CCSprite*mySprite=[CCSprite spriteWithSpriteFrameName:@"himi1.png"];
mySprite.position=ccp(120,150);
[self addChild:mySprite];
CCAnimation*anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];
CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
CCSequence *seq = [CCSequence actions:animate,nil];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:seq];
[mySprite runAction:repeat];
~~~
以上代碼創建一個幀動畫(幀資源都在animationFrames.plist加載到內存中了),然后創建一個精靈并讓其永久循環執行這個幀動畫;
童鞋們想一想,如果在這個永久動作執行后,你想在一個任意時間設置這個動畫播放的速度,那么就利用CCSpeed來實現了,代碼如下:
~~~
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];
//左側正常速度的播放
CCSprite*mySprite=[CCSprite spriteWithSpriteFrameName:@"himi1.png"];
mySprite.position=ccp(120,150);
[self addChild:mySprite];
CCAnimation*anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];
CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
CCSequence *seq = [CCSequence actions:animate,nil];
//讓你的永久動作放入speed中
CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];
[speed setTag:888];//設置tag能任意獲取到其實例,并且對其進行操作
[mySprite runAction:speed];
~~~
這段代碼和第一段代碼不同點就是第二段將CCRepeatForever永久動作又包裝到了CCSpeed中,整個動作等同與交給了CCSpeed來控制了,那么下面我還設置了[speed setTag:888];這個是留出接口,當你需要設置整個CCSpeed包裝的動作速度的時候利用tag獲取到,這個大家肯定很熟悉,那么獲取動作方式如下:
~~~
CCSpeed *speed=(CCSpeed*)[sprite getActionByTag:88];
~~~
獲取的時候是你之前runAction的精靈來利用getActionByTag來獲取的!
那么下面繼續添加代碼,我們讓一個由CCSpeed包裝一個幀動畫并讓精靈執行后的5秒后讓其速度變成原有播放速度的一半,代碼如下:
~~~
CCSprite *mySpriteByF =[CCSprite spriteWithSpriteFrameName:@"himi1.png"];
mySpriteByF.position=ccp(360,150);
[self addChild:mySpriteByF z:0 tag:66];
anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];
animate = [CCAnimate actionWithAnimation:anim];
seq =[CCSequence actions:animate, nil];
CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];
[speed setTag:88];
[mySpriteByF runAction:speed];
[self schedule:@selector(slowForHimi) interval:5];
~~~
~~~
-(void)slowForHimi{
[self unschedule:@selector(slowForHimi)];//解除此選擇器
CCSprite*sprite=(CCSprite*)[self getChildByTag:66];
CCSpeed *speed=(CCSpeed*)[sprite getActionByTag:88];
[speed setSpeed:0.5];//放慢原有速度的0.5倍
}
~~~
CCSpeed的創建很簡單,那么設置速率的方法如下:
~~~
[CCSpeed* setSpeed:XX];
~~~
這里的XX參數指的是倍率,傳入1表示原速,大于1表示增快,小于1表示放慢速度~
下面直接給出全部測試項目代碼:
~~~
//
// HelloWorldLayer.m
// SLowAnimationByHimi
//
// Created by 華明 李 on 11-11-21.
// Copyright Himi 2011年. All rights reserved.
//
// Import the interfaces
#import "HelloWorldLayer.h"
#import "CCAnimationHelper.h"
// HelloWorldLayer implementation
@implementation HelloWorldLayer
+(CCScene *) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
HelloWorldLayer *layer = [HelloWorldLayer node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
//CCJumpTo實現,拋物線
//
// on "init" you need to initialize your instance
-(id) init{
if( (self=[super init])) {
CCLabelTTF *label = [CCLabelTTF labelWithString:@"暫緩動作&設置整個游戲加速/減速" fontName:@"Marker Felt" fontSize:24];
label.position = ccp(260,260);
[self addChild: label z:0 ];
label = [CCLabelTTF labelWithString:@"正常速度的播放" fontName:@"Marker Felt" fontSize:12];
label.position = ccp(120,220);
[self addChild: label z:0 tag:99];
label = [CCLabelTTF labelWithString:@"左側動態放慢的速度的動作" fontName:@"Marker Felt" fontSize:12];
label.position = ccp(350,220);
[self addChild: label z:0 ];
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"animationsFrames.plist"];
//左側正常速度的播放
CCSprite*mySprite=[CCSprite spriteWithSpriteFrameName:@"himi1.png"];
mySprite.position=ccp(120,150);
[self addChild:mySprite];
CCAnimation*anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];
CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
CCSequence *seq = [CCSequence actions:animate,nil];
CCRepeatForever* repeat = [CCRepeatForever actionWithAction:seq];
[mySprite runAction:repeat];
//左側動態放慢的速度的動作
CCSprite *mySpriteByF =[CCSprite spriteWithSpriteFrameName:@"himi1.png"];
mySpriteByF.position=ccp(360,150);
[self addChild:mySpriteByF z:0 tag:66];
anim=[CCAnimation animationWithFrame:@"himi" frameCount:12 delay:0.1];
animate = [CCAnimate actionWithAnimation:anim];
seq =[CCSequence actions:animate, nil];
CCSpeed *speed =[CCSpeed actionWithAction:[CCRepeatForever actionWithAction:seq] speed:1.0f];
[speed setTag:88];
[mySpriteByF runAction:speed];
[self schedule:@selector(slowForHimi) interval:5];
}
return self;
}
-(void)slowForHimi{
[self unschedule:@selector(slowForHimi)];//解除此選擇器
CCSprite*sprite=(CCSprite*)[self getChildByTag:66];
CCSpeed *speed=(CCSpeed*)[sprite getActionByTag:88];
[speed setSpeed:0.5];//放慢原有速度的0.5倍
}
// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
// in case you have something to dealloc, do it in this method
// in this particular example nothing needs to be released.
// cocos2d will automatically release all the children (Label)
// don't forget to call "super dealloc"
[super dealloc];
}
@end
~~~
運行截圖如下: (圖片中有個"左"寫錯了,應該是"右",懶得改了,大家知道就行了 娃哈哈)

從截圖中可能童鞋們看不出什么效果。等文章最后放出源碼,大家運行就可以看到效果了-。
這里備注下:除了利用CCSpeed來實現慢動作之外,還有其他的一些方法,不怕麻煩的童鞋甚至可以嘗試當需要慢動作的時候,取出當前的幀下標,然后利用指定幀下標的方法創建一個新的幀動畫同時增加播放時間即可;(在上一節《iOS-Cocos2d游戲開發之二十一》中Himi封裝了一個指定幀下標進行創建幀動畫的方法,還沒有看過的童鞋請移步到這里:[【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!](http://blog.csdn.net/xiaominghimi/article/details/6993764));再或者直接去修改Cocos2d-iphone引擎的源碼;
Himi當時做的時候因為用CCSpeed方式有問題一直不行,就去改了源碼弄的。后來才發現CCSpeed正確用法,我去了=。 =
這里Himi必須強調一點!!!!!!!
很多時候你的主角的動作利用CCAction來實現,移動則是在update刷幀函數或者一些選擇器的方法中進行的,那么為了讓你的主角慢動作比較逼真,那么Himi建議不要使用scheduleUpdate函數,因為這個你無法修改每次調用update的時間默認都是每幀都調用,那么你應該自己定義一個選擇器當刷邏輯的函數,這樣就能配合CCSpeed實現逼真慢動作拉~
下面我們來介紹第二個知識點:設置游戲速度
對于游戲速度最常見的出現在塔防游戲中,當玩家創建好防守的東東后開始出怪后,可能怪物移動速度慢,而玩家著急看到結果,那么我們就會人性化的加上加快游戲速度的按鈕拉~那么這個功能在Cocos2d引擎中封裝好的,一句代碼即可完成,如下代碼即可:
~~~
[[CCScheduler sharedScheduler] setTimeScale:XX];
~~~
這里的XX仍然是倍率:傳入1表示原速,大于1表示增快,小于1表示放慢速度~
OK,本篇就到此~
源碼下載地址:[?[http://www.himigame.com/iphone-cocos2d/532.html](http://www.himigame.com/iphone-cocos2d/532.html "【iOS-Cocos2d游戲開發之二十二")](http://download.csdn.net/detail/xiaominghimi/3839063)
? ? ? ?
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取"產品付費數量等于0的問題"】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&自定義類細節說明&Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&&Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d­2.0­x­2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)