程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Cocos2d-x人物舉措類實例

Cocos2d-x人物舉措類實例

編輯:關於C++

Cocos2d-x人物舉措類實例。本站提示廣大學習愛好者:(Cocos2d-x人物舉措類實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Cocos2d-x人物舉措類實例正文


我們玩的游戲普通都可以看到精靈的活動,游戲的世界就是一個活動的世界,而一切的這些舉措都可以分為一些根本的舉措和舉措的組合,明天就來進修一下舉措類CCAction,起首看一下類之間的繼續關系。

CCAction類下派生了三個舉措類,履行舉措的類是CCNode和它的子類,經由過程函數runAction()來履行舉措,個中CCFiniteTimeAction之下是經常使用的瞬時舉措和延時舉措。舉措從實質下去說就是轉變節點的屬性,瞬時舉措就是轉變這些屬性不須要時光,瞬時就完成了,而延時舉措轉變這些屬性須要一些時光,可以經由過程參數來設置這個時光,上面是瞬時舉措和延時舉措的例子,說明看源代碼。點擊下圖檢查後果。

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

    CC_BREAK_IF(! CCLayer::init());

		//創立一個精靈
		CCSprite * sprite = CCSprite::create("image.png");
		sprite->setPosition(ccp(240,160));
		//最初一個參數是精靈的tag,以便在浩瀚的子節點中,經由過程getChildByTag()找到該節點
		this->addChild(sprite,0,0);

		//創立菜單
		CCMenuItemFont * fontMenu1 = CCMenuItemFont::create("start");
		CCMenuItemFont * fontMenu2 = CCMenuItemFont::create("stop");
		//和move函數互相綁定
		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,轉變了精靈的坐標,可以用sprite->setPosition(ccp(60,160))取代,但寫成舉措可以參加到舉措序列中
	CCPlace * action1 = CCPlace::create(ccp(60,160));
	//瞬時舉措,使精靈做X軸的翻轉
	CCFlipX * action2 = CCFlipX::create(true);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//經由過程runAction精靈履行舉措
		sprite->runAction(action2);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}

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

	//延時舉措,第一個參數是履行舉措所須要的時光,moveTo是相對的,就是挪動到哪一個坐標,而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依照必定的角度扭轉,to強調的是成果,如今是0度,會扭轉到90度,假如如今是90度,照樣會在90度
	CCRotateTo * rotateTo = CCRotateTo::create(2.0,90);
	//by強調扭轉的絕對角度,豈論如今若干度都邑扭轉90度,以to和by開頭的舉措類都是雷同的事理
	CCRotateBy * rotateBy = CCRotateBy::create(2.0,90);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//經由過程runAction精靈履行舉措
		//sprite->runAction(moveTo);
		//sprite->runAction(moveBy);
		sprite->runAction(rotateBy);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}

以by開頭的延時舉措都可以經由過程reverse()取得它的革命作。

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

	//第二個參數是騰躍的向量,第三個參數是騰躍的高度,第四個參數是騰躍的次數
	CCJumpBy * jumpBy = CCJumpBy::create(2.0,ccp(100,30),50,4);
	//以by開頭的延時舉措都可以經由過程reverse()取得它的革命作
	CCActionInterval * jumpBack = jumpBy->reverse();

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//經由過程runAction精靈履行舉措
		sprite->runAction(jumpBy);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{
		sprite->runAction(jumpBack);
	}
}

延時舉措中還有倆個反復舉措的函數,就是反復赓續的履行某一個舉措,看下他們的繼續關系。

上面是完成的源代碼。

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

	//第一個參數傳入反復的舉措,第二個參數傳入反復的次數
	CCRepeat * repeat = CCRepeat::create(rotateBy,4);
	//永久反復履行一個舉措
	CCRepeatForever * repeatForever = CCRepeatForever::create(rotateBy);

	if(toggleMenu->getSelectedIndex() == 1)
	{
		//經由過程runAction精靈履行舉措
		sprite->runAction(repeatForever);
	}
	else if(toggleMenu->getSelectedIndex() == 0)
	{

	}
}


上面再羅列一下根本經常使用的瞬時舉措和延續舉措。
瞬時舉措:
放置Place:後果相似於 setPosition = ccp(x, y)。
隱蔽Hide:後果相似於setVisible:false。
顯示Show:後果相似於setVisible:true。
可見切換:ToggleVisibility。
延時舉措:
挪動到CCMoveTo
挪動CCMoveBy
騰躍到CCJumpTo設置起點地位和騰躍的高度和次數。
騰躍CCJumpBy設置起點地位和騰躍的高度和次數。
貝塞爾CCBezierBy支撐 3 次貝塞爾曲線:P0-終點,P1-終點切線偏向,P2-起點切線偏向,P3-起點。
縮小到CCScaleTo設置縮小倍數,是浮點型。
縮小CCScaleBy
扭轉到CCRotateTo
扭轉CCRotateBy
閃耀CCBlink設定閃耀次數
色彩變更到CCTintTo
色彩變換CCTintBy
變暗到CCFadeTo
由無變亮CCFadeIn
由亮變無CCFadeOut
每一個函數的詳細用法請年夜家自行實驗。
接上去說一下同步舉措序列溫柔序舉措序列。同步舉措序列,就是幾個舉措同時履行,次序舉措序列,就是傳入的幾個舉措依照次序次序履行。以下是他們的繼續關系圖。

接上去看一下完成的源代碼

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

	//創立以下幾個舉措

	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);

	//同步舉措序列,傳入的幾個舉措同時履行,履行的全部時光是最長的一個舉措的履行時光,參數類型是CCFiniteTimeAction
	//傳入的舉措(舉措的本質就是轉變節點的屬性)所影響的屬性不要有抵觸
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//次序舉措序列,傳入的幾個舉措依照傳入的次序次序履行,履行的全體時光是一切舉措的時光之和
	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完成鏡頭追隨的後果,相似於我們在橫版過關游戲中看到的人物永久在屏幕中央,而配景在挪動,不外它們的完成詳細是否是靠這個類就不曉得了。CCSpeed可以完成快進和慢放的後果,就是轉變了履行的速度。以下是源代碼。


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

	//創立以下幾個舉措

	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);

	//同步舉措序列,傳入的幾個舉措同時履行,履行的全部時光是最長的一個舉措的履行時光,參數類型是CCFiniteTimeAction
	//傳入的舉措(舉措的本質就是轉變節點的屬性)所影響的屬性不要有抵觸
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//次序舉措序列,傳入的幾個舉措依照傳入的次序次序履行,履行的全體時光是一切舉措的時光之和
	CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL);
	CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL);

	//CCFollow完成一個節點追隨一個節點活動,傳入的參數是要追隨的節點
	CCFollow * follow = CCFollow::create(sprite);
	//履行這個舉措的是要追隨的節點,普通是層,後果累世於橫版過關游戲中的場景
	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的完成,在上述代碼的基本上做了一點修正。

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

	//創立以下幾個舉措

	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);

	//同步舉措序列,傳入的幾個舉措同時履行,履行的全部時光是最長的一個舉措的履行時光,參數類型是CCFiniteTimeAction
	//傳入的舉措(舉措的本質就是轉變節點的屬性)所影響的屬性不要有抵觸
	CCSpawn * spawn = CCSpawn::create(move,rotate,NULL);
	CCSpawn * spawnBack = CCSpawn::create(moveBack,rotateBack,NULL);

	//次序舉措序列,傳入的幾個舉措依照傳入的次序次序履行,履行的全體時光是一切舉措的時光之和
	CCSequence * sequence = CCSequence::create(move,rotate,flip,NULL);
	CCSequence * sequenceBack = CCSequence::create(moveBack,rotateBack,flip->reverse(),NULL);

	//CCFollow完成一個節點追隨一個節點活動,傳入的參數是要追隨的節點
	CCFollow * follow = CCFollow::create(sprite);
	//履行這個舉措的是要追隨的節點,普通是層,後果累世於橫版過關游戲中的場景
	this->runAction(follow);

	//CCSpeed分裝了一個舉措類,第二個參數是要轉變的速度的倍數
	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家族類的應用辦法,它們也是一個舉措類,普通用在次序舉措序列中履行的最初一個舉措,目標是挪用一個函數,來完成一些功效。以下是這些類的繼續關系。

接上去貼上源代碼,正文是對各個類的應用的具體講授。


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);

		//創立一個菜單,添加一個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);

	//創立延時舉措
	CCRotateBy * rotate = CCRotateBy::create(2.0,3*360);
	//CCCallFunc,為這個舉措綁定一個函數,履行這個舉措的時刻會挪用這個函數,創立以下四個舉措的時刻應用了分歧的選擇器,但名字和各個舉措有關
	CCCallFunc * func = CCCallFunc::create(this,callfunc_selector(HelloWorld::show));
	//CCCallFuncN(N就是node的意思),與上邊分歧的是,綁定的函數須要一個參數,這個傳入的參數就是履行這個舉措的節點
	CCCallFuncN * funcN = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::remove));
	int num = 10;
	//CCCallFuncND(D就是data的意思),此次綁定的函數,不只須要綁定舉措的節點作為參數傳遞,還帶了一個void *類型的參數,代表可所以任何類型
	CCCallFuncND *funcND = CCCallFuncND::create(this,callfuncND_selector(HelloWorld::showData),(void *)num);
	CCSprite * sprite2 = CCSprite::create("image2.png");
	//CCCallFuncO(O就是object的意思)此次須要傳入的參數是CCObject *類型的
	CCCallFuncO * funcO = CCCallFuncO::create(this,callfuncO_selector(HelloWorld::showSprite),sprite2);

	//創立次序舉措序列
	//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);
}

//以下函數不要忘卻在頭文件中聲明,留意每一個函數的參數
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()函數取得履行舉措的精靈,而是應用remove傳來的參數
	CCSprite * sprite = (CCSprite *)node;
	//true表現sprite不只會移除,並且這個節點上的一切操作和回調都將刪除
	sprite->removeFromParentAndCleanup(true);
	//經由過程以下的辦法可以完成雷同的後果,只是函數履行的對象分歧
	//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);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved