en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

6.10.2011

在 CCScene 中加入單張影像的方法


在 cocos2d 中,一個完整的應用程式是由許多的場景(CCScene)所構成,其每個場景都包含各自的的圖層元件(CCLayer and CCSprite),一個場景可以由一個或是多個圖層元件所組成,而所有的場景是彼此的獨立的(它們可能不知道對方的存在),必須經由 CCDirector 來控制或是調用這些場景。下面示範就從最基本的建立專案開始,一直到為第一場景加入一張靜態影像為止,請看以下說明。

首先從專案樣板內選取 cocos2d 樣板建立新專案,由於此範例只是簡單的加入圖片,並不需要物理學等演算法,所以使用基本的 cocos2d 樣板即可。


在建立好專案之後,會出現一大堆的檔案,但是大部分的檔案都是屬於 cocos2d 的核心,跟這次的範例完全沒有關係,由於 cocos2d 並沒有安裝特殊的函式庫或是第三方的 Framework,所以就算是把整個專案移到沒有安裝 cocos2d SDK 的 Xcode 上,專案照樣可以正常執行,這也就侍衛什麼會出現這麼多檔案的原因了。

回到正題,找到專案名稱資料夾下的檔案 HelloWorldLayer.h 和 HelloWorldLayer.m,這兩個檔案是在使用 cocos2d 樣板建立新專案時自動產生的,也是預設第一個場景所需要的圖層元件,接下來我們將仿造這兩個檔案的內容來設定新的場景。


首先是建立一個全新的 CCLayer,作法是專案上點擊滑鼠右鍵選擇 New File,找到 CCNode class 然後新增一個 CCLayer Subclass(CCScene、CCLayer 和 CCSprite 都是繼承此類別)並命名為 ImageLayer。


緊接著我們要替剛剛建立的 ImageLayer 物件補上建構式和解構式,其程式碼如下。

- (ImageLayer *)init {
    if ((self=[super init])) {

        //取得整個畫面的大小
        CGSize screenSize = [CCDirector sharedDirector].winSize;

        //製作一張影像
        CCSprite *logoSprite = [CCSprite spriteWithFile:@"Landspace.png"];

        //調整影像位置
        logoSprite.position = ccp(screenSize.width / 2,screenSize.height / 2);

        //加入影像
        [self addChild: logoSprite];
    }

    return self;
}

- (void)dealloc {
    [super dealloc];
}

在建構式調整影像位置的部份,其中 ccp() 方法被定義在 CGPointExtension.h 文件中,作用等同於 CGPointMake()。

程式碼到這裡就如建構式所寫已經可以成功將影像加入到 CCLayer 中,但是這樣還不足以將影像呈現於畫面上,還記得一開始引言所提,CCLayer 必須加入到 CCScene 中,並且要由 CCDirector 主動來調用該 CCScene 才行,所以我們還必須為 ImageLayer 加上一個回傳 CCScene 指標的類別方法,好讓 CCDirector 來調用它,其程式瑪如下。

+ (CCScene *)scene {
    CCScene *scene = [CCScene node];
    ImageLayer *layer = [ImageLayer node];

    //將圖層元件加入到場場景中
    [scene addChild: layer];

    return scene;
}

上述程式碼中的 node 是屬於類別方法,它被定義在最上層的 CCNode class 中,目的主要是分配記憶體給產生出來的物件並且在不再被使用(reference)時自動釋放其記憶體位置。

+ (id)node {
    return [[[self alloc] init] autorelease];
}

現在場景 CCScene 也已經準備好了,就等著由 CCDirector 來調用它。回到專案資料夾下,找到 AppDelegate.m 檔案,在方法 applicationDidFinishLaunching: 中可以找到以下程式碼,將 CCDirector 所調用的類別換成 ImageLayer 即可。

- (void) applicationDidFinishLaunching:(UIApplication*)application {

//以上省略
//Run the intro Scene
[[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
}

[[CCDirector sharedDirector] runWithScene: [ImageLayer scene]];
ps:在本範例中所使用的圖片 Landspace.png 為橫向的 480 x 320 影像,必須事前就移至專案內的 Resources 或是 Supporting Files 資料夾中備用。






沒有留言:

張貼留言