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,完美解決;
2.下面介紹第二個問題:如何禁止手機自動鎖屏的問題;
對於手機自動鎖屏的問題一般都是在項目尾聲的時候發現由於手機自動鎖屏所帶來的各種問題,例如,在cocos2d中我們調用暫停游戲的函數后,如果用戶無操作,手機自動鎖屏后,解鎖再次進入游戲就會發現游戲不處於暫停了,(如果你有暫停界面的話,你將看到你暫停界面存在,而后面的游戲照常運行- -)
那么這里Himi給出在應用中禁止手機自動鎖屏的代碼,如下:
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
http://blog.csdn.net/yuanhong2910/article/details/7163539
使用cocos2d-x顯示瓦片地圖,發現兩個瓦片銜接的地方有黑線,找了一下解決方案:
第一種:
修改 ccConfig.h
將
#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 0
改為
#define CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL 1
第二種:
調用瓦片地圖對應CCTexture2D的setAliasTexParameters接口。若調用之后還有黑線,則還調用 CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
例如我自己的代碼:
bool AppDelegate::initInstance()
{
// Init Code
。。。
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
return true;
}
diaoyong瓦片地圖紋理setAliasTexParameters():
CCTexture2D* texture2D = CCTextureCache::sharedTextureCache()->textureForKey("TiledResource.png");
texture2D->setAliasTexParameters();