C++11 코드 전시: 간단한 제스처 식별과 응답, 상하좌우
3183 단어 COCOS2DX
C++11의 lambda 함수는 STL에서 비교 작업에 사용됩니다.
현재 3D 투영 시각의 카메라가 한 대밖에 없다는 것을 알지만 대응하는 pRenderNode가 찾은cameraMask의 값은camera3D->setCameraFlag(CameraFlag:::USER3)이다.설치했는데 나중에 카메라를 추가해서 더블카메라 조작을 하면 편할 거예요.
나는 이번 런닝을 캐릭터 모델과 카메라 모델이 점프 조작을 완성하고 메인 장면은 동적 탑재만 맡을 계획이다.
카메라의 조작은 일시적으로 비교적 간단하고 매초 고정된 위치 이동이다.
주요한 문제는 캐릭터의 이동에 약간의 문제가 있다. 캐릭터가 앞으로 이동하는 과정에서 점프 조작을 추가한다. 이때 애니메이션 융합(모델이 지원하지 않으면 무시)이 필요하다. 물리적 위치 이동 궤적은 두 동작으로 바꾸고 일반적인 보행 조작으로 되돌려야 한다.
제스처 식별에서 기본적으로 단점 터치 제어 식별 모드로 사용되며 지난번 타격점을 기록하고 터치가 비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 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);
}
}
}