廣告贊助

 

這些文章是來自於 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 類別物件


打開你的專案,你應該會看到四個文件,代表兩個畫面物件
螢幕快照 2012-12-02 下午9.59.49   


首先,我們要建立兩個 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]        

}

 

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

螢幕快照 2012-12-02 下午11.02.21  

 

 

讓圖片動

 
 

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

  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的圖標就會移到那個位置,而全部時間,機器人都會繼續飛奔在屏幕上。

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

 

請耐心等待第三課

文章標籤
創作者介紹

X Code Objective-C Swift 學習記錄 for iOS & macOS (OS X)

shenfive 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 安
  • 你好我在這篇遇到兩個小問題
    seeker1=[CCSpritespriteWithFile:@"seeker.png"];>CCSprite這邊要enter
    seeker1.position=ccp(50, 100);
    [selfaddChild:seeker1];>self 跟 add要有空格
  • 謝謝 指正

    原始碼都是我實作後貼上來,但因編輯器排版總是會做一些調整,我沒有注意到

    原始碼可以參考
    http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_2._your_first_game

    shenfive 於 2013/01/25 21:05 回覆

找更多相關文章與討論