[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/507.html](http://www.himigame.com/iphone-cocos2d/507.html "【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!")
[](http://blog.csdn.net/xiaominghimi/article/details/6926913)
本章節主要為大家介紹在游戲開發過程中經常遇到的兩個問題;
1.解決滾屏背景或拼接地圖有黑邊!
對于游戲開發中,背景(游戲地圖)是必要的元素之一,那么對于大部分游戲的背景都是動態,或者不斷移動的;例如RPG中的背景隨著人物、主角而移動,那么一般情況下背景都是由地圖編輯器(圖塊)拼出來的,要不就是直接一整張大圖去顯示,在或者就是將一張大圖進行裁減成N張,然后再進行拼接完成等等;
那么對于背景(地圖)元素中存在的重復圖塊很少的話基本上就沒有利用地圖編輯器的必要了;在這里Himi不來介紹如何在cocos2d中使用地圖編輯器做背景地圖 ,而是介紹在cocos2d中制作滾動地圖時利用拼接地圖方式遇到的黑邊問題;
如下圖所示,背景是由3張圖片拼接而成,如下3張圖:

然后Himi將此3張作為3個精靈然后順次繪制在屏幕上代碼如下:?
~~~
//將三張圖拼成一張完整背景
CGSize screenSize =[[CCDirector sharedDirector]winSize];
CCSprite *bgTile1 =[CCSprite spriteWithFile:@"himi_01.png"];
bgTile1.position=ccp(bgTile1.contentSize.width*0.5,screenSize.height*0.5);
CCSprite *bgTile2 =[CCSprite spriteWithFile:@"himi_02.png"];
bgTile2.position=ccp(bgTile1.position.x+bgTile1.contentSize.width,bgTile1.position.y);
CCSprite *bgTile3 =[CCSprite spriteWithFile:@"himi_03.png"];
bgTile3.position=ccp(bgTile2.position.x+bgTile2.contentSize.width,bgTile2.position.y);
[self addChild:bgTile1 z:0 tag:11];
[self addChild:bgTile2 z:0 tag:22];
[self addChild:bgTile3 z:0 tag:33];
~~~
此時運行的截圖如下:

從上圖童鞋們就可以看到拼接有裂縫,那么接著讓3個精靈從左向右不斷的x軸+1進行移動,代碼如下:
~~~
//----init函數中
//每0.1秒刷新函數move
[self schedule:@selector(move) interval:0.1];
//move函數
-(void)move{
CCSprite *tempSprite =(CCSprite*)[self getChildByTag:11];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
tempSprite =(CCSprite*)[self getChildByTag:22];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
tempSprite =(CCSprite*)[self getChildByTag:33];
tempSprite.position=ccpAdd(tempSprite.position, ccp(1,0));
}
~~~
運行截圖如下:

這時當移動到一定距離時候會發現剛才的縫隙消失了,是消失了,通過以上兩張運行效果圖可以說明:
在cocos2d中如圖你使用拼接背景地圖的方式去做的話,每處拼接處在移動時都會時不時的出現黑邊(裂縫),至于如何解決我想童鞋們第一想法就是在裁圖的時候多切出一像素的方法,第一張比如原來是100,故意裁出101,第二張繪制的時候X軸前一個像素...以此類推,還有些童鞋認為是美工的原因,可能在裁圖的時候有透明像素的存在造成,當然美工裁圖的不仔細確實是個不可排除的原因,但是最終解決的方案應該是將精靈設置貼圖無鋸齒的屬性,這樣就可以完美解決此問題,設置精靈貼圖無鋸齒方法如下:
~~~
[CCSprite.texture setAliasTexParameters];
~~~
我們將這句添加上之后再次運行,代碼更改如下:
~~~
//將三張圖拼成一張完整背景
CGSize screenSize =[[CCDirector sharedDirector]winSize];
CCSprite *bgTile1 =[CCSprite spriteWithFile:@"himi_01.png"];
bgTile1.position=ccp(bgTile1.contentSize.width*0.5,screenSize.height*0.5);
CCSprite *bgTile2 =[CCSprite spriteWithFile:@"himi_02.png"];
bgTile2.position=ccp(bgTile1.position.x+bgTile1.contentSize.width,bgTile1.position.y);
CCSprite *bgTile3 =[CCSprite spriteWithFile:@"himi_03.png"];
bgTile3.position=ccp(bgTile2.position.x+bgTile2.contentSize.width,bgTile2.position.y);
//讓3個精靈都設置貼圖無鋸齒
[bgTile1.texture setAliasTexParameters];
[bgTile2.texture setAliasTexParameters];
[bgTile3.texture setAliasTexParameters];
[self addChild:bgTile1 z:0 tag:11];
[self addChild:bgTile2 z:0 tag:22];
[self addChild:bgTile3 z:0 tag:33];
~~~
再次運行效果圖如下:

OK,完美解決;
【2013年12月13日補充】:
對于裂縫、黑邊、模糊、透明等問題,這里Himi再詳細描述補充下:
1.首先如果你使用TP(Texturepacker)進行的圖片打包的話:
首先確定是否打包時,幀之間保證了>=1像素距離。
然后確定是否勾選了"premultply alhpa" 這一項(應該勾選)
最后確認你項目中是否設置了如下代碼:
CCTexture2D::PVRImagesHavePremultipliedAlpha(true);
如上代碼設置的作用是
2.圖片縮放后模糊透明問題
首先cocos2d/cocos2dx引擎中,默認的貼圖設置了抗鋸齒,如下函數:
setAntiAliasTexParameters()//設置抗鋸齒 (但是會模糊透明)
那么縮放后的圖片由于設置了抗鋸齒會造成圖片邊緣模糊透明,所以對此的解決方式,我們單獨處理縮放的圖進行設置非抗鋸齒,如下函數:
setAliasTexParameters() //設置非抗鋸齒 (但是不抗鋸齒)
3.圖片感覺模糊不清晰
首先對于此問題的原因是:引擎默認使用的是透視投影模式,此模式的效果為近大遠小的效果,所以遠處的則模糊不清晰
所以我們如果想讓整體所有貼圖清晰,那么我們可以設置引擎為正交投影模式即可,如下代碼設置:
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
如果還不行,寶貝們,你們贏了!只要以上方法都嘗試過100%沒問題的!!!!!!
2.下面介紹第二個問題:如何禁止手機自動鎖屏的問題;
對于手機自動鎖屏的問題一般都是在項目尾聲的時候發現由于手機自動鎖屏所帶來的各種問題,例如,在cocos2d中我們調用暫停游戲的函數后,如果用戶無操作,手機自動鎖屏后,解鎖再次進入游戲就會發現游戲不處于暫停了,(如果你有暫停界面的話,你將看到你暫停界面存在,而后面的游戲照常運行- -)
那么這里Himi給出在應用中禁止手機自動鎖屏的代碼,如下:
~~~
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
~~~
OK,本章介紹的知識點雖然很少解決的方法也很簡單,但是也是游戲中最容易遇到的兩個問題;
那么這里肯定會有不少童鞋認為本身一句代碼的事情非寫這么多進行說明,嗯 ,確實寫的過于詳細,但是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)