雪花台湾

cocos2d 第二課 建立第一個 cocos2d Game

 

這些文章是來自於 www.cocos2d-iphone.org 的英文文章,我有修整一些內容,或部份附上原文未譯的連結,細節請參考原出處

 
 

課程目標

 
 

當你完成這個課程,你將能夠建立一個新的cocos2d的專案,添加一些 sprite,並讓他們走動,無論是自主或觸摸事件的對應。
請先完成第一課的課程,並了解一些基本概念 

 Please be sure you understand Lesson 1. Install & Test as well as the basic concepts before proceeding.

 

初始化

 
 

第一課,你應該已使用cocos2d應用程序範本建立一個新的轉案。打開該專案,然後執行行它,以確保它顯示的“Hello World”您所期望的相同。

您可能已經注意到,現在,它推出的一個cocos2d的啟動畫面,當你按 “Home” 按鈕退出執行,你可以看到它有cocos2d的圖示。這些來圖像,在“資源”文件夾中的項目你可以在磁碟機中找到他們,現在可以了解一下他們到底在那,因為你最終用自己的圖像取代,這也是在這裡您可以添加圖片背景和 sprite 的位置。

(如果你想更換的開機圖和/或圖標,只需更換新的同樣大小的磁碟上的圖像,他們是命名為“Default.png”和“的icon.png” 。 )

讓我們增加一個額外的圖片,建立一個 sprite 類別的物件。將圖像保存在您的項目在磁盤上的“資源”文件夾中的權利,命名“seeker.png”。 (你可以下載本文中的圖示來用,實際的圖在 cocos2d 的網站上,你可以用自已的圖片取代)

現在切換到Xcode,將下載的 seeker.png 拖進專案中,並copy 至專案。你應該確認專案中有 seeker.png。

這一課,我們將需要兩個 sprite ,但為了簡便起見,我們只使用已經包含在項目 icon.png 作為我們的第二個 sprite

 
 

建立 Sprite 類別物件


打開你的專案,你應該會看到四個文件,代表兩個畫面物件
  


首先,我們要建立兩個 sprite 類別,讓它會動,可以接受 touch 事件等。有很多種方法可以做到,在很多示範列中,會在每個 sprite 物件中加入 tag 數字,再用 getChildByTag 方法來處理。 這種方法很不錯,但有很多額外工作要做,而且在大型遊戲中可能會有效能問題。

 

我們先用一個簡單的方法﹣建立兩個全域變數來建立實體(通常不會這樣作)。

我們先在 @implementation 後,建立了兩個 CCSprite 段

 

@implementation HelloWorldLayer{

    CCSprite *seeker1;

    CCSprite *cocosGuy;

}

 

這只是建立兩個 pointer ,並沒有建立實體,如果要建立實體,就要找一下 -(id)init 這個方法,這個方法的結構大概是像這樣:

 

-(id)init{

if( (self=[super init]) ) {

//........一堆來建立實體物件的程式原生是建立 Hello World 字樣的;

}

return self;

}

 

你可以在 if 這個區段中的內容,改成自已的,以取代原來的 Hello world,像是這個樣子:

 

if( (self=[super init]) ) {

        seeker1=[CCSpritespriteWithFile:@"seeker.png"];

        seeker1.position=ccp(50, 100);

        [self  addChild:seeker1];

        

        cocosGuy = [CCSprite  spriteWithFile:@"Icon.png"];

        cocosGuy.position=ccp(200, 300);

        [self addChild:cocosGuy]        

}

 

執行一下就會出現以下的畫面:

 

 

 

讓圖片動

 
 

現在,你知道如何讓精靈出現在屏幕上,你會希望他們四處走動。有兩種基本的方法:

  1. 建立個 Action 設定 sprite 的目標位址和時間,或..
  2. 建立一個定時調用的方法,並自已移動它
     

我們現在先使用第二種方法,接著上一小節的程式在[self addChild: cocosGuy]; 的下一行 加上以下的程式碼:

[self schedule:@selector(nextFrame:)];

這個方法叫 “schedule”  於 self (the HelloWorld CCLayer), 指定了一個叫 “nextFrame” 並有一個參數. 實際上並不會自動建立該方法,所以我們要自已建立。請建立一個 method 內容如下:

 

 

- (void) nextFrame:(ccTime)dt {

    seeker1.position = ccp( seeker1.position.x + 100*dt, seeker1.position.y );

    if (seeker1.position.x > 480+32) {

        seeker1.position = ccp( -32, seeker1.position.y );

    }

}

 

這樣作的做用是 cocos2d 程式庫會在一定的時間(以秒為單位)執行該方法的工作(並非每秒執行一次,而是一你必需在該方法中,寫下一秒之後的位置)所以你要在這寫下各種瑣碎的事情:移動精靈的周圍,檢查碰撞,更新的物理模型,產生新的敵人,刪除不再需要的精靈,等等。

 

以本例來說,我們要做的是移動你的 "seeker1", 移動它,就是指定一個新的 position 值給它.(不要指定 position.x 及 position.y, 而是要用 ccp(x,y) 或 CGPointMake(x,y) 指定給它)

我們遞增 sprite 位置的x 100 * DT - 這意味著,在一秒鐘內,精靈將移動100個像素。乘以所需的速度(以像素為單位/秒)由dt的這種技術,得到的移動量的 sprite 是一很棒的,因為它意味著運動將是在一個恆定的速度,即使在幀速率不同的位。

另外,我們也檢查了它是否已超出畫面,以 iPhone 來說,它横向有 480 像素,加 32 表示已完全超出畫面,就回到左側外面。

 

對觸摸事件做回應


處理事件 Events 與定時事件是有些不同的,典型事件像時對加速器與觸摸事件做回應等,已經有具體定義的方法為這些-和在觸摸事件的情況下,有兩種不同的方法:“standard”或 “targeted”. 請參閱 Touch Delegates 做進一步了解.

在這課程中,我們會加一些典型的目標代理人 delegate. 首先,在畫面的 .h 文件加上以上的 header:

 

 

#import "CCTouchDispatcher.h"

 

再來我們要建立一些 method, 也許你可以加在 -(id)init 之後。這是告訴我們的程式要用 “targeted” 不要用 “standard”。

 

 

-(void) registerWithTouchDispatcher{ 

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:selfpriority:0 swallowsTouches:YES];

}

  

我們繼續在 -(id)init 中的 if 區段,加上下面的程式碼代表我們要回應 touch 事件

 

      self.isTouchEnabled=YES;

 

因為我們使用的是“targated”設置觸摸事件,我們必須到實做至少ccTouchBegan的方法。返回 YES,在這裡要告訴要求這個觸摸時回應。

 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

    returnYES;

}


最後要加上發生 Touch event 時,要做的事情,加入- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 這個 method

 

 

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {

 CGPoint location = [selfconvertTouchToNodeSpace: touch];

[cocosGuy stopAllActions];

[cocosGuy runAction: [CCMoveTo actionWithDuration:1 position:location]];

}

 

 

我們在這 method 中,做了幾件事情

 

  1. 首先,取得觸摸的位置。
  2. 然後,用 stopAllActions 方法停止 cocosGuy 的Action。
  3. 最後,我們運行一個新的 Action,移動cocosGuy超過1秒的觸摸位置

 

請注意,我們並不需要加任何程式,在我們nextFrame方法中,來移動這個 sprite 的舉動,因為我們使用的是  Action,而不是行程。

 

執行應用程序,並嘗試一下 - 你應該會發現,當你把你的手指離開屏幕(或模擬器放開 mouse button),cocos2d的圖標就會移到那個位置,而全部時間,機器人都會繼續飛奔在屏幕上。

  如果所有的東西都搞定了,就準備上第三課吧!

 

請耐心等待第三課

相关文章