天天看點

COCOS2D(1) 入門

第一步:安裝cocos2d

從http://www.cocos2d-iphone.org/download下載下傳cocos2d模闆,建議下在穩定的版本。打開終端,切換到cocos2d的解壓目錄,執行指令:  ./install-templates.sh,安裝完成,打開xcode4.4,如下圖:

COCOS2D(1) 入門

cocos2d-iphone 安裝成功。

第二步:建立cocos2d應用程式

選擇cocos2d ios模闆,應用名稱輸入HelloWord,完成建立。打開應用,如下圖:

COCOS2D(1) 入門
COCOS2D(1) 入門

檔案目錄如下(注:xcode版本:4.4.1)

COCOS2D(1) 入門

第三步:添加精靈

本篇的所有編碼都将在HelloWorldLayer.m檔案例完成。

COCOS2D(1) 入門

總共添加兩個精靈,我們需添加一個額外的圖檔,用作一個sprite。另外一個使用以包含在項目裡的icon.png。

定義變量:

1 #import "HelloWorldLayer.h"
 2 #import "CCTouchDispatcher.h"
 3 
 4 // Needed to obtain the Navigation Controller
 5 #import "AppDelegate.h"
 6 
 7 #pragma mark - HelloWorldLayer
 8 
 9 CCSprite *seeker1;
10 CCSprite *cocosGuy;
11 
12 // HelloWorldLayer implementation
13 @implementation HelloWorldLayer      

代碼如下

1 // on "init" you need to initialize your instance
 2 -(id) init
 3 {
 4     // always call "super" init
 5     // Apple recommends to re-assign "self" with the "super's" return value
 6     if( (self=[super init]) ) {
 7         
 8         // create adn initealize our seeker sprite,and add it to this layer
 9         seeker1 = [CCSprite spriteWithFile:@"seeker.png"];
10         seeker1.position = ccp(50, 100);
11         [self addChild:seeker1];
12         [self schedule:@selector(nextFrame:)];
13         
14         //do the same our cocos2d guy, reusing the app icon as its imange
15         cocosGuy = [CCSprite spriteWithFile:@"Icon.png"];
16         cocosGuy.position = ccp(200, 180);
17         [self addChild:cocosGuy];
18         
19         self.isTouchEnabled = YES;
20 
21     }
22     return self;
23 }      

儲存運作:

COCOS2D(1) 入門

每三行增加一個精靈,使用“ccp”(cocos2d的點)宏來建立一個二維的X和Y坐标點(CGPoint結構),請注意,在cocos2d,X坐标從在螢幕的左側并向右增加,Y坐标開始,在螢幕的底部和增加向上。

最後,每個精靈的第三行調用“addChild”添加新建立的精靈的層。

移動精靈:有兩種方法

1.使用一個行為告訴精靈超過一定時間自動移動到目标位置。

2.在遊戲的運作過程中調用方法讓精靈自己移動。

在這個例子中,我們采取第二種方法安排一個周期性的回調讓“seeker1”sprite移動,代碼為:[self schedule:@selector(nextFrame:)];

并添加方法:

1 - (void)nextFrame:(ccTime)dt{
2     seeker1.position = ccp(seeker1.position.x + 100*dt, seeker1.position.y);
3     if (seeker1.position.x > 480 + 32) {
4         seeker1.position = ccp(-32, seeker1.position.y);
5     }
6 }      

 這項工作的效應是,在每一幀的動畫,cocos2d的庫将調用你的“nextFrame”事件,并經過從上一幀到這一幀的時間(以秒為機關)。這是你做各種事的機會:移動精靈的周圍,檢查碰撞,更新實體模型,産生新的敵人,删除不再需要的精靈等。

精靈的遞增位置:X,100*DT 意味着,在一秒鐘内,精靈将移動100個像素,然後我們檢檢視sprite是否已經離開螢幕。我們在此假設在橫向模式下,這是480像素寬,使你的代碼更通用的,你需要回調[CCDirector sharedDirector] winSize]得到螢幕的實際大小。但現在480就行,我們加32,因為這是這個精靈的寬度的一半 - 這樣的中心是超越480 +32時,整個精靈的右側消失在螢幕上。當這種情況發生時,我們重設x位置為-32,進而将其置于完全消失于螢幕的左側。

第四步:響應觸摸

響應觸摸是有點不同的排程回調的處理事件。事件包括像觸摸屏和加速度計的讀數。已經有具體定義的方法為這些-在觸摸事件的情況下,有兩種不同的方法:“standard”或“targeted”。請參閱Touch Delegates進行更深層次的讨論。

添加頭檔案:#import "CCTouchDispatcher.h"

我們需要告訴CClayer我們要的是觸摸事件的“targeted”而不是“standard”,代碼如下:

-(void) registerWithTouchDispatcher
{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}      

在XCODE4.4.1中會提示sharedDispatcher方法被舍棄,具體情況以後讨論。

在init方法中添加:self.isTouchEnabled = YES 注冊觸摸事件。

由于我們使用的是觸摸事件的“targeted”,是以必須至少實作ccTouchBegin方法,傳回YES告訴touch dispather 你要求的這個觸摸,添加代碼:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    
    return YES;
}      

這次觸摸也會導緻另一個觸摸方法被回調,我們在下面這個方法裡編寫代碼讓第二個精靈移動到觸摸結束的地方:

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
    
    CGPoint location = [self convertTouchToNodeSpace:touch];
    
    [cocosGuy stopAllActions];
    [cocosGuy runAction:[CCMoveTo actionWithDuration:1 position:location]];
}      

convertTouchToNodeSpace 做了一下幾件事情:

1. 得到在這個視圖上觸摸的位置location

2.它要求CCDirector将其轉換為GL坐标,也就是我們使用同一坐标系畫圖。(例如,縱向和橫向坐标的轉換)

3.最後它将這些GL坐标轉換到節點空間,這樣做是為了CCLayer,使它沒有差別。

後邊的代碼的目的是停止精靈目前的活動,進行下面的動作。

運作代碼,将會看到,seeker1勻速往右運動,點選螢幕cocosGuy移動到點選的地方。

這次就寫到這吧,有什麼不對的地方,還希望閱者指正!

參考網址:http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_2._your_first_game