先看看效果
在cocos2d-x引擎中,層有以下的虛函數觸摸響應函數
//觸摸開始(也就是人們第一次觸摸屏幕的點)
virtual bool onTouchBegan(Touch * touch, Event * unused_envent);
//觸摸過程中(移動過程中的觸摸點)
virtual void onTouchMoved(Touch * touch, Event * unused_envent);
//結束點
virtual void onTouchEnded(Touch * touch, Event * unused_envent);
virtual void onTouchCancelled(Touch * touch, Event * unused_envent);
在層的設置中進行自己想要的觸摸響應事件,如層的拖動
首先,我們腦海中想的是我們在玩遊戲時,如王者榮耀的拖動視角
1.人觸摸一個點(onTouchBegan),記錄層座標以及觸摸點的座標(getPosition獲取層的座標和touch->getLocation獲得觸摸點座標)
2.根據這個點的實時移動(onTouchMoved)做出相應的動作(拖動)
3.其中有一些算法,如拖動使用的是:開始時本身層的座標點+(移動時的座標點-移動開始時的座標點)= 拖動效果。
話不多少,看看代碼吧:
頭文件
#ifndef LayerDemo_h
#define LayerDemo_h
#include "cocos2d.h"
using namespace cocos2d;
class LayerDemo : public Layer
{
public:
CREATE_FUNC(LayerDemo);
virtual bool init();
virtual bool onTouchBegan(Touch * touch, Event * unused_envent);
virtual void onTouchMoved(Touch * touch, Event * unused_envent);
virtual void onTouchEnded(Touch * touch, Event * unused_envent);
virtual void onTouchCancelled(Touch * touch, Event * unused_envent);
//層的精靈
Sprite * sprite_3;
//記錄開始觸摸的點
Point touch_began;
//滑動過程中的點
Point touch_p;
//記錄觸摸開始的層的座標。
Vec2 p;
};
#endif /* LayerDemo_h */
cpp文件
#include "LayerDemo.h"
#include <iostream>
using namespace std;
bool LayerDemo::init()
{
if(!Layer::init())
{
return false;
}
auto visitable = Director::getInstance()->getVisibleSize();
this->setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
this->setTouchEnabled(true);
sprite_3 = Sprite::create("diban.jpg");
sprite_3->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
sprite_3 ->setPosition(Director::getInstance()->getVisibleSize()/2 + Size(0,49.3));
sprite_3->setScale((visitable.width / sprite_3->getContentSize().width)* 2, visitable.height / sprite_3->getContentSize().height);
this->addChild(sprite_3);
//初始化
touch_p = Vec2(0,0);
touch_began =Vec2(0,0);
return true;
}
//觸摸開始
bool LayerDemo::onTouchBegan(Touch *touch, Event *unused_envent)
{
CCLOG("Touch Began");
p = sprite_3->getPosition();
touch_began = touch->getLocation();
cout << touch_began.x << endl;
return true;
}
//觸摸按下
void LayerDemo::onTouchMoved(Touch *touch, Event *unused_envent)
{
CCLOG("Touch Moved");
touch_p = touch->getLocation();
//存在邊界
if(p.x + (touch_p.x - touch_began.x) >= 0 && p.x + (touch_p.x - touch_began.x) <= Director::getInstance()->getVisibleSize().width)
{
sprite_3->setPositionX(p.x + (touch_p.x - touch_began.x));
}
cout << touch_p.x << endl;
}
//觸摸消失
void LayerDemo::onTouchEnded(Touch *touch, Event *unused_envent)
{
CCLOG("Touch Ended");
}
void LayerDemo::onTouchCancelled(Touch *touch, Event *unused_envent)
{
CCLOG("Touch Cancelled");
}
快去自己試試吧!