本章節主要為大家介紹在遊戲開發過程中經常遇到的兩個問題;
1. 解決滾屏背景或拼接地圖有黑邊!
對于遊戲開發中,背景(遊戲地圖)是必要的元素之一,那麼對于大部分遊戲的背景都是動态,或者不斷移動的;例如rpg中的背景随着人物、主角而移動,那麼一般情況下背景都是由地圖編輯器(圖塊)拼出來的,要不就是直接一整張大圖去顯示,在或者就是将一張大圖進行裁減成n張,然後再進行拼接完成等等;
那麼對于背景(地圖)元素中存在的重複圖塊很少的話基本上就沒有利用地圖編輯器的必要了;在這裡himi不來介紹如何在cocos2d中使用地圖編輯器做背景地圖 ,而是介紹在cocos2d中制作滾動地圖時利用拼接地圖方式遇到的黑邊問題;
如下圖所示,背景是由3張圖檔拼接而成,如下3張圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuETYxE3M4MTM3EDMyMTMfNTNyETMyczLcJDMvwlMxAjMvw1ckF2bsBXdvwFduVGdu92YtA3dvwVbvNmLl1WYnlWbphmL3d3dvw1LcpDc0RHaiojIsJye.png)
1
2
3
4
5
6
7
8
9
10
11
//将三張圖拼成一張完整背景
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進行移動,代碼如下:
12
//----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 =(ccsprite*)[self getchildbytag:33];
}
運作截圖如下:
這時當移動到一定距離時候會發現剛才的縫隙消失了,是消失了,通過以上兩張運作效果圖可以說明:
在cocos2d中如圖你使用拼接背景地圖的方式去做的話,每處拼接處在移動時都會時不時的出現黑邊(裂縫),至于如何解決我想童鞋們第一想法就是在裁圖的時候多切出一像素的方法,第一張比如原來是100,故意裁出101,第二張繪制的時候x軸前一個像素…以此類推,還有些童鞋認為是美工的原因,可能在裁圖的時候有透明像素的存在造成,當然美工裁圖的不仔細确實是個不可排除的原因,但是最終解決的方案應該是将精靈設定貼圖無鋸齒的屬性,這樣就可以完美解決此問題,設定精靈貼圖無鋸齒方法如下:
[ccsprite.texture setaliastexparameters];
我們将這句添加上之後再次運作,代碼更改如下:
13
14
15
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,完美解決;
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之是以寫這麼詳細主要還是想讓還沒有遇到此類問題的童鞋清晰化此類問題出現的原因,這樣能讓更多童鞋減少以後遇到此問題的疑問~