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

Cocos2d-x觸摸事宜實例

編輯:關於C++

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


在玩手機游戲的時刻,屏幕吸收我們的觸摸新聞是必弗成少的,依據我們的觸摸事宜,去完成響應的功效,這裡我們就來進修一下cocos2d-x中的觸摸是怎樣完成的。觸摸分為單點觸摸和多點觸摸,先來看單點觸摸,就是吸收一個點的觸摸。代碼將完成進程清晰的寫了上去,細心剖析代碼吧。

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

	//開啟觸摸
	this->setTouchEnabled(true);

    bRet = true;
  } while (0);

  return bRet;
}

//開啟觸摸今後必需注冊觸摸事宜,告知引擎你支撐單點觸摸照樣多點觸摸
void HelloWorld::registerWithTouchDispatcher()
{
	//addTargetedDelegate注冊單點觸摸,第一個參數代表為哪一個對象注冊觸摸事宜,第二個代表優先級,數字越
	//小,優先級越高,第三個參數代表能否吞噬新聞,假如為true這個節點接收了新聞,處置後,優先級比它小的節點
	//就接收不到新聞了
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
}

//ccTouchBegan是必需要完成的函數,也是在四個協定辦法中獨一一個前往值為bool類型的函數
//前往值是true的情形下,會接上去呼應ccTouchMoved和ccTouchEnded和ccTouchCancelled函數。
//CCTouch中封裝了關於觸摸點的一些屬性,例如坐標信息,CCEvent沒有甚麼用
bool HelloWorld::ccTouchBegan(CCTouch * pTouch,CCEvent * pEvent)
{
	//取得opengl坐標下的點坐標
	CCPoint point = pTouch->getLocation();

	CCSprite * sprite = CCSprite::create("image.png");
	this->addChild(sprite);
	sprite->setPosition(point);

	return true;
}

//當手指在屏幕上挪動的時刻赓續挪用的一個辦法
void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent)
{
	//取得opengl坐標下的點坐標
	CCPoint point = touch->getLocation();

	CCSprite * sprite = CCSprite::create("image.png");
	this->addChild(sprite);
	sprite->setPosition(point);
}

//當手指抬起來的時刻會挪用的辦法
void HelloWorld::ccTouchEnded(CCTouch * pTouch,CCEvent * pEvent)
{
	this->removeAllChildrenWithCleanup(true);
}
//還有一個ccTouchCancelled函數,在撤消觸摸事宜的時刻挪用,好比我們在觸屏的時刻忽然打來了德律風

接上去用我們方才學到的常識,來完成拖拽精靈挪動的後果。

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

		//完成拖拽精靈挪動的後果
		CCSprite * sprite = CCSprite::create("image2.png");
		sprite->setPosition(ccp(240,180));
		this->addChild(sprite,0,0);

		//開啟觸摸
		this->setTouchEnabled(true);

    bRet = true;
  } while (0);

  return bRet;
}

//開啟觸摸今後必需注冊觸摸事宜,告知引擎你支撐單點觸摸照樣多點觸摸
void HelloWorld::registerWithTouchDispatcher()
{
	//addTargetedDelegate注冊單點觸摸,第一個參數代表為哪一個對象注冊觸摸事宜,第二個代表優先級,數字越
	//小,優先級越高,第三個參數代表能否吞噬新聞,假如為true這個節點接收了新聞,處置後,優先級比它小的節點
	//就接收不到新聞了
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
}

bool HelloWorld::ccTouchBegan(CCTouch * touch,CCEvent * pEvent)
{
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	//取得手指導擊的點的坐標
	CCPoint point = touch->getLocation();
	//取得精靈地點的區域,CCRect包含x,y,width,height
	CCRect rect = sprite->boundingBox();

	//斷定手指導擊的點能否點在了精靈上
	if(rect.containsPoint(point))
	{
		//前往true則會接收其他的協定新聞
		return true;
	}

	return false;
}

void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent)
{
	/*
	這裡可以直接將精靈的坐標設置為手指地點點的坐標地位,然則如許的話會發生騰躍的後果,視覺上欠好看,這是
	由於精靈是在用本身的錨點占領我們設置的坐標地位,而不是我們點擊在精靈身上的誰人點放到我們的手指地點的地位
	*/

	//分離取得了手指如今的點擊點和手指前次的點擊點地位
	CCPoint point = touch->getLocation();
	CCPoint pointPre = touch->getPreviousLocation();
	//ccpSub將倆個點相減,取得一個挪動偏向的向量
	CCPoint direction = ccpSub(point,pointPre);

	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	CCPoint spritePoint = sprite->getPosition();
	//ccpAdd將精靈如今的地位點和挪動偏向的向量相加,取得精靈將要挪動到的地位點
	CCPoint spriteDirection = ccpAdd(spritePoint,direction);
	sprite->setPosition(spriteDirection);
}

接上去進修多點觸摸,多點觸摸和單點觸摸分歧的是它的優先級要低於單點觸摸,豈論注冊的時刻裡邊傳入的數字是若干,固然還有其它的一些差別,讓我們看代碼吧。以下是在windows演出示的後果,windows上沒法完成多點觸摸。

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

		//完成拖拽精靈挪動的後果
		CCSprite * sprite = CCSprite::create("image2.png");
		sprite->setPosition(ccp(240,180));
		this->addChild(sprite,0,0);

		//開啟觸摸
		this->setTouchEnabled(true);

    bRet = true;
  } while (0);

  return bRet;
}

void HelloWorld::registerWithTouchDispatcher()
{
	//注冊多點觸摸,裡邊只要倆個參數
	CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);
}

//在多點觸摸中,這四個協定函數在touch後邊都加了es,而且每一個協定函數不須要都完成,一切的前往值都是void
//CCSet是CCTouch的聚集
void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent)
{
	//CCSetIterator是一個迭代器
	CCSetIterator iterator;
	//以下的辦法就是從CCSet中取得對象的辦法
	for(iterator = set->begin();iterator != set->end();iterator++)
	{
		//將元素強迫轉化為CCTouch *類型
		CCTouch * touch = (CCTouch *)(*iterator);
		CCPoint point = touch->getLocation();

		CCSprite * sprite = CCSprite::create("image.png");
		sprite->setPosition(point);
		this->addChild(sprite);
	}
}

接上去應用上邊的多點觸摸新聞完成精靈的縮小和縮放後果,年夜家看到的相冊圖片縮小和減少的後果也是這麼完成的,然則windows不支撐多點,所以這裡只是解釋道理。
檢查源代碼打印贊助

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

		//完成拖拽精靈挪動的後果
		CCSprite * sprite = CCSprite::create("image2.png");
		sprite->setPosition(ccp(240,180));
		this->addChild(sprite,0,0);

		//開啟觸摸
		this->setTouchEnabled(true);

    bRet = true;
  } while (0);

  return bRet;
}

void HelloWorld::registerWithTouchDispatcher()
{
	//注冊多點觸摸,裡邊只要倆個參數
	CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);
}

void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent)
{
	CCSetIterator iterator = set->begin();
	//取得第一個觸摸點
	CCTouch * touch0 = (CCTouch *)(*iterator);
	iterator++;
	//法式履行到這裡會逝世失落,由於windows只支撐單點觸摸,不支撐多點,所以這裡是不會取得第二個點的
	CCTouch * touch1 = (CCTouch *)(*iterator);
	length = ccpDistance(touch0->getLocation(),touch1->getLocation());
}

void HelloWorld::ccTouchesMoved(CCSet * set,CCEvent * pEvent)
{
	CCSetIterator iterator = set->begin();
	CCTouch * touch0 = (CCTouch *)(*iterator);
	iterator++;
	CCTouch * touch1 = (CCTouch *)(*iterator);
	float length2 = ccpDistance(touch0->getLocation(),touch1->getLocation());
	float times = length2/length;
	CCSprite * sprite = (CCSprite *)this->getChildByTag(0);
	sprite->setScale(times);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved