最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Cocos2d-x人物動作類實例

 更新時間:2014年09月12日 09:16:44   投稿:junjie  
這篇文章主要介紹了Cocos2d-x人物動作類實例,本文用大量代碼和圖片講解Cocos2d-x中的動作,代碼中同時包含大量注釋說明,需要的朋友可以參考下

我們玩的游戲一般都可以看到精靈的運動,游戲的世界就是一個運動的世界,而所有的這些動作都可以分為一些基本的動作和動作的組合,今天就來學(xué)習(xí)一下動作類CCAction,首先看一下類之間的繼承關(guān)系。

CCAction類下派生了三個動作類,執(zhí)行動作的類是CCNode以及它的子類,通過函數(shù)runAction()來執(zhí)行動作,其中CCFiniteTimeAction之下是常用的瞬時動作和延時動作。動作從本質(zhì)上來說就是改變節(jié)點的屬性,瞬時動作就是改變這些屬性不需要時間,瞬時就完成了,而延時動作改變這些屬性需要一些時間,可以通過參數(shù)來設(shè)置這個時間,下面是瞬時動作和延時動作的例子,解釋看源代碼。點擊下圖查看效果。

bool HelloWorld::init()
{
  bool bRet = false;
  do
  {

    CC_BREAK_IF(! CCLayer::init());

		//創(chuàng)建一個精靈
		CCSprite * sprite = CCSprite::create("image.png");
		sprite->setPosition(ccp(240,160));
		//最后一個參數(shù)是精靈的tag,以便在眾多的子節(jié)點中,通過getChildByTag()找到該節(jié)點
		this->addChild(sprite,0,0);

		//創(chuàng)建菜單
		CCMenuItemFont * fontMenu1 = CCMenuItemFont::create("start");
		CCMenuItemFont * fontMenu2 = CCMenuItemFont::create("stop");
		//和move函數(shù)相互綁定
		CCMenuItemToggle * toggleMenu = CCMenuItemToggle::createWithTarget(this,menu_selector(HelloWorld::move),
			fontMenu1,fontMenu2,NULL);
		CCMenu * menu = CCMenu::create(toggleMenu,NULL);
		menu->setPosition(ccp(420,40));
		this->addChild(menu);

    bRet = true;
  } while (0);

  return bRet;
}

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//瞬時動作CCPlace,改變了精靈的坐標(biāo),可以用sprite->setPosition(ccp(60,160))代替,但寫成動作可以加入到動作序列中
	CCPlace * action1 = CCPlace::create(ccp(60,160));
	//瞬時動作,使精靈做X軸的翻轉(zhuǎn)
	CCFlipX * action2 = CCFlipX::create(true);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//通過runAction精靈執(zhí)行動作
		sprite->runAction(action2);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}

動作類動作類 動作類 動作類

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//延時動作,第一個參數(shù)是執(zhí)行動作所需要的時間,moveTo是絕對的,就是移動到哪個坐標(biāo),而moveBy是相對的
	//傳入的ccp(10,0)是一個向量,精靈沿著x軸移動了10個像素
	CCMoveTo * moveTo = CCMoveTo::create(2.0,ccp(240,180));
	CCMoveBy * moveBy = CCMoveBy::create(2.0,ccp(10,0));
	//rotate按照一定的角度旋轉(zhuǎn),to強調(diào)的是結(jié)果,現(xiàn)在是0度,會旋轉(zhuǎn)到90度,如果現(xiàn)在是90度,還是會在90度
	CCRotateTo * rotateTo = CCRotateTo::create(2.0,90);
	//by強調(diào)旋轉(zhuǎn)的相對角度,不論現(xiàn)在多少度都會旋轉(zhuǎn)90度,以to和by結(jié)尾的動作類都是相同的道理
	CCRotateBy * rotateBy = CCRotateBy::create(2.0,90);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//通過runAction精靈執(zhí)行動作
		//sprite->runAction(moveTo);
		//sprite->runAction(moveBy);
		sprite->runAction(rotateBy);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}

以by結(jié)尾的延時動作都可以通過reverse()獲得它的反動作。

動作類

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//第二個參數(shù)是跳躍的向量,第三個參數(shù)是跳躍的高度,第四個參數(shù)是跳躍的次數(shù)
	CCJumpBy * jumpBy = CCJumpBy::create(2.0,ccp(100,30),50,4);
	//以by結(jié)尾的延時動作都可以通過reverse()獲得它的反動作
	CCActionInterval * jumpBack = jumpBy->reverse();

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//通過runAction精靈執(zhí)行動作
		sprite->runAction(jumpBy);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{
		sprite->runAction(jumpBack);
	}
}

延時動作中還有倆個重復(fù)動作的函數(shù),就是重復(fù)不斷的執(zhí)行某一個動作,看下他們的繼承關(guān)系。

動作類 動作類

下面是實現(xiàn)的源代碼。

動作類 動作類

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//第一個參數(shù)傳入重復(fù)的動作,第二個參數(shù)傳入重復(fù)的次數(shù)
	CCRepeat * repeat = CCRepeat::create(rotateBy,4);
	//永遠(yuǎn)重復(fù)執(zhí)行一個動作
	CCRepeatForever * repeatForever = CCRepeatForever::create(rotateBy);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//通過runAction精靈執(zhí)行動作
		sprite->runAction(repeatForever);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}


下面再列舉一下基本常用的瞬時動作和延續(xù)動作。
瞬時動作:
放置Place:效果類似于 setPosition = ccp(x, y)。
隱藏Hide:效果類似于setVisible:false。
顯示Show:效果類似于setVisible:true。
可見切換:ToggleVisibility。
延時動作:
移動到CCMoveTo
移動CCMoveBy
跳躍到CCJumpTo設(shè)置終點位置和跳躍的高度和次數(shù)。
跳躍CCJumpBy設(shè)置終點位置和跳躍的高度和次數(shù)。
貝塞爾CCBezierBy支持 3 次貝塞爾曲線:P0-起點,P1-起點切線方向,P2-終點切線方向,P3-終點。
放大到CCScaleTo設(shè)置放大倍數(shù),是浮點型。
放大CCScaleBy
旋轉(zhuǎn)到CCRotateTo
旋轉(zhuǎn)CCRotateBy
閃爍CCBlink設(shè)定閃爍次數(shù)
色調(diào)變化到CCTintTo
色調(diào)變換CCTintBy
變暗到CCFadeTo
由無變亮CCFadeIn
由亮變無CCFadeOut
每個函數(shù)的具體用法請大家自行試驗。
接下來說一下同步動作序列和順序動作序列。同步動作序列,就是幾個動作同時執(zhí)行,順序動作序列,就是傳入的幾個動作按照順序順序執(zhí)行。以下是他們的繼承關(guān)系圖。

動作類 動作類

接下來看一下實現(xiàn)的源代碼

動作類 動作類

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//創(chuàng)建如下幾個動作

	CCMoveBy * move = CCMoveBy::create(2.0,ccp(100,0));
	CCRotateBy * rotate = CCRotateBy::create(2.0,720);

	CCFiniteTimeAction * moveBack = move->reverse();
	CCFiniteTimeAction * rotateBack = rotate->reverse();

	CCFlipY * flip = CCFlipY::create(true);

	//同步動作序列,傳入的幾個動作同時執(zhí)行,執(zhí)行的整個時間是最長的一個動作的執(zhí)行時間,參數(shù)類型是CCFiniteTimeAction
	//傳入的動作(動作的實質(zhì)就是改變節(jié)點的屬性)所影響的屬性不要有沖突
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//順序動作序列,傳入的幾個動作按照傳入的順序順序執(zhí)行,執(zhí)行的整體時間是所有動作的時間之和
	CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL);
	CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		sprite->runAction(spawn);
		//sprite->runAction(sequence);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{
		sprite->runAction(spawnBack);
		//sprite->runAction(sequenceBack);
	}
}

接下來介紹CCAction的另外來個子類,CCFollow實現(xiàn)鏡頭跟隨的效果,類似于我們在橫版過關(guān)游戲中看到的人物永遠(yuǎn)在屏幕中間,而背景在移動,不過它們的實現(xiàn)具體是不是靠這個類就不知道了。CCSpeed可以實現(xiàn)快進(jìn)和慢放的效果,就是改變了執(zhí)行的速度。以下是源代碼。

動作類

動作類

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//創(chuàng)建如下幾個動作

	CCMoveBy * move = CCMoveBy::create(2.0,ccp(100,0));
	CCRotateBy * rotate = CCRotateBy::create(2.0,720);

	CCFiniteTimeAction * moveBack = move->reverse();
	CCFiniteTimeAction * rotateBack = rotate->reverse();

	CCFlipY * flip = CCFlipY::create(true);

	//同步動作序列,傳入的幾個動作同時執(zhí)行,執(zhí)行的整個時間是最長的一個動作的執(zhí)行時間,參數(shù)類型是CCFiniteTimeAction
	//傳入的動作(動作的實質(zhì)就是改變節(jié)點的屬性)所影響的屬性不要有沖突
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//順序動作序列,傳入的幾個動作按照傳入的順序順序執(zhí)行,執(zhí)行的整體時間是所有動作的時間之和
	CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL);
	CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL);

	//CCFollow實現(xiàn)一個節(jié)點跟隨一個節(jié)點運動,傳入的參數(shù)是要跟隨的節(jié)點
	CCFollow * follow = CCFollow::create(sprite);
	//執(zhí)行這個動作的是要跟隨的節(jié)點,一般是層,效果累世于橫版過關(guān)游戲中的場景
	this->runAction(follow);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		sprite->runAction(spawn);
		//sprite->runAction(sequence);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{
		sprite->runAction(spawnBack);
		//sprite->runAction(sequenceBack);
	}
}

以下是CCSpeed的實現(xiàn),在上述代碼的基礎(chǔ)上做了一點修改。

void HelloWorld::move(CCObject* pSender)
{
	//通過tag獲得添加的精靈
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCMenuItemToggle * toggleMenu = (CCMenuItemToggle *)pSender;

	//創(chuàng)建如下幾個動作

	CCMoveBy * move = CCMoveBy::create(2.0,ccp(100,0));
	CCRotateBy * rotate = CCRotateBy::create(2.0,720);

	CCFiniteTimeAction * moveBack = move->reverse();
	CCFiniteTimeAction * rotateBack = rotate->reverse();

	CCFlipY * flip = CCFlipY::create(true);

	//同步動作序列,傳入的幾個動作同時執(zhí)行,執(zhí)行的整個時間是最長的一個動作的執(zhí)行時間,參數(shù)類型是CCFiniteTimeAction
	//傳入的動作(動作的實質(zhì)就是改變節(jié)點的屬性)所影響的屬性不要有沖突
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//順序動作序列,傳入的幾個動作按照傳入的順序順序執(zhí)行,執(zhí)行的整體時間是所有動作的時間之和
	CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL);
	CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL);

	//CCFollow實現(xiàn)一個節(jié)點跟隨一個節(jié)點運動,傳入的參數(shù)是要跟隨的節(jié)點
	CCFollow * follow = CCFollow::create(sprite);
	//執(zhí)行這個動作的是要跟隨的節(jié)點,一般是層,效果累世于橫版過關(guān)游戲中的場景
	this->runAction(follow);

	//CCSpeed分裝了一個動作類,第二個參數(shù)是要改變的速度的倍數(shù)
	CCSpeed * speed1 = CCSpeed::create(spawn,2.0);
	CCSpeed * speed2 = CCSpeed::create(spawnBack,2.0);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		sprite->runAction(speed1);
		//sprite->runAction(sequence);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{
		sprite->runAction(speed2);
		//sprite->runAction(sequenceBack);
	}
}

以下再來介紹一下CCCallFunc家族類的使用方法,它們也是一個動作類,一般用在順序動作序列中執(zhí)行的最后一個動作,目的是調(diào)用一個函數(shù),來完成一些功能。以下是這些類的繼承關(guān)系。

動作類

接下來貼上源代碼,注釋是對各個類的使用的詳細(xì)講解。

動作類動作類動作類動作類

bool HelloWorld::init()
{
  bool bRet = false;
  do
  {
    CC_BREAK_IF(! CCLayer::init());

		CCSprite * sprite = CCSprite::create("image.png");
		sprite->setPosition(ccp(240,160));
		this->addChild(sprite,0,0);

		//創(chuàng)建一個菜單,添加一個run事件
		CCMenuItemFont * fontMenu = CCMenuItemFont::create("begin",this,menu_selector(HelloWorld::run));
		CCMenu * menu = CCMenu::create(fontMenu,NULL);
		menu->setPosition(ccp(400,40));
		this->addChild(menu);

    bRet = true;
  } while (0);

  return bRet;
}

void HelloWorld::run(CCObject* pSender)
{
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);

	//創(chuàng)建延時動作
	CCRotateBy * rotate = CCRotateBy::create(2.0,3*360);
	//CCCallFunc,為這個動作綁定一個函數(shù),執(zhí)行這個動作的時候會調(diào)用這個函數(shù),創(chuàng)建以下四個動作的時候使用了不同的選擇器,但名字和各個動作有關(guān)
	CCCallFunc * func = CCCallFunc::create(this,callfunc_selector(HelloWorld::show));
	//CCCallFuncN(N就是node的意思),與上邊不同的是,綁定的函數(shù)需要一個參數(shù),這個傳入的參數(shù)就是執(zhí)行這個動作的節(jié)點
	CCCallFuncN * funcN = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::remove));
	int num = 10;
	//CCCallFuncND(D就是data的意思),這次綁定的函數(shù),不僅需要綁定動作的節(jié)點作為參數(shù)傳遞,還帶了一個void *類型的參數(shù),代表可以是任何類型
	CCCallFuncND *funcND = CCCallFuncND::create(this,callfuncND_selector(HelloWorld::showData),(void *)num);
	CCSprite * sprite2 = CCSprite::create("image2.png");
	//CCCallFuncO(O就是object的意思)這次需要傳入的參數(shù)是CCObject *類型的
	CCCallFuncO * funcO = CCCallFuncO::create(this,callfuncO_selector(HelloWorld::showSprite),sprite2);

	//創(chuàng)建順序動作序列
	//CCSequence * sequence = CCSequence::create(rotate,func,funcND,NULL);
	//CCSequence * sequence = CCSequence::create(rotate,func,funcN,NULL);
	CCSequence * sequence = CCSequence::create(rotate,func,funcN,funcO,NULL);

	sprite->runAction(sequence);
}

//以下函數(shù)不要忘記在頭文件中聲明,注意每個函數(shù)的參數(shù)
void HelloWorld::show()
{
	CCLabelTTF * ttf = CCLabelTTF::create("action end","Arial",32);
	ttf->setPosition(ccp(240,260));
	this->addChild(ttf);
}

void HelloWorld::remove(CCNode * node)
{
	//沒有通過getChildByTag()函數(shù)獲得執(zhí)行動作的精靈,而是使用remove傳來的參數(shù)
	CCSprite * sprite = (CCSprite *)node;
	//true表示sprite不僅會移除,而且這個節(jié)點上的所有操作和回調(diào)都將刪除
	sprite->removeFromParentAndCleanup(true);
	//通過以下的方法可以實現(xiàn)相同的效果,只是函數(shù)執(zhí)行的對象不同
	//this->removeChild(sprite,true);
}

void HelloWorld::showData(CCNode * node,void * data)
{
	CCSprite * sprite = (CCSprite *)node;
	this->removeChild(sprite,true);
	CCLog("num = %d",data);
}

void HelloWorld::showSprite(CCObject * sender)
{
	CCSprite * sprite = (CCSprite *)sender;
	sprite->setPosition(ccp(240,160));
	this->addChild(sprite);
}

相關(guān)文章

  • C/C++利用篩選法算素數(shù)的方法示例

    C/C++利用篩選法算素數(shù)的方法示例

    這篇文章主要給大家介紹了關(guān)于利用C/C++篩選法算素數(shù)的相關(guān)資料,文中給大家列舉了普通枚舉法和篩選法兩種方法實現(xiàn)的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • C語言基于圖形庫實現(xiàn)雙人貪吃蛇

    C語言基于圖形庫實現(xiàn)雙人貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語言基于圖形庫實現(xiàn)雙人貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解C++中string的用法和例子

    詳解C++中string的用法和例子

    string是C++標(biāo)準(zhǔn)庫的一個重要的部分,主要用于字符串處理。這篇文章主要介紹了C++ string的用法和例子,需要的朋友可以參考下
    2018-05-05
  • C/CPP運算優(yōu)先級的坑及解決

    C/CPP運算優(yōu)先級的坑及解決

    這篇文章主要介紹了C/CPP運算優(yōu)先級的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++實現(xiàn)稀疏矩陣的壓縮存儲實例

    C++實現(xiàn)稀疏矩陣的壓縮存儲實例

    本篇文章主要介紹了C++實現(xiàn)稀疏矩陣的壓縮存儲實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • C語言繪制余弦、正弦曲線

    C語言繪制余弦、正弦曲線

    這篇文章主要為大家詳細(xì)介紹了C語言繪制余弦、正弦曲線的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++ Boost Flyweight庫使用介紹

    C++ Boost Flyweight庫使用介紹

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-12-12
  • C++實現(xiàn)俄羅斯方塊(linux版本)

    C++實現(xiàn)俄羅斯方塊(linux版本)

    這篇文章主要為大家詳細(xì)介紹了linux版本C++實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言的進(jìn)制轉(zhuǎn)換及算法實現(xiàn)教程

    C語言的進(jìn)制轉(zhuǎn)換及算法實現(xiàn)教程

    這篇文章主要介紹了C語言的進(jìn)制轉(zhuǎn)換及算法實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Opencv Hough算法實現(xiàn)圖片中直線檢測

    Opencv Hough算法實現(xiàn)圖片中直線檢測

    這篇文章主要為大家詳細(xì)介紹了Opencv Hough算法實現(xiàn)圖片中直線檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

浦城县| 邹平县| 景谷| 江华| 汪清县| 昭平县| 梁平县| 根河市| 惠安县| 咸丰县| 资中县| 洛隆县| 香格里拉县| 永福县| 建始县| 杭州市| 孝义市| 香港| 临汾市| 三门峡市| 天门市| 淄博市| 日照市| 孝义市| 安仁县| 汨罗市| 乡宁县| 兴安县| 孟津县| 武宁县| 嘉义县| 常宁市| 托克逊县| 祁连县| 雅江县| 常熟市| 蒙城县| 罗平县| 呼伦贝尔市| 白玉县| 荃湾区|