Cocos2d-iphone學習筆記


這是我根據知易的<知易Cocco2D-iPhone開發教程>做的一些問題匯總吧,希望對大家有幫助.

 

1. 說下iphone游戲的啟動流程

答:

(1)     主程序入口 – main.m

 

Int main(int argc, char *argv[]) {

           NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

          

           UIApplicationMain(argc, argv, nil, @”T01AppDelegate”);

           [pool drain];

 

           return 0;

}

 

 

(2)     講程序的控制權傳遞給了應用程序代理對象 – 代碼中是: T01AppDelegate

類T01AppDelegate 對象通過實現iphone OS 系統定義的應用程序接口UIApplicationDelegate 來處理當前應用程序需要處理的各種系統事件:

l  放棄控制權: applicationWillResignActive

l  獲得控制權:applicationDidBecomeActive

l  內存報警:applicationDidReceiveMemoryWarning

l  程序退出提示:applicationWillTerminate

l  系統時間變化:applicationSignificantTimeChange

當完成初始化之后,通過函數applicationDidFinishLaunching將程序的控制權傳遞給Cocos2d-iphone的類庫.

(3)     當Cocos2d-iphone 接收到程序的控制權之后,開始准備啟動游戲主畫面的准備:

3.1 獲得主窗口對象(句柄) 由window保存.

3.2 將Cocos2d-iphone的”導演”與之綁定

3.3 設置”導演”對象的基本屬性

3.4 導演創造場景

3.5 將對象層加入到當前場景

3.6 由導演對象啟動並運行場景

 

2.如何安裝cocos2d-iphone引擎到xcode中?

答: 啟動終端,然后定位到cocos2d-iphone所在的目錄,然后打命令…

./install-templates.sh

 

但是,如果安裝不成功,就需要你有更高的權限,命令如下

----------------------------

sudo –s       回車

password:     然后輸入密碼回車

----------------------------

就能切換到 bash-3.2# 用戶了.

 

3. Xcode4 如何設置set Active Target?

答: 點擊product -> Edit Schema.. 彈出的頁面 最下面有一個 Manage Schemes…  雙擊你要運行的**.xcodeproj文件,即可.

 

4. 幾乎所有游戲開發中的組成元素?

答: 場景 層 精靈 導演 .

    這4個元素的復雜程度決定了游戲的復雜程度.

 

5. 層(Layer)是如何處理事件的?

答: 我個人稱為 : 下沉處理.  即 從最上層開始接收事件,如果不處理,事件下沉到下面的層以此類推,直到有一層處理了事件為止事件就不在下沉.

 

6. 為了方便,Cocos2d-iphone從技術實現角度提供了一些公用層,例如,處理菜單用的菜單曾(Menu) ,處理顏色顯示的顏色層(ColorLayer)等.

 

7. 精靈的本質是什么?

答: 精靈就是一張不斷變化的圖片.

 

8. 什么是游戲?

答: 游戲就是 玩家操作一個或多個人工控制的精靈與一個或者若干個系統控制的精靈進行互動: 近身搏斗, 遠程射擊, 貼近對話等等.

 

9. 導演的作用(Cocos2d-iphone)?

答: 導演是按照工作流程,控制場景之間切換的.

     既然控制場景的,就有一系列操作場景的方法, 例如: 終止, 壓棧, 激活當前場景, 引導下一個場景.

特別說明: 同一時間,只有一個Scene(場景)處於激活狀態;

可以說Scene 是Layer的一個容器.

 

10. 問:Director對象是操作場景的,那它有哪些屬性和方法與場景有關呢?

答:

屬性:

(1) Scene *runningScene_;

(2) Scene *nextScene;

(3) NSMutableArray *sceneStack_;

方法:

(1)     (void) runWithScene: (Scene *) scene; 主程序啟動,顯示第一個場景的方法.

(2)     (void) pushScene: (Scene *) scene; 掛起當前場景,並且壓棧到隊列中. 將傳入場景設置為當前執行場景.

(3)     (void) popScene; 執行隊列中的最后一個場景,當前場景被釋放.若隊列中沒有場景,系統自動退出,調用end方法.

(4)     (void) replaceScene: (Scene *) scene; 直接用一個場景取代當前場景,當前場景被釋放.

(5)     (void) end; 結束場景運行;

 

 

11. CCLayer的主要功能是什么?

(1)     接收Iphone上的屏幕觸摸(touch)操作輸入.

(2)     接收動力感應(Accelerometer)輸入

 

12. 為了方便開發,Cocos2d-iphone提供了一些直接可用層,分別有什么?

答: 3個.

           顏色層 - ColorLayer : 這是一個透明的丶可以按照RGB設置填充顏色的層.可以通過setContentSize設置層大小,改變顏色塊的尺寸. 也支持動作,可以閃爍丶漸變.

           菜單層 Menu : 這是一個以Menu對象為集合類,MenuItem類實例組成各種各樣按鈕的菜單管理選擇畫面層.

           注意: 該層中的實例必須是MenuItem類或者子類的實例.

           Menu類是控制MenuItem類實例的橫向,豎向或者多行列排序展示MenuItem類實例的.

           復合層 - MultiplexLayer

 

13. MenuItem是否可以直接使用,他的主要任務是什么?

答: MenuItem是基類,不要直接使用.作為所有菜單項的父類,MenuItem主要完成以下兩個任務:

(1)     設置按鈕的狀態

(2)     負責回調處理函數.

 

 

14. 我在看MenuItem的子類和實現的文件中,發現一種常用的寫法. 就是把父類的定義子類的定義寫在一個文件里,然后分別在不同的文件,實現不同的子類.例如:

#import <Foundation/Foundation.h>

/// 父類 ///

@interface Person

@end

 

/////////// 子類1

@interface Boy

@end

 

 

/////////// 子類2

@interface Gril

@end

 

 

----------------------------------

實現Boy類

#import “Person.h”

@implementation Boy

@end

 

實現Girl類

#import “Person.h”

@implementation Gril

@end

 

 

15. 分別說明Scene, layer, sprite的作用?

答:

Scene :

(1) 作為某個場景的總容器對象,包括所有的內容對象(菜單, 狀態, 游戲角色, NPC) 都屬於該對象.層疊關系通過CocosNode的addChild的Z參數決定.

(2) 實現場景切換的特殊效果.因為所有的場景切換特效都是從Scene的子類TransitionScene派生的.  (記住 Cocos2d-iphone中,都要在類前面加上CCScene)

 

Layer – 為了處理輸入問題

(1)     Touch事件處理

(2)     動力感應處理

 

Sprite

(1)     展示靜態圖片(例如背景圖)

(2)     使用AtlasSprite,展示游戲角色和NPC角色

 

16. 場景(Scene)間是如何轉換的?

答:

(1)     首先,new一個場景容器

(2)     把要變的層,加到新開辟的scene里面

(3)     用導演換層

例如:

-(void)nextGame(id) sender

{

         Scene *sc = [Scene node];

         [sc addChild:[NextGameLayer node]];

         [[Director sharedDirector] replaceScene:sc];

}

         若,切換層的時候,需要特效,比如,漸變,幻燈片等,則可用到CCTransition及其子類,例如:

         [Director sharedDirector] replaceScene:[CCTransitionSlideInR transitionWithDuration:1.2f scene:sc]];

 

17. Iphone平台提供了幾種會圖庫? 分別是?

答: 兩種. 分別是quartz 2D 和 OpenGL ES

Quartz 2d 是 Core Graphics 繪圖庫的子集.

OpenGL ES 是跨平台繪圖庫OpenGL的子集.(Cocos2d-iphone是用的這個)

他們有什么不同嗎? 他們的坐標系原點就不同.

 

18. 什么是錨點(anchorPoint)?

答: anchorPoint是定義在精靈,層等中的一個點,放置精靈層等到坐標系中是一此點位參考點的.

 

19. *.fnt是什么格式,什么時候用到?

答: .fnt是字體文件集.可以加載到系統,生成相應的字體. 如:

CCLabelBMFont *showFont = [CCLabelBMFont labelWithString:@”hello world” fntFile:@”font09.fnt”];

 

20. CCTextureCache 和 CCSpriteBatchNode 和 CCSpriteFrameCache類的作用分別是什么?

答:

           CCTextureCache

           通過系統的類CCTextureCache,Cocos2d-iphone庫,按照文件名為主鍵索引全部運行時讀取的圖像文件.當文件名一樣時,直接返回內存圖片而不再讀取文件.

           所有與圖像文件有關的實現在底層統一透明調用CCTextureCache類的單例對象,保證最少的系統IO操作,提高程序運行效率.

           CCSpriteBatchNode

           通過批量提交繪畫,減少OpenGL函數調用次數.

           通過系統類CCSpriteSheet,Cocos2d-iphone庫將所有CCSpriteBatchNode類對象所屬的子CCSprite對象一次提交OpenGL輸出.

           CCSpriteFrameCache

           管理動畫效果的全部幀數,該類直接提供針對一個簡單的圖像處理工具http://zwoptex.zwople.com/輸出文件支持.該類的實現也調用了CCTextureCache.

 

21. Cocos2d-iphone中循環調用回調函數的方法是什么?

答:[self schedule:@selector(step:)  interval:1];

 

22. 如何設置一組動畫,並且運行呢?

答:用CCAnimation,例如:

CCSpriteBatchNode *mgr = [CCSpriteBatchNode batchNodeWithFile:@”fight.png” capacity:5];

 

CCAnimation *ans = [CCAnimation animationWithArray:nil  delay:0.2f];

[ans addFrameWithTexture:mgr.texture   rect:CGRectMake(0, 0, 31, 30)];

[ans addFrameWithTexture:mgr.texture   rect:CGRectMake(5, 0, 31, 30)];

[ans addFrameWithTexture:mgr.texture   rect:CGRectMake(10, 0, 31, 30)];

這樣ans對象就保存了一組動畫幀.

如何根據動畫創建動作的?

fight = [CCSprite spriteWithTexture:mgr.texture   rect:CGRectMake(0, 0, 31, 30)];

id action = [CCAnimate actionWithAnimation:ans];

[fight runAction:[CCRepeatForever actionWithAction:action];

 

 

23. CCLayer遵守了什么協議,以方便用戶的觸摸動作? 協議定義的方法是什么?

答: CCLayer遵守的與觸摸相關的協議是<CCStandardTouchDelegate>

 

@protocol  CCStandardTouchDelegate <NSObject>

@optional

(void) ccTouchesBegan: (NSSet *) touches withEvent:(UIEvent *) event;

(void) ccTouchesMoved: (NSSet *) touches   withEvent: (UIEvent *) event;

(void) ccTouchesEnded: (NSSet *) touches withEvent: (UIEvent *) event;

(void) ccTouchesCancelled: (NSSet *) touches withEvent: (UIEvent *) event;

@end

 

24. 實現了 <CCStandardTouchDelegate>協議的ccTouchXX方法,為什么在運行程序是不進入方法呢?

答: 要想啟動觸發事件,首先你需要在layer的初始化方法里,加入以下代碼:

self.isTouchEnabled = YES; // 默認是NO

 

 

 

25. 雙點觸控,如何判斷是手勢的合同,還是分開?

答:

(1)     判斷是否是雙點觸控

(2)     計算兩點間的距離

(3)     在移動的方法里,判斷兩點間的距離,與之前倆點間的距離比較.

 

示例代碼如下:

 

-(void) ccTouchesBegan:(NSSet *) touches  withEvent:(UIEvent *) event {

NSSet *allTouches = [event allTouches];

float distances;

float afterMovedDistances;

swith([allTouches count]) {

         case 1: //單點

                   break;

         case 2 : // 兩點

                   UITouch *touchStartPoint = [[allTouches allObjects] objectAtIndex:0];

                   UITouch *touchToPoint = [[allTouches allObjects] objectAtIndex:1];

                   distance = [self distanceBetweenTwoPoints:(UITouch *) start  toPoint:(UITouch *) to];

                   break;

         default:

 break;

}

}

 

 

-(float) distanceBetweenTwoPoints:(UITouch *) start   toPoint: (UITouch *) to {

           CGPoint startLocation = [start locationInView:[start view]] ;

           CGPoint toLocation = [[to locationInView:[to view]];

           float x = startLocation.x – toLocation.x;

           float y = startLocation.y – toLocation.y;

           return sqrt(x * x + y * y);  // 求 直角三角形斜線長

}

-(void) ccTouchesMoved: (NSSet *) touches   withEvent: (UIEvent *) event {

           NSSet *allTouches = [event allTouches];

           swich([allTouches count]) {

         case 1 : break;

         case 2:

                   UITouch *startTouch = [[allTouches allObjects] objectAtIndex : 0];

                   UITouch *toTouch = [[allTouches allObjects] objectAtIndex:1];

                   afterMovedDistances = [self distanceBetweenTwoPoints:startTouch  toPoint:  toTouch];

                   if( distances > afterMovedDistances ) {

                            // 合攏手勢

} else if (distances < afterMovedDistances) {

         // 分開手勢

}

break;

 

default:

         break;

}

}

 

 

26. 如何判斷觸電是單擊,還是雙擊?

答: 代碼如下:

-(void) touchesEne: (NSSet *)touches withEvent: (UIEvent *) event {

NSSet *allTouches = [event allTouches];

switch([allTouches count]) {

         case 1:

                   UITouch *touch = [[allTouches allObjects] objectAtIndex:0];

         switch([touch tapCount]) {

         case 1:

                   //單機

                   break;

         case 2:

                   //雙擊

                   break;

         default:

                   break;

}

 

default:

         break;

}

}

 

 

 

27. Coco2d的事件處理機制?

答: 看教程 沒看懂. [預留].

 

 

28. 手機上的地圖按照畫面滾動方式,分為哪幾類?

答: 3類;

(1)     縱向滾動

打飛機類游戲

(2)     橫向滾動

超級瑪麗

(3)     橫縱向滾動

RPG類.

29. 制作場景地圖時,主要考慮到哪些問題?

答:

(1)     移動位置控制 : 主角在地圖中移動時必須考慮到地圖中物體的障礙, 不能越過牆體, 必須通過木橋渡過河流.更加真實的模擬會要求主角在不同的地面上有不同的移動速度.

(2)     地圖的動態變化 : 主角在游戲過程中的行為導致地圖變化(永久變化,不是臨時變化,如: 敵人屍體腐爛,慢慢消失, 這種效果不涉及到修改地圖).摧毀敵方建築,修建我方建築等

 

30. 地圖編程應該考慮哪些問題?

答:

(1)     如何展示一個較大的地圖場景.

(2)     地圖對精靈的移動限制.

(3)     如何動態的改變局部地圖的顯示內容

 

31. 如何設置Cocos2d-iphone程序的啟動橫豎屏?

答: 在RootViewController.m文件里.

找到如下代碼:

#elif GAME_AUTOROTATION == kGameAutorotationUIViewController

return ( UIInterfaceOrientationIsLandscape( interfaceOrientation  ));

//return ( UIInterfaceOrientationIsPortrait( interfaceOrientation ) );

 

 

32. Map Editor工具的作用是什么? (Tiled地圖編輯器,下載地址http://mapeditor.org/)

答: Map Editor是繪制場景地圖的.生成的地圖是*.tmx格式的(本質是XML文件).

注意:生成的地圖,要與地圖組成元素的*.png圖片放在一起.

 

33. Cocos2d-iphone對於Tiled地圖繪制工具的支持表現在哪些方面?

(1)     地圖類型

& orthogonal  isometric完全支持

& hexagonal 部分支持

(2)     “瓦片”圖集

& 不支持將圖形文件保存到*.tmx文件中的嵌入式”瓦片”圖集. 僅支持外部”瓦片”圖集. 也就是說,地圖必須是一個tmx文件和一個圖像文件組成.

(3)     層

& Cocos2d-iphone 支持任意數量的層

& 每個層對應的編程接口類是TMXLayer (AtlasSpriteManager的子類)

& 每個 “瓦片” 對應的編程接口類是AtlasSprite

 

 

34. Cocos2d-iphone實現地圖顯示的2個主要組件文件是什么?

答: & 負責整體地圖的顯示: CCTMXTiledMap.h CCTMXTiledMap.m

   & 負責xml文件讀取和解析: CCTMXXMLParser.h   CCTMXXMLParser.m

 

35. 如何加載游戲地圖呢?

答: CCTMXTiledMap *gameWorld = [CCTMXTiledMap tiledMapWithFile:@”Level1.tmx”];

   [self addChild:gameWorld  z:0 tag:9];

 

36. CCTMXLayer的作用是什么?

答:CCTMXLayer是CCSpriteBatchNode的子類,我們知道CCSpriteBatchNode是把所有的圖像緩存起來,CCTMXLayer的作用就是把地圖的圖像緩存起來,這樣我們就能以”瓦片”單位取得地圖上不同的”瓦片”.

 

 

 

37. 30幀/秒是什么意思?

答: 圖像引擎以每秒30次的頻率不斷將內存數據所描繪的虛擬世界畫到IPHONE屏幕上.

 

 

38. 由3類獨立的程序邏輯組成了游戲程序的主要編程模型,是哪3類?

答:

(1)     用戶輸入: “觸摸”或重力感應時玩家精靈下達各種指令

(2)     AI引擎指令: 由系統對非玩家精靈下達的各種指令

(3)     各類定時邏輯: 前兩類指定直接修改游戲精靈狀態.

                            各類定時邏輯根據各種精靈的相互位置信息判斷可能觸發的精靈或環境變化.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM