标签:cocos cocos 3.6 camera 手势识别
因为这个是跑酷类游戏的代码,所以向左向右就按照正常的逻辑,上下滑动本来应该是要执行跳跃操作的,暂时场景属于静止状态,所以先逻辑暂时未拉动摄像机前后移动。
C++11的lambda函数实现,用于STL中比较操作。
虽然我明知当前的3D投影视角的摄像机只有一台,对应的pRenderNode查找到的cameraMask的值是camera3D->setCameraFlag(CameraFlag::USER3);设置的,但是以后增加camera做双摄像机操作就会很方便啦。
我打算把这次的跑酷实现为,角色模型和摄像机模型完成跳跃操作,主场景只负责动态加载。
摄像机的操作暂时比较简单,每秒固定的位移。
主要的问题在于角色移动有点小问题,角色向前移动的过程中增加一个跳跃操作,这个时候需要动画融合(模型不支持就忽略),物理位移轨迹为双动作,然后切回普通的步行操作。
手势识别中默认为单点触控的识别模式,先记录上一次敲击点,在触摸确定为非cancel状态,即end时候,调用此手势。取两点的向量法向,和正右方法向做点乘,正负号可确认偏上下操作。根据左右偏向对比阀值,优先识别为左右滑动操作。
void PlayerInputController::reveiveTouchBegin(Vec2 pos, Node * pRenderNode) { this->_touchBeginPos = std::move(pos); } void PlayerInputController::reveiveTouchEnd(Vec2 pos, Node * pRenderNode) { this->_touchEndPos = std::move(pos); Vec2 diff = _touchEndPos - _touchBeginPos; diff.normalize(); auto temp = Vec2(1, 0);//horizontal line auto result = Vec2::dot(diff, temp); //转向动作抖动阀值,偏移绝对量大于阀值才认定为有效的左右移动 const float Threshold = std::sqrt(2) / 2;//假如刚好移动方向和水平方位处于45度角(-135°)时,点乘值为sqrt(2)/2,即平行四边形的面积 if (std::abs(result) > Threshold) { if (result > 0) // right { //可以移动 且 不是正执行左右移动操作 Gets an action from the running action list by its tag. if (_pPlayer->getCurPlayerSprite()->getPositionX() <= MIDDLE_LINE_POS_X && !_pPlayer->getCurPlayerSprite()->getActionByTag(TURN_LEFT) && !_pPlayer->getCurPlayerSprite()->getActionByTag(TURN_RIGHT) ) { auto action = MoveBy::create(0.2f, Vec3(10, 0, 0)); action->setTag(TURN_RIGHT); this->_pPlayer->getCurPlayerSprite()->runAction(action); } } else //left { //可以移动 且 不是正执行左右移动操作 Gets an action from the running action list by its tag. if (_pPlayer->getCurPlayerSprite()->getPositionX() >= MIDDLE_LINE_POS_X && !_pPlayer->getCurPlayerSprite()->getActionByTag(TURN_LEFT) && !_pPlayer->getCurPlayerSprite()->getActionByTag(TURN_RIGHT) ) { auto action = MoveBy::create(0.2f, Vec3(-10, 0, 0)); action->setTag(TURN_LEFT); this->_pPlayer->getCurPlayerSprite()->runAction(action); } } } else //up or down { #define MOVE_FORWARD(POS_X) auto cameraMask = _pPlayer->getCurPlayerSprite()->getCameraMask(); std::vector<Camera*> cameras = pRenderNode->getScene()->getCameras(); auto func = [cameraMask](decltype(*cameras.begin()) targetCamera) ->bool { return ((unsigned short)targetCamera->getCameraFlag() & cameraMask) != 0; }; auto it = std::find_if(cameras.begin(), cameras.end(), func); while (it != cameras.end()) { auto temp = (*it)->getPosition3D(); temp.add(Vec3(0, 0, POS_X)); (*it)->setPosition3D(temp); std::find_if(++it, cameras.end(), func); } if (diff.y > 0) { MOVE_FORWARD(-5); } else { MOVE_FORWARD(5); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:cocos cocos 3.6 camera 手势识别
原文地址:http://blog.csdn.net/jingzhewangzi/article/details/46960399