这次要做一个拖动精灵的效果,那么我们需要一个响应触摸事件的精灵类,所以我们让其继承精灵类与触摸事件类。
然后重写其中的creat、ccTouchBegan、ccTouchMoved、onEnter函数。
第二步——响应触摸拖动事件:
bool player::ccTouchBegan(cocos2d::CCTouch * touch,cocos2d::CCEvent * event)
{
CCPoint touchPoint=touch->getLocation();//获得触摸OPENGL位置
CCPoint reallyPoint=this->getParent()->convertToNodeSpace(touchPoint);//触摸坐标转换为窗口内坐标
CCRect rect = this->boundingBox();//返回精灵矩形框
if(rect.containsPoint(reallyPoint))判断触摸位置是否在框里
{
return 1;//是就转移到move
}
return 0;//否则直接结束
}
void player::ccTouchMoved(cocos2d::CCTouch * touch,cocos2d::CCEvent * event)
{
CCPoint touchLocation = touch->getPreviousLocationInView();//获得触摸的UI坐标
CCPoint pos = CCDirector::sharedDirector()->convertToGL(touchLocation);//转化为opengl坐标
this->setPosition(ccp(pos.x,pos.y));//让精灵移动到该坐标
}
* getLocation:获取触摸时第一点的cocos2dx OPENGL坐标 * getPreviousLocation 获取触摸时最后一点 cocos2dx OPENGL坐标 * getLocationInView 获取触摸时第一点的 UI坐标 * getPreviousLocationInView 获取触摸时的最后一点 UI坐标
第一步——在自定义一个继承精灵类和触摸事件类的类,重写其中的onEnter函数,注册触摸事件
virtual void onEnter()
{
cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this,0,false);
CCSprite::onEnter();
}
一开始精灵会在移动的过程中Y轴翻转,后来将move函数中的第一句getLocation换成了getPreviousLocationInView 就好了,这是什么原因呢?