李華明Himi 原創,轉載務必在明顯處註明:
本章節主要爲你們介紹在遊戲開發過程當中常常遇到的兩個問題;css
1. 解決滾屏背景或拼接地圖有黑邊!html
對於遊戲開發中,背景(遊戲地圖)是必要的元素之一,那麼對於大部分遊戲的背景都是動態,或者不斷移動的;例如RPG中的背景隨着人物、主角而移動,那麼通常狀況下背景都是由地圖編輯器(圖塊)拼出來的,要不就是直接一整張大圖去顯示,在或者就是將一張大圖進行裁減成N張,而後再進行拼接完成等等;app
那麼對於背景(地圖)元素中存在的重複圖塊不多的話基本上就沒有利用地圖編輯器的必要了;在這裏Himi不來介紹如何在cocos2d中使用地圖編輯器作背景地圖 ,而是介紹在cocos2d中製做滾動地圖時利用拼接地圖方式遇到的黑邊問題;iphone
以下圖所示,背景是由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)); }
這時當移動到必定距離時候會發現剛纔的縫隙消失了,是消失了,經過以上兩張運行效果圖能夠說明:spa
在cocos2d中如圖你使用拼接背景地圖的方式去作的話,每處拼接處在移動時都會時不時的出現黑邊(裂縫),至於如何解決我想童鞋們第一想法就是在裁圖的時候多切出一像素的方法,第一張好比原來是100,故意裁出101,第二張繪製的時候X軸前一個像素...以此類推,還有些童鞋認爲是美工的緣由,可能在裁圖的時候有透明像素的存在形成,固然美工裁圖的不仔細確實是個不可排除的緣由,可是最終解決的方案應該是將精靈設置貼圖無鋸齒的屬性,這樣就能夠完美解決此問題,設置精靈貼圖無鋸齒方法以下:.net
[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,完美解決;
2.下面介紹第二個問題:如何禁止手機自動鎖屏的問題;
對於手機自動鎖屏的問題通常都是在項目尾聲的時候發現因爲手機自動鎖屏所帶來的各類問題,例如,在cocos2d中咱們調用暫停遊戲的函數後,若是用戶無操做,手機自動鎖屏後,解鎖再次進入遊戲就會發現遊戲不處於暫停了,(若是你有暫停界面的話,你將看到你暫停界面存在,然後面的遊戲照常運行- -)
那麼這裏Himi給出在應用中禁止手機自動鎖屏的代碼,以下:
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
那麼這裏確定會有很多童鞋認爲自己一句代碼的事情非寫這麼多進行說明,嗯 ,確實寫的過於詳細,可是Himi之因此寫這麼詳細主要仍是想讓尚未遇到此類問題的童鞋清晰化此類問題出現的緣由,這樣能讓更多童鞋減小之後遇到此問題的疑問~
【2011年11月17日補充】:
若是解決拼接裂縫問題利用下面這行代碼仍是不給力的話 :
[sprite.texture setAliasTexParameters];
那麼請繼續利用下面這行代碼:(放在AppDelegate.m 的 applicationDidFinishLaunching方法中最後便可)
[[CCDirector sharedDirector] setProjection:kCCDirectorProjection2D];
若是仍是不行 ,那麼檢查你TP打包工具進行打包的時候,是否是忘記將幀與幀之間忘記空出1-2像素了!!!由於幀與幀之間離得特別近的話,那麼渲染時正好將旁邊那幀的圖繪製出來了!!!!!!
若是還不行,寶貝們,大家贏了!只要以上方法都嘗試過100%沒問題的!!!!!!