自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

瘋狂iOS講義之瘋狂打飛機(jī)(1)

移動(dòng)開發(fā) iOS
本次我們將帶領(lǐng)大家手動(dòng)完成一個(gè)簡(jiǎn)單但功能完整的打飛機(jī)游戲,實(shí)現(xiàn)飛機(jī)飛行、飛機(jī)碰撞、發(fā)射子彈、敵機(jī)發(fā)射大子彈、背景音樂、子彈音效、分?jǐn)?shù)統(tǒng)計(jì)、菜單管理等功能。

本次我們將帶領(lǐng)大家手動(dòng)完成一個(gè)簡(jiǎn)單但功能完整的打飛機(jī)游戲,實(shí)現(xiàn)飛機(jī)飛行、飛機(jī)碰撞、發(fā)射子彈、敵機(jī)發(fā)射大子彈、背景音樂、子彈音效、分?jǐn)?shù)統(tǒng)計(jì)、菜單管理等功能。它雖然不會(huì)為你贏得什么獎(jiǎng)項(xiàng),但是可以總結(jié)前面所學(xué)的所有知識(shí),幫助大家更好地掌握cocos2d基本對(duì)象的使用,同時(shí)體驗(yàn)cocos2d的強(qiáng)大以及易用性。

一、開始前的準(zhǔn)備工作

首先打開Xcode,使用cocos2d iOS模板新建一個(gè)項(xiàng)目,命名為“AirfightGame”,然后選擇一個(gè)目錄,單擊“Create”按鈕。為cocos2d項(xiàng)目的源代碼添加-fno-objc-arc選項(xiàng)讓項(xiàng)目支持ARC。

接下來(lái),將所需要的資源文件,包括圖片和聲音拖到項(xiàng)目的“Resources”組。在游戲開發(fā)當(dāng)中,通常都會(huì)使用精靈表單來(lái)優(yōu)化游戲性能,在這個(gè)小游戲當(dāng)中,雖然這種性能優(yōu)化并不會(huì)有特別明顯的效果,但是建議大家以后開發(fā)游戲時(shí)都使用精靈表單來(lái)提高游戲性能。使用Zwoptex將所有圖片制作成精靈表單,生成對(duì)應(yīng)的airfightSheet.png和airfightSheet.plist文件,并將這兩個(gè)文件拖到項(xiàng)目的“Resources”組。

二、添加游戲菜單項(xiàng)功能

現(xiàn)在,我們來(lái)為游戲添加一個(gè)菜單設(shè)置功能,在這里可以完成開始游戲、游戲設(shè)置、退出游戲等操作。步驟如下。

① 選擇“AirfightGame”組并單擊右鍵,選擇“New File”,在左邊欄中選擇“cocos2d v2.x”模板,在右邊的模板類中選擇“CCNode class”模板類,“Subclass of”選擇“CCLayer”,然后單擊“Next”按鈕。命名為“MenuLayer”,然后單擊“Create”按鈕。

MenuLayer繼承自CCLayer,提供一個(gè)類方法scene供CCDirector對(duì)象調(diào)用。該類的作用是顯示一個(gè)菜單場(chǎng)景,讓用戶選擇。

打開MenuLayer.m文件,實(shí)現(xiàn)代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/MenuLayer.m

  1. -(id) init 
  2.     { 
  3.         if( (self=[super init]) ) { 
  4.             CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  5.             // 創(chuàng)建“開始游戲”標(biāo)簽,當(dāng)觸碰該標(biāo)簽時(shí),調(diào)用startGame:方法 
  6.             CCMenuItemFont* startItem = [CCMenuItemFont itemWithString:@"開始游戲" 
  7.                 target:self selector:@selector(startGame:)]; 
  8.             startItem.position=ccp(winSize.width/2, winSize.height*0.6); 
  9.             // 創(chuàng)建“游戲設(shè)置”標(biāo)簽,當(dāng)觸碰該標(biāo)簽時(shí),調(diào)用setting:方法 
  10.             CCMenuItemFont* settingItem = [CCMenuItemFont itemWithString:@"游戲設(shè)置" 
  11.                 target:self selector:@selector(setting:)]; 
  12.             // 設(shè)置“游戲設(shè)置”標(biāo)簽位置 
  13.             settingItem.position=ccp(winSize.width/2, winSize.height*0.4); 
  14.             // 創(chuàng)建控制菜單,并將兩個(gè)標(biāo)簽添加進(jìn)去 
  15.             CCMenu* menu = [CCMenu menuWithItems:startItem,settingItem, nil]; 
  16.             menu.position = CGPointZero; 
  17.             [self addChild:menu]; 
  18.         } 
  19.         return self; 
  20.     } 

init方法比較簡(jiǎn)單,創(chuàng)建了兩個(gè)CCMenuItemFont,選擇標(biāo)簽時(shí)會(huì)調(diào)用對(duì)應(yīng)的startGame:和setting:方法,并將它們添加到CCMenu當(dāng)中,再將CCMenu添加為當(dāng)前層的子節(jié)點(diǎn)。

添加startGame:setting:兩個(gè)方法,實(shí)現(xiàn)代碼如下(程序清單同上):

  1. -(void) startGame:(id)sender{ 
  2.         // 切換到PreloadLayer場(chǎng)景 
  3.         CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL 
  4.             transitionWithDuration:2.0 scene:[PreloadLayer scene]]; 
  5.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  6.     } 

startGame:方法非常簡(jiǎn)單,當(dāng)用戶選擇“開始游戲”標(biāo)簽時(shí),場(chǎng)景切換到PreloadLayer,在下一節(jié)中將重點(diǎn)介紹PreloadLayer(程序清單同上)。

  1. -(void) setting:(id)sender{ 
  2.         // 切換到SettingLayer場(chǎng)景 
  3.         CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL 
  4.             transitionWithDuration:2.0 scene:[SettingLayer scene]]; 
  5.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  6.     } 

當(dāng)用戶選擇“游戲設(shè)置”標(biāo)簽時(shí),場(chǎng)景切換到SettingLayer,進(jìn)行游戲設(shè)置。

同上面的步驟一樣,使用“cocos2d v2.x”模板創(chuàng)建一個(gè)類并命名為“SettingLayer”,繼承自CCLayer。該類的實(shí)現(xiàn)代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/SettingLayer.m

  1. -(id) init 
  2.     { 
  3.         if( (self=[super init]) ) { 
  4.             CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  5.             // 提示菜單項(xiàng) 
  6.             CCMenuItemFont* musicItem = [CCMenuItemFont itemWithString:@"背景音樂:"]; 
  7.             musicItem.position = ccp(winSize.width*0.4, winSize.height*0.6); 
  8.             // 創(chuàng)建“開”和“關(guān)”菜單項(xiàng) 
  9.             CCMenuItemFont* musicOn = [CCMenuItemFont itemWithString:@"開"]; 
  10.             CCMenuItemFont* musicOff = [CCMenuItemFont itemWithString:@"關(guān)"]; 
  11.             // CCMenuItemToggle,默認(rèn)顯示“開”。開=0,關(guān)=1 
  12.             CCMenuItemToggle* musicToggle = [CCMenuItemToggle itemWithTarget:self 
  13.                 selector:@selector(change:) items:musicOff,musicOn, nil]; 
  14.             musicToggle.position = ccp(winSize.width*0.6, winSize.height*0.6); 
  15.             // 創(chuàng)建“返回主菜單“菜單項(xiàng) 
  16.             CCMenuItemFont* returnItem = [CCMenuItemFont itemWithString:@"返回主菜單" 
  17.                 target:self selector:@selector(backToMainLayer:)]; 
  18.             returnItem.position = ccp(winSize.width/2, winSize.height*0.4); 
  19.             // 創(chuàng)建控制菜單,并將3個(gè)標(biāo)簽添加進(jìn)去 
  20.             CCMenu* menu = [CCMenu menuWithItems:musicItem,musicToggle,returnItem, nil]; 
  21.             menu.position = CGPointZero; 
  22.             [self addChild:menu]; 
  23.             // NSUserDefaults用戶首選項(xiàng)可以用來(lái)保存用戶在操作應(yīng)用的過(guò)程中設(shè)置的首選項(xiàng)。 
  24.             NSUserDefaults* userDef = [NSUserDefaults standardUserDefaults]; 
  25.             // 如果Bool為No,則顯示1=關(guān) 
  26.             if(![userDef boolForKey:@"music"]){ 
  27.                 musicToggle.selectedIndex = 1; 
  28.             } 
  29.         } 
  30.         return self; 
  31.     } 
  32.     -(void) change:(id)sender{ 
  33.         // 判斷mute(靜音)屬性,根據(jù)屬性狀態(tài)進(jìn)行切換 
  34.         if([CDAudioManager sharedManager].mute == TRUE){ 
  35.             [CDAudioManager sharedManager].mute = FALSE; 
  36.         }else
  37.             [CDAudioManager sharedManager].mute = TRUE; 
  38.         } 
  39.         NSUserDefaults* userDef = [NSUserDefaults standardUserDefaults]; 
  40.         CCMenuItemToggle* tooggle = (CCMenuItemToggle*)sender; 
  41.         // 關(guān)=1,設(shè)置Bool為NO 
  42.         if(tooggle.selectedIndex == 1){ 
  43.             [userDef setBool:NO forKey:@"music"]; 
  44.         }else
  45.             [userDef setBool:YES forKey:@"music"]; 
  46.         } 
  47.     } 
  48.     // 定義一個(gè)CCTransitionSlideInL場(chǎng)景切換效果,并使用CCDirector單例對(duì)象來(lái)切換場(chǎng)景 
  49.     -(void) backToMainLayer:(id)sender{ 
  50.         CCTransitionSlideInL* transitionScene = 
  51.             [CCTransitionSlideInL transitionWithDuration:2.0 scene:[MenuLayer scene]]; 
  52.         [[CCDirector sharedDirector] replaceScene:transitionScene]; 
  53.     } 

SettingLayer類代碼在13.13.2節(jié)中已經(jīng)詳細(xì)介紹過(guò),這里不再贅述。

修改IntroLayer.m文件

IntroLayer默認(rèn)加載HelloWorldLayer,但此時(shí)我們不再使用HelloWorldLayer作為應(yīng)用的第一個(gè)場(chǎng)景,而是使用MenuLayer作為應(yīng)用的第一個(gè)場(chǎng)景,因此需要修改IntroLayer,將IntroLayer改為加載MenuLayer場(chǎng)景。修改如下。

IntroLayer.m文件的頂部添加所包含的頭文件:

  1. #import "MenuLayer.h" 

修改-(void) makeTransition:(ccTime)dt方法,將該方法改成下面的代碼。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/IntroLayer.m

  1. -(void) makeTransition:(ccTime)dt 
  2.     { 
  3.         [[CCDirector sharedDirector] replaceScene: 
  4.             [CCTransitionFade transitionWithDuration:1.0 
  5.             scene:[MenuLayer scene] withColor:ccWHITE]]; 
  6.     } 

 

編譯并運(yùn)行游戲,運(yùn)行時(shí)模擬器顯示效果如圖13.58所示。

三、預(yù)加載游戲資源

在真實(shí)項(xiàng)目當(dāng)中,在游戲開始前,都會(huì)預(yù)先加載游戲所需要的圖片、背景音樂、音效等資源,這里介紹如何制作一個(gè)PreloadLayer來(lái)預(yù)加載游戲資源。

1. 創(chuàng)建PreloadLayer

選擇“AirfightGame”組并單擊右鍵,選擇“New File”,在左邊欄中選擇“cocos2d v2.x”模板,在右邊的模板類中選擇“CCNode class”模板類,“Subclass of”選擇“CCLayer”,然后單擊“Next”按鈕。命名為“PreloadLayer”,然后單擊“Create”按鈕。

PreloadLayer繼承自CCLayer,提供一個(gè)類方法sceneCCDirector對(duì)象調(diào)用。該類的作用是預(yù)加載游戲資源,在加載過(guò)程中會(huì)顯示一個(gè)進(jìn)度條,進(jìn)度條全部顯示完成代表加載完畢,加載完畢后顯示游戲主場(chǎng)景。

首先打開PreloadLayer.m文件,先在文件上方定義一個(gè)私有的Category。實(shí)現(xiàn)代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/PreloadLayer.m

  1. /** 
  2.      定義一個(gè)私有的Category,為了不讓API暴露給客戶端 
  3.      將一些類內(nèi)部所使用的方法和變量放在私有的擴(kuò)展里面,而不是直接聲明在頭文件當(dāng)中 
  4.      */ 
  5.     @interface PreloadLayer () 
  6.     - (void) loadMusics:(NSArray *) musicFiles;  // 加載背景音樂 
  7.     - (void) loadSounds:(NSArray *) soundClips;  // 加載游戲音效 
  8.     - (void) loadSpriteSheets:(NSArray *) spriteSheets;  // 加載精靈表單 
  9.     - (void) loadingComplete;  // 資源全部加載完成,切換到另一個(gè)游戲場(chǎng)景 
  10.     - (void) progressUpdate;  // 更新游戲進(jìn)度條,計(jì)算何時(shí)加載完成 
  11.     @end;

這里定義了一系列的load方法,每個(gè)方法接收一個(gè)NSArray數(shù)組作為參數(shù)。這些參數(shù)代表一些具體資源的文件名,參數(shù)值會(huì)從一個(gè)配置文件中讀取出來(lái),該配置文件在之后的代碼實(shí)現(xiàn)時(shí)會(huì)給出。

然后定義3個(gè)變量,其中sourceCount用來(lái)保存游戲需要加載的資源總數(shù);progress用于顯示進(jìn)度條,CCProgressTimer 類是cocos2d中對(duì)進(jìn)度條的一個(gè)封裝,用來(lái)實(shí)現(xiàn)各種進(jìn)度條功能,非常方便,之后我們還會(huì)使用該類來(lái)實(shí)現(xiàn)游戲的自定義血條量;progressInterval代表進(jìn)度條更新的次數(shù)。實(shí)現(xiàn)代碼如下

  1. @implementation PreloadLayer 
  2.     // 用來(lái)保存游戲需要加載的資源總數(shù) 
  3.     int sourceCount; 
  4.     // 顯示進(jìn)度條的成員變量 
  5.     CCProgressTimer* progress; 
  6.     // 代表進(jìn)度條更新的次數(shù) 
  7.     float progressInterval; 

2. PreloadLayer的具體實(shí)現(xiàn)

創(chuàng)建一個(gè)preloadResources.plist文件,該文件用于保存項(xiàng)目需要的所有資源文件,文件內(nèi)容如圖13.59所示。


可以看出,加載的音效是b0.mp3,精靈表單是airfightSheet.plist,背景音樂是s3.wav。

PreloadLayer.m文件中添加代碼。實(shí)現(xiàn)代碼如下。

程序清單:codes/13/13.14/AirfightGame/AirfightGame/PreloadLayer.m

  1. + (CCScene *) scene 
  2. 002 { 
  3. 003     CCScene* scene = [CCScene node]; 
  4. 004     PreloadLayer* layer = [PreloadLayer node]; 
  5. 005     [scene addChild:layer]; 
  6. 006     return scene; 
  7. 007 } 
  8. 008 - (id) init{ 
  9. 009     if((self = [super init])){ 
  10. 010         // 獲取屏幕大小 
  11. 011         CGSize winSize = [[CCDirector sharedDirector] winSize]; 
  12. 012         // 創(chuàng)建一個(gè)進(jìn)度條精靈 
  13. 013         CCSprite* barSprite = [CCSprite spriteWithFile:@"progressbar.png"]; 
  14. 014         // 初始化一個(gè)CCProgressTimer進(jìn)度條對(duì)象 
  15. 015         progress = [CCProgressTimer progressWithSprite:barSprite]; 
  16. 016         // setPercentage:0.0f,表示并未加載任何資源,表現(xiàn)在屏幕上就是什么也看不見 
  17. 017         [progress setPercentage:0.0f]; 
  18. 018         // 由于圖片大小關(guān)系,把scale設(shè)置成0.5,即縮小一半 
  19. 019         progress.scale = 0.5; 
  20. 020         // 設(shè)置進(jìn)度條動(dòng)畫的起始位置,默認(rèn)在圖片的中點(diǎn) 
  21. 021         // 如果想要顯示從左到右的一個(gè)動(dòng)畫效果,必須改成(0,y) 
  22. 022         progress.midpoint = ccp(0,0.5); 
  23. 023         // barChangeRate表示是否改變水平或者垂直方向的比例,設(shè)置成1表示改變,0表示不改變 
  24. 024         progress.barChangeRate = ccp(1,0); 
  25. 025         // 本例制作一個(gè)從左至右的水平進(jìn)度條,所以midpoint應(yīng)該是(0,0.5) 
  26. 026         // 因?yàn)閤方向需要改變,而y方向不需要改變,所以barChangeRate = ccp(1, 0) 
  27. 027         // kCCProgressTimerTypeBar表示為條形進(jìn)度條 
  28. 028         progress.type = kCCProgressTimerTypeBar; 
  29. 029         // 設(shè)置position在中心點(diǎn) 
  30. 030         [progress setPosition:ccp(winSize.width/2,winSize.height/2)]; 
  31. 031         // 將進(jìn)度條添加為當(dāng)前層的子節(jié)點(diǎn) 
  32. 032         [self addChild:progress]; 
  33. 033     } 
  34. 034     return self; 
  35. 035 } 
  36. 036 - (void) onEnterTransitionDidFinish{ 
  37. 037     [super onEnterTransitionDidFinish]; 
  38. 038     // 加載preloadResources.plist配置文件 
  39. 039     NSString* path = [[CCFileUtils sharedFileUtils] 
  40. 040         fullPathFromRelativePath:@"preloadResources.plist"]; 
  41. 041     // 讀取配置文件中的游戲資源名稱列表,返回一個(gè)NSDictionary對(duì)象 
  42. 042     NSDictionary* resources = [NSDictionary dictionaryWithContentsOfFile:path]; 
  43. 043     // 通過(guò)key值取出每種不同類型資源的數(shù)組 
  44. 044     NSArray *spriteSheets = [resources objectForKey:@"SpriteSheets"]; 
  45. 045     NSArray *sounds = [resources objectForKey:@"Sounds"]; 
  46. 046     NSArray *musics = [resources objectForKey:@"Musics"]; 
  47. 047     // 調(diào)用數(shù)組的count方法得到總共需要加載的資源數(shù)量 
  48. 048     sourceCount = [spriteSheets count]  + [sounds count] + [musics count]; 
  49. 049     // 設(shè)置進(jìn)度條更新次數(shù)=100/需要加載的資源數(shù)量 
  50. 050     progressInterval = 100.0 / (float) sourceCount; 
  51. 051     // 調(diào)用performSelectorOnMainThread在主線程上依次加載每種類型的游戲資源 
  52. 052     // waitUntilDone的值為YES能保證所有的資源按照序列依次加載 
  53. 053     if(sounds){ 
  54. 054         [self performSelectorOnMainThread:@selector(loadSounds:) 
  55. 055             withObject:sounds waitUntilDone:YES]; 
  56. 056     } 
  57. 057     if(spriteSheets){ 
  58. 058         [self performSelectorOnMainThread:@selector(loadSpriteSheets:) 
  59. 059             withObject:spriteSheets waitUntilDone:YES]; 
  60. 060     } 
  61. 061     if(musics){ 
  62. 062         [self performSelectorOnMainThread:@selector(loadMusic:) 
  63. 063             withObject:musics waitUntilDone:YES]; 
  64. 064     } 
  65. 065 } 
  66. 066 // 加載背景音樂 
  67. 067 - (void) loadMusics:(NSArray *)musicFiles{ 
  68. 068     for (NSString *music in musicFiles) { 
  69. 069         [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:music]; 
  70. 070         [self progressUpdate]; 
  71. 071     } 
  72. 072 } 
  73. 073 // 加載聲音 
  74. 074 - (void) loadSounds:(NSArray *)soundClips{ 
  75. 075     for (NSString *soundClip in soundClips) { 
  76. 076         [[SimpleAudioEngine sharedEngine] preloadEffect:soundClip]; 
  77. 077         [self progressUpdate]; 
  78. 078     } 
  79. 079 } 
  80. 080 // 加載精靈表單 
  81. 081 - (void) loadSpriteSheets:(NSArray *)spriteSheets{ 
  82. 082     for (NSString *spriteSheet in spriteSheets) { 
  83. 083         // 該方法會(huì)加載與該plist文件名稱相同但后綴為.png的紋理圖片 
  84. 084         // 把該plist的所有spriteFrame信息讀取出來(lái) 
  85. 085         // 在之后的代碼中可以通過(guò)spriteFrameWithName獲取相應(yīng)的精靈幀 
  86. 086         // 本例中airfightSheet.plist對(duì)應(yīng)airfightSheet.png 
  87. 087         [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: spriteSheet]; 
  88. 088         [self progressUpdate]; 
  89. 089     } 
  90. 090 } 
  91. 091 - (void) progressUpdate{ 
  92. 092     // 每次調(diào)用該方法說(shuō)明加載一個(gè)資源,自減更新資源總數(shù) 
  93. 093     if (--sourceCount) { 
  94. 094         [progress setPercentage:100.0f-(progressInterval * sourceCount)]; 
  95. 095     }else
  96. 096         // CCProgressFromTo動(dòng)作用于以漸進(jìn)的方式顯示圖片 
  97. 097         // actionWithDuration表示持續(xù)0.5秒,from表示進(jìn)度條百分百?gòu)拈_始一直到100 
  98. 098         CCProgressFromTo *ac = [CCProgressFromTo actionWithDuration:0.5 
  99. 099             from:progress.percentage to:100]; 
  100. 100         // 當(dāng)資源全部加載完畢時(shí)調(diào)用loadingComplete方法 
  101. 101         CCCallBlock *callback = [CCCallBlock actionWithBlock:^() { 
  102. 102             [self loadingComplete]; 
  103. 103         }]; 
  104. 104         // CCSequence組合動(dòng)作 
  105. 105         id action = [CCSequence actions:ac.callback.nil]; 
  106. 106         // 進(jìn)度條執(zhí)行動(dòng)作 
  107. 107         [progress runAction:action]; 
  108. 108     } 
  109. 109 } 
  110. 110 // 延遲2秒之后運(yùn)行一個(gè)場(chǎng)景切換特效跳轉(zhuǎn)到游戲主場(chǎng)景,即HelloWorldLayer 
  111. 111 - (void) loadingComplete{ 
  112. 112     CCDelayTime *delay = [CCDelayTime actionWithDuration:2.0f]; 
  113. 113     CCCallBlock *callblock = [CCCallBlock actionWithBlock:^(void) { 
  114. 114         [[CCDirector sharedDirector] replaceScene: 
  115. 115         [CCTransitionFade transitionWithDuration:1.0f scene:[HelloWorldLayer scene]]]; 
  116. 116     }]; 
  117. 117     CCSequence *sequence = [CCSequence actions:delay.callblock.nil]; 
  118. 118     [self runAction:sequence]; 
  119. 119 } 
  120. 120 @end 

下面依次解釋以上代碼中的每一個(gè)方法。

Ø +(CCScene *) scene方法很簡(jiǎn)單,和前面的一樣,首先創(chuàng)建了一個(gè)scene場(chǎng)景,然后創(chuàng)建了一個(gè)PreloadLayer層,將PreloadLayer層作為scene場(chǎng)景的子節(jié)點(diǎn),最后返回scene場(chǎng)景。

Ø init方法首先獲取屏幕窗口大小,然后創(chuàng)建了一個(gè)進(jìn)度條。這里使用progressbar.png圖片初始化一個(gè)精靈,再通過(guò)該精靈初始化一個(gè)CCProgressTimer對(duì)象,設(shè)置setPercentage屬性為0,表示當(dāng)前未加載任何資源,表現(xiàn)在屏幕上就是什么也看不見。由于圖片大小關(guān)系,把scale設(shè)置成0.5,即縮小一半。

接下來(lái)設(shè)置CCProgressTimer對(duì)象最重要的3個(gè)參數(shù)。

q Ø midpoint:表示進(jìn)度條動(dòng)畫的起始位置,默認(rèn)在圖片的中點(diǎn),如果想要顯示從左到右的一個(gè)動(dòng)畫效果,則必須改成(0,y)。

q Ø barChangeRate:表示是否改變水平或者垂直方向的比例,設(shè)置成1表示改變,0表示不改變。本例制作一個(gè)從左至右的水平進(jìn)度條,所以midpoint應(yīng)該是(0,0.5)。因?yàn)?/span>x方向需要改變,而y方向不需要改變,所以設(shè)置barChangeRateccp(1,0)。

q Ø type:設(shè)置為kCCProgressTimerTypeBar,表示條形進(jìn)度條。

關(guān)于CCProgressTimer類的使用可以參考官方文檔,讀者也可以找到cocos2d的示例項(xiàng)目cocos2d-tests-ios.xcodeproj,并運(yùn)行ActionProgressTest這個(gè)TARGET。感興趣的讀者也可以仔細(xì)分析該項(xiàng)目中的ActionProgressTest.m源文件(位于項(xiàng)目的tests目錄下)來(lái)掌握不同progress的用法示例。

最后設(shè)置CCProgressTimer對(duì)象的位置,并添加為當(dāng)前層的子節(jié)點(diǎn)。

onEnterTransitionDidFinish方法加載配置文件preloadResources.plist,讀取配置文件中的游戲資源名稱列表并存儲(chǔ)在不同的數(shù)組中。首先使用CCFileUtil獲得plist文件的具體路徑,調(diào)用NSDictionarydictionaryWithContentsOfFile方法把該文件轉(zhuǎn)換成一個(gè)字典對(duì)象。然后通過(guò)字典的key值取出不同類型資源的數(shù)組,調(diào)用每個(gè)數(shù)組的count方法累加得到總共需要加載的資源總數(shù)量,使用100除以資源總數(shù)量獲得進(jìn)度條需要更新次數(shù)用于之后計(jì)算進(jìn)度條顯示的百分比。最后將數(shù)組作為參數(shù)調(diào)用performSelectorOnMainThread: withObject: waitUntilDone:方法在主線程中依次加載每種類型的游戲資源,將waitUntilDone的值設(shè)置為“YES”能保證所有的資源按照序列依次加載。

loadMusics:loadSounds:方法比較簡(jiǎn)單,通過(guò)循環(huán)遍歷數(shù)組,預(yù)加載背景音樂和音效,加載完后調(diào)用progressUpdate方法更新進(jìn)度條。

這里需要注意的是loadSpriteSheets:方法,該方法循環(huán)遍歷數(shù)組,數(shù)組的每個(gè)元素是一個(gè)plist文件名稱,調(diào)用CCSpriteFrameCacheaddSpriteFramesWithFile時(shí),該方法會(huì)加載與該plist文件名稱相同但后綴為.png的紋理圖片(本例中airfightSheet.plist對(duì)應(yīng)airfightSheet.png),把該plist的所有spriteFrame信息讀取出來(lái),之后在項(xiàng)目當(dāng)中就可以通過(guò)spriteFrameWithName獲取相應(yīng)的精靈幀了。

progressUpdate方法比較簡(jiǎn)單,每次被調(diào)用時(shí)自減更新資源總數(shù)變量,修改進(jìn)度條的百分比。當(dāng)資源全部加載完畢時(shí)調(diào)用loadingComplete方法。

loadingComplete方法被調(diào)用說(shuō)明資源加載完畢,延遲2秒后運(yùn)行一個(gè)場(chǎng)景切換特效跳轉(zhuǎn)到游戲主場(chǎng)景HelloWorldLayer。

編譯并運(yùn)行游戲,選擇“開始游戲”菜單項(xiàng),模擬器首先會(huì)顯示一個(gè)進(jìn)度條,進(jìn)度條全部顯示完畢切換到HelloWorldLayer顯示經(jīng)典的Hello World畫面。恭喜你!資源文件加載成功,進(jìn)度條功能實(shí)現(xiàn)。運(yùn)行時(shí)模擬器顯示效果如圖13.60所示。

————本文節(jié)選自《瘋狂ios講義(下)》

責(zé)任編輯:閆佳明 來(lái)源: oschina
相關(guān)推薦

2010-03-18 16:45:00

云計(jì)算

2012-07-24 09:18:39

編程程序員

2012-12-11 09:37:03

開源硬件開源軟件

2013-06-09 10:51:35

2011-04-27 10:57:29

高性能web開發(fā)

2022-09-05 08:04:16

mergeconcat?pandas

2020-05-25 20:59:49

CDN云計(jì)算服務(wù)器

2013-08-28 13:51:19

2015-02-13 10:20:15

微信

2015-09-28 14:30:41

聯(lián)想

2019-03-12 17:17:44

華為云

2022-06-01 07:10:43

遞歸字典極限

2010-10-14 12:00:28

2015-10-08 09:17:47

創(chuàng)業(yè)浮躁

2022-02-12 17:19:04

元宇宙Meta數(shù)字經(jīng)濟(jì)

2013-08-06 09:57:13

2020-07-03 07:46:22

CPUOS內(nèi)存

2011-09-26 09:18:16

Android專利

2013-12-18 16:43:16

順序多核

2018-11-15 09:03:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)