1. 程式人生 > >Cocos2d-x 2.0 百例精講:如何讓一個精靈跟隨觸點移動

Cocos2d-x 2.0 百例精講:如何讓一個精靈跟隨觸點移動

如何讓一個精靈跟隨觸點移動?本節我們以HelloCpp為例來講解一下。

第一步,我們要在場景中建立一個新的精靈。

開啟HelloWorldScene.h。我們為HelloWorld增加一個精靈類成員指標,為了方便程式碼的編寫我們可以去掉cocos2d::作用域的定義而在類定義之前加入USING_NS_CC;

#include “cocos2d.h”
	 USING_NS_CC;
class HelloWorld : public CCLayer
{
 …
private:
	//在這裡我們定義一個精靈指標。
	CCSprite*   m_pSprite;
};

所在的層中開啟觸屏響應。我們以HelloCpp為例,在HelloWorld的init函式中建立這個精靈。

bool HelloWorld::init()
{

	…
	//在底部加入,建立一個精靈,就用Image目錄下的笑臉圖片來建立精靈吧。
	m_pSprite = CCSprite::create("Pea.png");

    // 把精靈放在正中間。
    m_pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // 將精靈放在場景中,設Z順序為1
    this->addChild(m_pSprite, 1);
	
    return true;
}

第二步,我們要啟用場景所屬層CCLayer響應觸點功能。

這一步是超級簡單,只需要在建立精靈後加一行程式碼:

setTouchEnabled(true);

    這個函式是CCLayer類開啟觸屏響應功能的開關。

第三步,為場景所屬CCLayer增加相應的響應觸點事件處理功能。

         CCLayer層本身由CCTouchDelegate派生,CCTouchDelegate是觸點訊息響應介面類,它指定了CCLayer在響應觸點事件時所觸發的函式,其中單點觸屏主要用於控制元件,如按鈕,而多點觸屏多用於場景。


程式碼分析:

class CC_DLL CCTouchDelegate
{
public:
	//構造
    CCTouchDelegate() {}
	//析構
    virtual ~CCTouchDelegate()
    {
    }
	//單點觸屏事件響應
	//按下
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
//移動
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
//停止移動
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
	//離開
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}

    //多點觸屏事件響應,事件與上面一致。
     virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
     virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
     virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
     virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}

};

    看一下這些介面,如果我們需要增加相應的觸屏事件處理,只需要在CCLayer的派生類中過載這些介面函式就OK了。

    回到我們的HelloWorld場景,本節只需要用到移動跟隨觸屏位置,所以我們在其public部分增加函式過載:

virtualvoid ccTouchesMoved(CCSet*pTouches, CCEvent *pEvent);

    並在Cpp中實現它:


void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
	//獲取觸點指標容器中第一個元素
    CCSetIterator it = pTouches->begin();
	//將其轉化為觸點資訊
    CCTouch* touch = (CCTouch*)(*it);
	//取得觸點位置
	CCPoint touchLocation = touch->getLocation();  
	//設定精靈位置為觸點位置。
	 m_pSprite->setPosition(touchLocation);
}
執行一下,我們可以在按下滑鼠時發現精靈始終跟隨滑鼠移動。

     


課後總結:

簡單來說,本節就是三個步驟1,建立精靈,2開啟觸屏,3響應處理。其中關鍵是第3步過載場景所屬的CCLayer中觸屏響應事件函式。

紅孩兒遊戲程式設計教學組:致力於遊戲程式設計方面的教程編寫,目前主要工作重心在Cocos2d-x方向,希望大家支援!

目前成員有:

紅孩兒: 九年遊戲程式開發經驗,參與過多款遊戲的開發並任職主程式。

Jivin: 在程式設計路上,以初學者身份慢慢爬行著。部落格:http://blog.csdn.net/laijingyao881201

Jovi: 一年多的端遊程序開發經驗,初步接觸cocos2dx引擎。正在開發一款引擎是cocos2dx的手遊。

畏天命: 資深遊戲策劃,專案經理。參與設計多款iOS遊戲是教程組內唯一的業餘程式設計師

一年前開始接觸C++及cocos2d-x

將講解涉及cocos2d-x學習中容易遇到的初級問題,

奶哥:4年手機遊戲客戶端程式經驗,目前擔任成都一家遊戲公司跨平臺專案負責人兼技術總監職位,豐富的手機平臺遊戲製作經驗,包括j2me,android,ios平臺

部落格:http://8287044.blog.51cto.com/

同時也歡迎有精力有能力的朋友參與我們。