前言
Cocos2dx有很多Effect可以用,像是Shaky3D、Wave3D、Lens3D等...這次我應用Ripple3D來作一個觸碰胸部就會抖動的應用。
環境
作業系統:Windows 7, 32位元
Cocos2dx版本:2.2.0
開發工具:Visual C++ Express 2010
影像處理工具:PhotoImpact X3
第一步:前置處理
開啟HelloCpp專案,我們來作一些改造,這次我想要改成480x800的顯示,需要下列步驟進行修改:
main.cpp
#include "main.h" #include "../Classes/AppDelegate.h" #include "CCEGLView.h" USING_NS_CC; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // create the application instance AppDelegate app; CCEGLView* eglView = CCEGLView::sharedOpenGLView(); eglView->setViewName("HelloCpp"); eglView->setFrameSize(480,800); // The resolution of ipad3 is very large. In general, PC's resolution is smaller than it. // So we need to invoke 'setFrameZoomFactor'(only valid on desktop(win32, mac, linux)) to make the window smaller. //eglView->setFrameZoomFactor(0.4f); return CCApplication::sharedApplication()->run(); }
在main.cpp中,修改第23行的內容,參數改為480,800。
eglView->setFrameSize(480,800);
AppMaros.h 部分程式碼
#define DESIGN_RESOLUTION_480X320 0 #define DESIGN_RESOLUTION_1024X768 1 #define DESIGN_RESOLUTION_2048X1536 2 #define DESIGN_RESOLUTION_480X800 3 /* If you want to switch design resolution, change next line */ #define TARGET_DESIGN_RESOLUTION_SIZE DESIGN_RESOLUTION_480X800 typedef struct tagResource { cocos2d::CCSize size; char directory[100]; }Resource; static Resource smallResource = { cocos2d::CCSizeMake(480, 320), "iphone" }; static Resource mediumResource = { cocos2d::CCSizeMake(1024, 768), "ipad" }; static Resource largeResource = { cocos2d::CCSizeMake(2048, 1536), "ipadhd" }; static Resource spResource = { cocos2d::CCSizeMake(480,800), "ipad" }; #if (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X320) static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(480, 320); #elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_1024X768) static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(1024, 768); #elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_2048X1536) static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(2048, 1536); #elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X800) static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(480, 800); #else #error unknown target design resolution! #endif
新增 #define DESIGN_RESOLUTION_480X800 3 這一行,並且把 TARGET_DESIGN_RESOLUTION_SIZE 設定成 DESIGN_RESOLUTION_480X800
#define TARGET_DESIGN_RESOLUTION_SIZE DESIGN_RESOLUTION_480X800
在17行新增了資源參數(含大小與資源位置)
static Resource spResource = { cocos2d::CCSizeMake(480,800), "ipad" };
在25、26新增解析度尺寸的定義
#elif (TARGET_DESIGN_RESOLUTION_SIZE == DESIGN_RESOLUTION_480X800)
static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(480, 800);
AppDelegate.cpp 的部分程式碼
bool AppDelegate::applicationDidFinishLaunching() { // initialize director CCDirector* pDirector = CCDirector::sharedDirector(); CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); pDirector->setOpenGLView(pEGLView); CCSize frameSize = pEGLView->getFrameSize(); // Set the design resolution #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionShowAll); #else pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder); #endif vector searchPath; // In this demo, we select resource according to the frame's height. // If the resource size is different from design resolution size, you need to set contentScaleFactor. // We use the ratio of resource's height to the height of design resolution, // this can make sure that the resource's height could fit for the height of design resolution. searchPath.push_back(spResource.directory); pDirector->setContentScaleFactor(MIN(spResource.size.height/designResolutionSize.height, spResource.size.width/designResolutionSize.width)); /* // if the frame's height is larger than the height of medium resource size, select large resource. if (frameSize.height > mediumResource.size.height) { searchPath.push_back(largeResource.directory); pDirector->setContentScaleFactor(MIN(largeResource.size.height/designResolutionSize.height, largeResource.size.width/designResolutionSize.width)); } // if the frame's height is larger than the height of small resource size, select medium resource. else if (frameSize.height > smallResource.size.height) { searchPath.push_back(mediumResource.directory); pDirector->setContentScaleFactor(MIN(mediumResource.size.height/designResolutionSize.height, mediumResource.size.width/designResolutionSize.width)); } // if the frame's height is smaller than the height of medium resource size, select small resource. else { searchPath.push_back(smallResource.directory); pDirector->setContentScaleFactor(MIN(smallResource.size.height/designResolutionSize.height, smallResource.size.width/designResolutionSize.width)); } */ // set searching path CCFileUtils::sharedFileUtils()->setSearchPaths(searchPath); // turn on display FPS pDirector->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this pDirector->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object CCScene *pScene = HelloWorld::scene(); // run pDirector->runWithScene(pScene); return true; }
這邊只要修改 AppDelegate::applicationDidFinishLaunching() 就可以了。
在第28、29行新增了資源根目錄以及遊戲內的縮放比,主要是為了導入剛剛在AppMarco.h中的設定參數。
searchPath.push_back(spResource.directory);
pDirector->setContentScaleFactor(MIN(spResource.size.height/designResolutionSize.height, spResource.size.width/designResolutionSize.width));
32行至52行,原本有的資源根目錄與縮放比的設定。因為我們在28、29已經設定了,所以可以直接砍掉這一段程式或是在31與53行加入註解符號。
做到這邊,執行一下吧!
第二步:規劃偵測範圍
有一個要注意的點,在Cocos2dx中,座標系使用的是左手系(拇指向內)。因此X方向是往右,Y方向往上,會跟繪圖軟體坐標不太一樣。
下圖是一個日本美女,我們先找到兩塊我們點擊後會觸發抖動範圍的區域,分別為Rect01與Rect02。我們要找的是此區域內的起始座標與寬高,例如Rect01,起始座標是該區域的左下角,X為108,Y為324。Y的324是從影像下方往上屬上來的值喔。
Rect01 :X=108,Y=324,W=103,H=112
Rect02 :X=252,Y=295,W=112,H=105
底圖我們存放在遊戲目錄下的Resource/ipod/下,名稱暫定IMG_GIRL01.jpg
補充說明一下,底圖的尺寸為480x800
第三步:將美女圖載入
接下來,我們要把美女圖Show到遊戲畫面啦,順便也介紹一下CCSprite的使用。
HelloWorldScene.h 完整程式碼
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" // 要定義 using namespace cocos2d; class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); // 增加影像成員 CCSprite* m_pImgGirl; }; #endif // __HELLOWORLD_SCENE_H__
第7行,先加入 using namespace cocos2d; 這樣之後新增cocos2d物件時程式碼可以少一點
有 using namespace cocos2d; |
無 using namespace cocos2d; |
宣告 CCSprite* pImage; |
宣告 cocos2d::CCsprite* pImage; |
[表] 有無using namespace cocos2d;時宣告變數的比較。
第25行,宣告一個CCSprite的指標。
CCSprite* m_pImgGirl;
HelloWorldScene.cpp 部分程式碼
// on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); // create menu, it's an autorelease object CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // position the label on the center of the screen pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer this->addChild(pLabel, 1); // add "HelloWorld" splash screen" CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(pSprite, 0); //------------------------------------ // 新增影像物件 m_pImgGirl = CCSprite::create("IMG_GIRL01.jpg"); m_pImgGirl->setAnchorPoint(ccp(0,0)); // 座標參考點(左下) m_pImgGirl->setPosition(CCPointZero); this->addChild(m_pImgGirl,2); return true; }
我們修改一下HelloWorld::init(),在59~62行是初始m_pImgGirl這個物件。
create就是new的意思(但是還有一些相關處理),所以不用特地為m_pImgGirl再new個物件給他了。參數"IMG_GIRL01.jpg"就是傳穎向的路徑與檔名。
m_pImgGirl = CCSprite::create("IMG_GIRL01.jpg");
setAnchorPoint設定錨點,就是設定影像的參考點。參數ccp()是new一個CCPoint的巨集,傳入的參數有兩個,分邊是X軸的位置與Y軸的位置。不過,這邊只能輸入0~1的值。
參數1:左(0)~中(0.5)~右(1.0)
參數2:下(0)~中(0.5)~上(1.0)
所以輸入ccp(0,0),代表設定影像座標時會參考圖片左下
所以輸入ccp(1,1),代表設定影像座標時會參考圖片右上
所以輸入ccp(0.5,0.5),代表設定影像座標時會參考圖片中間
m_pImgGirl->setAnchorPoint(ccp(0,0)); // 座標參考點(左下)
setPosition是設定影像位置,參數也是CCPoint物件,輸入的方式如下:
輸入 CCPointZero :就是輸入原點(0,0)的意思
輸入 ccp(0,0) :也是輸入原點(0,0)
輸入 ccp(100,200) :設定座標在 (100,200)
m_pImgGirl->setPosition(CCPointZero);
以上,是將美女圖的左下角設定在原點0,0的位置。最後一步一定要作的就是要把m_pImgGirl加入至HelloWorldScene的child。沒有加的話,當HelloeWorldScene要進行draw時,不是他的小孩她可是不鳥的註1。addChild參數1就是m_pImgGirl準備要當他小孩的物件啦,參數2則是深度的優先順序,在這個範例用不到,先隨便設定,或是不設定也行。其實還有參數3,是給參數1物件貼一個標籤,這次的範例也用不到。
this->addChild(m_pImgGirl,2);
註1:cocos2dx中,CCSprite是繼承CCNode。該物件有個特性,如果他沒有老爸老媽,他就會被上帝給燒毀!所以m_pImgGirl之所以要認HelloWorldScene為賊父(誤),就是避免被上帝當成孤兒捉去燒毀!
執行一下,看看結果:
第四步:開啟觸碰的功能
接下來要準備寫點東西讓觸碰有反應啦。
HelloWorldScene.h 完整程式碼
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" // 要定義 using namespace cocos2d; class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // 觸碰控制處理 void ccTouchesEnded(CCSet* touches, CCEvent* event); // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); // 增加影像成員 CCSprite* m_pImgGirl; }; #endif // __HELLOWORLD_SCENE_H__
在第16行,加入觸發銀幕反應的宣告,要注意名稱得一模一樣喔!
void ccTouchesEnded(CCSet* touches, CCEvent* event);
HelloWorldScene.cpp 部分程式碼
// on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); // create menu, it's an autorelease object CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // position the label on the center of the screen pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer this->addChild(pLabel, 1); // add "HelloWorld" splash screen" CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(pSprite, 0); //------------------------------------ // 新增影像物件 m_pImgGirl = CCSprite::create("IMG_GIRL01.jpg"); m_pImgGirl->setAnchorPoint(ccp(0,0)); // 座標參考點(左下) m_pImgGirl->setPosition(CCPointZero); this->addChild(m_pImgGirl,2); //------------------------------------ // 開啟 Touch 功能 this->setTouchEnabled(true); return true; } void HelloWorld::ccTouchesEnded(CCSet* touches,CCEvent* event) { CCTouch* touch = (CCTouch*)( touches->anyObject() ); CCPoint location = touch->getLocationInView(); location = CCDirector::sharedDirector()->convertToGL(location); CCLog("convertToGLXY x:%f, y:%f", location.x, location.y); }
這次一樣也是要小小修改init()函式。在init()函式最後,第65行,我們開啟觸碰銀幕的功能。
this->setTouchEnabled(true);
在69~75行,新增一個ccTouchesEnded(..)。
71行,touch是觸碰反應的訊息物件CCTouch,根據這個物件我們可以得到使用者觸碰的位置資訊。
CCTouch* touch = (CCTouch*)( touches->anyObject() );
72行,藉由CCTouch中的getLocationInView()取得使用者觸碰的座標存到location變數中。此時的座標是我們所知的右手作標系(Y軸越往下越大)。
CCPoint location = touch->getLocationInView();
73行,把銀幕座標轉成cocos2d用的左手座標系座標(往上為大)。
location = CCDirector::sharedDirector()->convertToGL(location);
74行,只是一個Log,會顯示在VC的輸出視窗
CCLog("convertToGLXY x:%f, y:%f", location.x, location.y);
執行一下,隨便點點銀幕,看一下VC的輸入視窗:
第五步:設定偵測範圍
我們再第二步規畫的偵測範圍現在要派上用場啦!
HelloWorldScene.h 全部程式碼
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" // 要定義 using namespace cocos2d; class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // 觸碰控制處理 void ccTouchesEnded(CCSet* touches, CCEvent* event); // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); // 增加影像成員 CCSprite* m_pImgGirl; CCRect m_oRect01; CCRect m_oRect02; }; #endif // __HELLOWORLD_SCENE_H__
新增兩個成員,用來記錄偵測範圍。
CCRect m_oRect01;
CCRect m_oRect02;
HelloWorldScene.cpp 部分程式碼
// on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); // create menu, it's an autorelease object CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // position the label on the center of the screen pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer this->addChild(pLabel, 1); // add "HelloWorld" splash screen" CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(pSprite, 0); //------------------------------------ // 新增影像物件 m_pImgGirl = CCSprite::create("IMG_GIRL01.jpg"); m_pImgGirl->setAnchorPoint(ccp(0,0)); // 座標參考點(左下) m_pImgGirl->setPosition(CCPointZero); this->addChild(m_pImgGirl,2); //------------------------------------ // 設定偵測區間 m_oRect01.setRect(108,324,103,112); m_oRect02.setRect(252,295,112,105); //------------------------------------ // 開啟 Touch 功能 this->setTouchEnabled(true); return true; } void HelloWorld::ccTouchesEnded(CCSet* touches,CCEvent* event) { CCTouch* touch = (CCTouch*)( touches->anyObject() ); CCPoint location = touch->getLocationInView(); location = CCDirector::sharedDirector()->convertToGL(location); CCLog("convertToGLXY x:%f, y:%f", location.x, location.y); //----------------------------------------------------- if((m_oRect01.containsPoint(location))||(m_oRect02.containsPoint(location))) { //先擺著吧,等一下要用來作點道偵測區的反應 CCLog("Hey! Dont Touch Me!"); } }
回到init()中。在第65、66行,進行偵測區間的設定。此時在步驟二測出的參數值可以填入了。使用CCRect的setRect(..),參數1~4分別為座標x、座標y、寬w、高h。
m_oRect01.setRect(108,324,103,112);
m_oRect02.setRect(252,295,112,105);
接下來繼續改ccTouchesEnded(..)。81~85行是用來作銀幕觸碰反應後的處理。
81行,CCRect的containsPoint(..)是用來判斷觸碰點是否有在物件範圍內,簡單來說就是點對區域的碰撞偵測。containsPoint(..)參數就是CCPoint物件,也就是我們觸碰的點。若有碰到,則會回傳true,反之則為false。
if((m_oRect01.containsPoint(location))||(m_oRect02.containsPoint(location)))
84行,如果有碰觸到Rect01或是Rect02其中一個,就會進到這個if()裡面。我們準備要寫的就是執行抖動的反應,後續會繼續介紹。我們先加個Log來看我們有沒有寫對啊!
CCLog("Hey! Dont Touch Me!");
執行一下,點級我們設定的區域,看看輸出視窗:
第六步:使用CCRipple3D,讓美女波濤洶湧吧!
走到這,終於要使出最關鍵的一招了,就是呼叫CCRipple3D來讓CCSprite給動起來啊!
HelloWorldScene.cpp 部分程式碼
void HelloWorld::ccTouchesEnded(CCSet* touches,CCEvent* event) { CCTouch* touch = (CCTouch*)( touches->anyObject() ); CCPoint location = touch->getLocationInView(); location = CCDirector::sharedDirector()->convertToGL(location); CCLog("convertToGLXY x:%f, y:%f", location.x, location.y); //----------------------------------------------------- CCSize Swin = CCDirector::sharedDirector()->getWinSize(); if((m_oRect01.containsPoint(location))||(m_oRect02.containsPoint(location))) { CCLog("Hey! Dont Touch Me!"); if(m_pImgGirl->numberOfRunningActions()==0) { CCActionInterval* pAction = CCRipple3D::create(0.3, CCSizeMake(30,30), location, 80, 1, 180); m_pImgGirl->runAction(pAction); } } }
繼續修改ccTouchesEnded(..)。我們在13~17行加入執行CCRipple3D的程式碼。
13行,我們希望每次執行CCRipple3D至多只有一組。這個判斷就是說若CCRipple3D還在執行,就不鳥了。
if(m_pImgGirl->numberOfRunningActions()==0)
15行,進行CCRipple3D的create。因為CCRipple3D也是Action的一種,所以使用CCActionInterval的指標去接CCRipple3D new出來的物件。create CCRipple3D的參數有6個。整理如下:
參數1:執行時間,時間越短,反應速度越快。(秒)
參數2:Ripple範圍,所以要輸入寬高尺寸(CCSize)。
參數3:觸發位置(CCPoint)。
參數4:半徑
參數5:幾個波
參數6:波的強度
CCActionInterval* pAction = CCRipple3D::create(0.3, CCSizeMake(30,30), location, 80, 1, 180);
16行,還記得美女圖的變數m_pImgGirl嗎?現在要執行runAction(..)讓Ripple跑起來嚕!
m_pImgGirl->runAction(pAction);
執行一下,看看會不會有感動呢:
第七步:優化
作到剛剛,已經有效果跑出來了。但是有沒有發現怪怪的!跑完就回不去了耶!所以接下來就是要收尾,把怪怪的感覺優化一下。
HelloWorldScene.h 完整程式碼
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" // 要定義 using namespace cocos2d; class HelloWorld : public cocos2d::CCLayer { public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // 增加建構子 HelloWorld(); // 行為迴圈處理 void run(float dt); // 觸碰控制處理 void ccTouchesEnded(CCSet* touches, CCEvent* event); // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); // 增加影像成員 CCSprite* m_pImgGirl; CCRect m_oRect01; CCRect m_oRect02; }; #endif // __HELLOWORLD_SCENE_H__
16行,宣告建構子
HelloWorld();
19行,宣告run(..),用來在跑遊戲迴圈。參數一定要float格式。
void run(float dt);
HelloWorldScene.cpp 部分程式碼
HelloWorld::HelloWorld() { m_pImgGirl = NULL; scheduleUpdate(); schedule(schedule_selector(HelloWorld::run)); } void HelloWorld::run(float dt) { // check ripple. If action is finish, recover the image. if(m_pImgGirl!=NULL) { if(m_pImgGirl->numberOfRunningActions()==0 && m_pImgGirl->getGrid()!=NULL) { m_pImgGirl->setGrid(NULL); } } }
新增實作HelloWorldScene建構子與run(..)
以上七個步驟,就可以完成這血脈噴張的功能啦!