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” 。 )
現在切換到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]
}
執行一下就會出現以下的畫面:
讓圖片動
現在,你知道如何讓精靈出現在屏幕上,你會希望他們四處走動。有兩種基本的方法:
-
建立個 Action 設定 sprite 的目標位址和時間,或..
-
建立一個定時調用的方法,並自已移動它
我們現在先使用第二種方法,接著上一小節的程式在[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 中,做了幾件事情:
-
首先,取得觸摸的位置。
-
然後,用 stopAllActions 方法停止 cocosGuy 的Action。
-
最後,我們運行一個新的 Action,移動cocosGuy超過1秒的觸摸位置
請注意,我們並不需要加任何程式,在我們nextFrame方法中,來移動這個 sprite 的舉動,因為我們使用的是 Action,而不是行程。
執行應用程序,並嘗試一下 - 你應該會發現,當你把你的手指離開屏幕(或模擬器放開 mouse button),cocos2d的圖標就會移到那個位置,而全部時間,機器人都會繼續飛奔在屏幕上。
如果所有的東西都搞定了,就準備上第三課吧!
請耐心等待第三課