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);
		}
	}
}

좋은 웹페이지 즐겨찾기