[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/501.html](http://www.himigame.com/iphone-cocos2d/501.html "【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!")
[](http://blog.csdn.net/xiaominghimi/article/details/6911387)
今天Himi單用一篇博文來給童鞋們介紹精靈相關的兩個常用的細節知識點;
首先來介紹第一個知識點:精靈可視區域;
不管在哪個移動平臺上進行開發游戲都會接觸使用到可視區域,比如Kjava(J2me)平臺的setClip方法,Android的clipRect方法等等,那么在iOS上也一樣存在,這里我們介紹cocos2d引擎中的可視區域得函數是setTextureRect;
可能沒有接觸過游戲得童鞋不明白其概念,那么Himi就簡單概述下:
所謂可視區域就是在一個完整的表面上對其設置一定大小的區域,讓其只顯示設置的區域的面,其他部分隱藏不顯示出來;最常用的是將一張圖片設置一個可視區域,只讓這張圖展示設置的區域;
那么這里在啰嗦幾句,在cocos2d中精靈CCSprite的可視區域一般可以通過兩種方式來設置:
1.在創建精靈的時候進行設置;2.在創建后進行設置;舉例如下:
新建一個cocos2d項目,然后在HelloWorldLayer.m中init方法中創建一個精靈,代碼如下:
~~~
//---正常創建的icon圖
CCSprite * spriteOld =[CCSprite spriteWithFile:@"icon.png"];
spriteOld.position=ccp(80,100);
[self addChild:spriteOld];
//---創建時設置30寬30高的可視區域
CCSprite * spriteNew =[CCSprite spriteWithFile:@"icon.png" rect:CGRectMake(0, 0, 30,30)];
spriteNew.position=ccp(150,100);
[self addChild:spriteNew];
//---創建后對其設置30寬30高的可視區域
CCSprite * spriteT =[CCSprite spriteWithFile:@"icon.png"];
[spriteT setTextureRect:CGRectMake(10, 10, 30, 30)];
spriteT.position=ccp(230,100);
[self addChild:spriteT];
~~~
上面我創建了3個精靈,第一個沒有設置可是區域的icon精靈,第二個和第三個是設置了可視區域寬30高30的精靈,但是第二個和第三個精靈的可是區域寬高相同,但是起始點不同;而且第二個是從創建精靈的時候設置可視區域,第三個精靈則是創建精靈后進行設置的,設置的地方不一樣,功能是一樣的;
需要詳細講解的是不管用以上兩種設置可視區域的哪種方法都需要傳入一個CGRect對象,這個CGrect參數有四個,坐標x,y,以及寬高w,y;
那么CGRect在可是區域的函數中的作用如下:
CGRect的x,y表示從這個精靈貼圖的(x,y)坐標開始設置可視區域,(w,h)可視區域的大小;? ??
下面是運行效果圖,童鞋們通過三個精靈(從左往右)之間的對比就很容易明白的:

下面介紹第二個知識點:精靈錨點(anchorPoint);
渲染錨點的作用就是在渲染圖片的時候確定其渲染的方式,一般常用的錨點有以下幾種:
圖片左上角、圖片右上角、圖片中心點、圖片左下角、圖片右下角等等
首先童鞋們需要知道一點,在cocos2d引擎中在layer中添加渲染精靈貼圖的時候默認的錨點是其中心點;
那么由于cocos2d中layer的原點(0,0)點是屏幕的左下角,所以如果默認創建一個精靈添加到layer中的話,是精靈的中心點放置在layer的原點上,即精靈圖片顯示在屏幕中只是精靈的寬一半高一半,如下圖:

對應代碼如下:
~~~
//---使用默認錨點
CCSprite * spriteOld =[CCSprite spriteWithFile:@"icon.png"];
[self addChild:spriteOld];
~~~
那么如果我們設置其精靈的錨點為左下角則正好將精靈icon完整顯示出來,因為精靈的左下角正好與layer的原點重合,如下圖:

對應代碼如下:
~~~
//---設置精靈錨點為左下角
CCSprite * spriteNew =[CCSprite spriteWithFile:@"icon.png"];
spriteNew.anchorPoint=ccp(0,0);
[self addChild:spriteNew];
~~~
設置的方法是精靈的anchorPoint屬性,賦值的是個CGPoint對象,其CGPoint中的x與y最大取1,表示最右與最下;
---------以上介紹的過于簡單,那么下面Himi利用可視區域與錨點的特性制作一種從左往右樣式簡單進度條;
首先我們仍然使用cocos2d的icon圖作為一個進度條,然后讓其從左往右不斷顯示出來;步驟如下:
第一步:創建一個精靈,設置精靈的錨點為x=0(最左側),y=0.5(精靈的y軸中點),代碼如下:
~~~
//---使用默認錨點
CCSprite * spriteP =[CCSprite spriteWithFile:@"icon.png"];
spriteP.position=ccp(size.width*0.5,size.height*0.5);//設置坐標
spriteP.anchorPoint=ccp(0,0.5);//設置錨點
[self addChild:spriteP z:0 tag:88]; //將精靈添加到layer中顯示
~~~
細心的童鞋可能會發現以上代碼運行后發現精靈并不顯示在屏幕中點,嗯,因為我們設置了精靈的錨點,現在精靈的左下角與屏幕中點重合著;
第二步:添加一個變量用于記錄當前進度:
~~~
@interface HelloWorldLayer : CCLayer
{
float currentShowRect;//當前可視區域的大小
}
~~~
然后開啟一個刷新函數:
~~~
-(id) init
{
[self scheduleUpdate];
}
-(void)update:(ccTime)himi{//每一幀都會執行的函數
}
~~~
最后一步:在刷新函數中書寫從左往右慢慢顯示icon進度條邏輯代碼,代碼如下:
~~~
-(void)update:(ccTime)himi{//每一幀都會執行的函數
//實現進度條邏輯
CCSprite *sprite =(CCSprite*)[self getChildByTag:88];
currentShowRect++;
if(currentShowRect>=100){
currentShowRect=0;
}
[sprite setTextureRect:CGRectMake(0, 0, currentShowRect,sprite.position.y)];
}
~~~
運行截圖如下:(icon顯示區域越來越大,不斷循環)

OK,本篇介紹完畢,可能童鞋們會認為本篇知識點過于簡單,如果你是個經常關注Himi博客的童鞋,那么你會發現Himi基本上所有的博文都是介紹了很多細節方面的問題,原因一,千篇一律的文章太多,別人都寫那么多了,我也沒必要贅述。原因二,Himi常說的,細節決定一切,雖然說得絕對了些,但是事實開發項目中基本都是細節問題困擾著大家;
好了,不多說了,繼續忙了;
- 前言
- 【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)