1. 程式人生 > >【iOS-Cocos2d遊戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止遊戲中自動鎖屏問題!【2011年12月18日補充】

【iOS-Cocos2d遊戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止遊戲中自動鎖屏問題!【2011年12月18日補充】

原創,轉載務必在明顯處註明:
轉載自 原文連結: http://www.himigame.com/iphone-cocos2d/507.html

     本章節主要為大家介紹在遊戲開發過程中經常遇到的兩個問題;

     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之所以寫這麼詳細主要還是想讓還沒有遇到此類問題的童鞋清晰化此類問題出現的原因,這樣能讓更多童鞋減少以後遇到此問題的疑問~

相關推薦

iOS-Cocos2d遊戲開發解決背景/拼接地圖(縫隙)/動畫播放出現毛邊以及禁止遊戲自動問題20111218補充

原創,轉載務必在明顯處註明:轉載自 原文連結: http://www.himigame.com/iphone-cocos2d/507.html     本章節主要為大家介紹在遊戲開發過程中經常遇到的兩個問題;     1. 解決滾屏背景或拼接地圖有黑邊!      對於遊戲開

[Python]20181218的隨筆記錄

字典,列表的三種巢狀形式 字典巢狀字典 每一個字典key對應的value又是一個字典 適合將擁有多個子屬性的資料封裝在一起的資料 例如:網站有多個使用者,每個使用者都有特定的幾個子屬性 u

20181218;部落格第二篇;IDEA2018.3版本安裝及破解

IDEA2018.3版本安裝及破解 一、IDEA安裝: 1、首先下載IDEA2018.3的版本,IDEA下載官方網址https://www.jetbrains.com/idea/; 2、然後選擇你要下載的對應的作業系統版本,然後選擇版本(這裡建議選擇Ultimate版本的,之後操作方法是一樣的) 3、

01點40分20181218

car循跡 // 電機設定 // #define leftA_PIN 7 #define leftB_PIN 8 #define righA_PIN 3 #define righB_PIN 2 //PWM int ENA1=6; //電機

OJ HDOJ1059 18122314:37 [ 51 ]

Time Limit Exceeded 直接暴搜.....死的很安詳 沒辦法...第一個想法就是這個: # include<iostream> # include<algorithm> //# include<Windows.h> using na

OJ HDOJ1058 18122220:00 [ 50 ]

這題找規律我想了很多試了有的感覺很煩,參考了人家的思路很....OJBnice,所以我按照人家的思路寫了一遍。 這題就是求醜數,醜數最小的因子由2,3,5,7組成,1 被定義為最小丑數 首先很重要的一點要說下,醜數一定是由醜數乘醜數所得  ( =  =.)!! 醜數定

OJ HDOJ1057 18122215:37 [ 49 ]

Limit  Time 題意:有一個20X20的網格,每個網格里有個數字(0~3),每天網格里數字的變化是先將網格里本身的數字與其上下左右網格里數字依次相加,得到一個0~15的值k,這個值確定了題目裡陣列D[k],接下來我們只需要把網格里的值與D[k]相加,如果相加後的值大於3,變

OJ HDOJ1056 18122213:01 [ 48 ]

模擬題意即可....ummm AC程式碼: # include<iostream> using namespace std; int main(void) { double n,sum; cin >> n; int i; while (n) { dou

OJ HDOJ1053 18122016:59 [ 47 ]

這題一開始做出來沒被AC很鬱悶,後來人家提到1個字元的時候我才發現,我定義的函式初始Power是0,一個字元的時候會除0出現這種 Inf 錯誤 思路就是模擬下哈夫曼編碼樹即可拿到每一個編碼的個數求出總個數 已經被AC # include<iostream> #includ

OJ HDOJ1052 18121922:38 [ 46 ]

轉自 https://www.cnblogs.com/Open_Source/archive/2010/07/09/1904940.html 解題思路:貪心演算法。根本思想是要讓田忌花最小的代價來勝一每一場,讓齊王花最大的代價來勝每一場。(“代價”可以用比較的兩匹馬的權值之差來形象

OJ HDOJ1051 18121921:14 [ 45 ]

思路模擬,利用l排序,先確定l小的在前,如果相等再排序w,由於是基本有序的狀態,所以只要比較後面的是否w大於前面的即可 利用visit記錄訪問,從第一個開始訪問,將後面能串起來的都串起來(符合l'>l w'>w都標記已訪問),直到所有都被訪問,這時候記錄串了幾次就可。 #in

OJ HDOJ1050 18121919:11 [ 44 ]

開始我的比較麻煩,最早的思路是模擬,分s,t陣列錄入N個數(錄入讓s小,t大),依次0-N讀取,第一個數算第一批移動,和它不衝突的就一起移動(讀取到的和可以移動的都標記為0),直到所有都是 0,記下模擬的次數。但是比較麻煩的是:假設讀取第一組數,第二組數不衝突,那麼第一組和第二組作為第一批,讀取

OJ HDOJ1049 18121916:09 [ 43 ]

這題模擬就好了....一直模擬u d 到出坑,看結果..當然最簡單的還是找規律...用公式來計算...有點煩..懶得找了直接模擬AC了 # include<iostream> using namespace std; int main(void) { int n, u,

OJ HDOJ1048 18121522:48 [ 42 ]

Presentation Error 是在看不出哪裡格式錯了,提交了幾十次了,懶得搞了,弄了半天,我的思路就是26取模, 也可以弄另外一個數組儲存暗文 str[i]=s[ch[i]-'A']  結果: START NS BFW, JAJSYX TK NRUTW

OJ HDOJ1047 18121521:00 [ 41 ]

思路大數相加,輸入一系列大數,只需要不停的計算結果+輸入大數就可,因此就是求2個大數相加 9+9=18,可知最多進位一個.... //簡單的大數相加 # include<iostream> # include<string> using namespace std

OJ HDOJ1046 1812821:43 [ 40 ]

此題雖然是水題,但是此類問題卻不是一個水題 從圖論的角度來看,TSP問題實質是在一個帶權完全無向圖中,找一個權值最小的Hamilton迴路。由於該問題的可行解是所有頂點的全排列,隨著頂點數的增加,會產生組合爆炸,它是一個NP完全問題。  早期的研究者使用精確演算法求解該問題,常用的

OJ HDOJ1045 1812811:41 [ 39 ]

有些事情耽誤了,所以最近沒寫程式碼,此題我開始的思路還算正常,後來跑偏了....開始拿到這題第一反應就是八皇后問題,遞迴 DFS,因為這題有X塊限制,所以我的最初思路是:先和八皇后類似先在  . 塊中放能放的,X塊可以遮擋補充的地方先不考慮,當 . 塊的最後一層放完後,開始考慮X塊

OJ HDOJ1044 1812319:00 [ 38 ]

本題基本思路大致相同,先用BFS算出所有節點對的最短距離,然後用DFS遞迴所有情況得出最大結果(合理剪枝) 思路還是很簡單的,但是很遺憾此題沒有被AC,WA了,不清楚哪裡錯了...估計啥格式啥的...細節吧.... 程式碼僅供參考吧...ummm # include<iostr

學習筆記2017718MySQL測試:模擬QQ數據庫

關系 ref sts one database 等級 weight insert phone 模擬測試: QQ數據庫管理 一、創建數據庫並添加關系和測試數據 1 ##創建QQ數據庫,完成簡單的測試 2 3 #創建數據庫 4 DROP DATABASE IF EX

Lazy1.1.1 許可權管理系統 20181201正式釋出

本程式是基於最新的jfinal3.5+easyui1.5.2搭建的後臺許可權管理系統MYSQL版,包括選項資料字典、層級資料字典、部門管理、選單管理、角色管理、使用者管理、日誌管理,既適合新手學習,也適合在此基礎上開始您的應用程式開發旅程。演示站點:  http://admin.laz