コード例 #1
0
ファイル: HangState.cpp プロジェクト: kgwong/ProjectSkystone
void HangState::update(Scene & scene)
{
	if (verifiedState(scene))
	{
		//update velocity of hook here.
		physics_->enableGravity(false);
		physics_->setVelY(0.0f);
	
		//projected playerPosition
		Point projectedPosition = playerPos_;
		projectedPosition.y += ySpeed_ * yDirection_;
		float dy = projectedPosition.y - hookPosition_.y;
		float hookHeight = scene.gameObjects.playerHook->getComponent<ColliderComponent>()->getHeight();		
		
		if (dy >= hookHeight)
		{
			physics_->setVelY(ySpeed_ * yDirection_ * Time::getElapsedUpdateTime());
			playerPos_ = owner_.getPos();
			radius_ = playerPos_.y - hookPosition_.y;
		/*	LOG("HARVEY") << "radius: " << radius_;
			LOG("HARVEY") << "hook height: " << hookHeight;*/
		}

	}
	else
	{
		stateManager_->changeMovementState(scene, "AirborneState");
	}
}
コード例 #2
0
ファイル: HangState.cpp プロジェクト: kgwong/ProjectSkystone
void HangState::onEnter(Scene& scene)
{	
	if (verifiedState(scene))
	{
		physics_ = owner_.getComponent<PhysicsComponent>();
		stateManager_ = owner_.getComponent<PlayerControlComponent>();
		playerPos_ = owner_.getPos();
		hookPosition_ = scene.gameObjects.playerHook->getPos();
		yDirection_ = 0;
		ySpeed_ = STARTING_SPEED;

		float dx = playerPos_.x - hookPosition_.x;
		float dy = playerPos_.y - hookPosition_.y;
		angle_ = atan2f(dy, dx) * (180 / M_PI);

		if (angle_ < 0)
		{
			stateManager_->changeMovementState(scene, "AirborneState");
		}
		else if (angle_ != RESTING_ANGLE)
		{
			radius_ = sqrtf((dx * dx) + (dy * dy));
			stateManager_->MovementState().setDirection(swingDirection());
			stateManager_->MovementState().setAngle(angle_);
			stateManager_->MovementState().setRadius(radius_);
			stateManager_->changeMovementState(scene, "SwingState");
		}
		else
		{
			radius_ = dy;
		}

		LOG("HARVEY") << "STARTING ANGLE: " << angle_;
	}
	else
	{
		owner_.getComponent<PlayerControlComponent>()->changeMovementState(scene, "AirborneState");
	}


}
コード例 #3
0
ファイル: SwingState.cpp プロジェクト: kgwong/ProjectSkystone
void SwingState::onEnter(Scene & scene)
{
	if (verifiedState(scene))
	{
		physics_ = owner_.getComponent<PhysicsComponent>();
		stateManager_ = owner_.getComponent<PlayerControlComponent>();
		xSpeed_ = STARTING_SPEED;
		//obtain variables from previous state.
		angle_ = stateManager_->MovementState().angle;
		orient_ = stateManager_->MovementState().direction;
		if (orient_ > 0)
			xDirection_ = -1;
		else
			xDirection_ = 1;


		radius_ = stateManager_->MovementState().radius;
		swingPosition_ = owner_.getPos();
		oldPosition_ = owner_.getPos();
		hookPosition_ = scene.gameObjects.playerHook->getPos();


		LOG("HARVEY") << "ON ENTER direction: " << xDirection_;
		/*LOG("HARVEY") << "ON ENTER angle in degrees: " << angle_;
		LOG("HARVEY") << "ON ENTER angle in radians: " << toRadians(angle_);
		LOG("HARVEY") << "ON ENTER radius: " << radius_;
		LOG("HARVEY") << "ON ENTER hook Position: " << hookPosition_;
		LOG("HARVEY") << "ON ENTER player position: " << swingPosition_;
		LOG("HARVEY") << "ON ENTER direction: " << xDirection_;*/
	}
	else
	{
		owner_.getComponent<PlayerControlComponent>()->changeMovementState(scene, "AirborneState");
	}

}
コード例 #4
0
ファイル: C-method.cpp プロジェクト: Soucha/FSMlib
	sequence_in_t C_method(const unique_ptr<DFSM>& fsm, int extraStates) {
		RETURN_IF_UNREDUCED(fsm, "FSMtesting::C_method", sequence_in_t());
		auto E = getAdaptiveDistinguishingSet(fsm);
		if (E.empty()) {
			return sequence_in_t();
		}
		auto N = fsm->getNumberOfStates();
		auto P = fsm->getNumberOfInputs();
		
		/* // Example from simao2009checking
		E.clear();
		E[0].push_back(0);
		E[0].push_back(1);
		E[0].push_back(0);
		E[1].push_back(0);
		E[1].push_back(1);
		E[1].push_back(0);
		E[2].push_back(0);
		E[2].push_back(1);
		E[3].push_back(0);
		E[3].push_back(1);
		E[4].push_back(0);
		E[4].push_back(1);
		//*/
		vector<vector<bool>> verifiedTransition(N);
		vector<input_t> verifiedState(N, P);
		vector<shared_ptr<ver_seq_t>> verSeq(N);
		for (state_t i = 0; i < N; i++) {
			verifiedTransition[i].resize(P, false);
			verSeq[i] = make_shared<ver_seq_t>();
		}
		if (fsm->isOutputState()) {
			for (state_t i = 0; i < N; i++) {
				sequence_in_t seq;
				for (const auto& input : E[i]) {
					if (input == STOUT_INPUT) continue;
					seq.push_back(input);
				}
				E[i].swap(seq);
			}
		}
		output_t outputState = (fsm->isOutputState()) ? fsm->getOutput(0, STOUT_INPUT) : DEFAULT_OUTPUT;
		output_t outputTransition;
		vector<unique_ptr<TestNodeC>> cs;
		cs.emplace_back(make_unique<TestNodeC>(STOUT_INPUT, DEFAULT_OUTPUT, 0, outputState));
		state_t currState = 0;
		for (const auto& input : E[0]) {
			auto nextState = fsm->getNextState(currState, input);
			outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
			outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, input) : DEFAULT_OUTPUT;
			cs.emplace_back(make_unique<TestNodeC>(input, outputTransition, nextState, outputState));
			currState = nextState;
		}
		vector<vector<seq_len_t>> confirmedNodes(N);
		confirmedNodes[0].push_back(0);
		queue<seq_len_t> newlyConfirmed;
		seq_len_t counter = N * fsm->getNumberOfInputs();
		seq_len_t currIdx = 1;
		seq_len_t lastConfIdx = 0;
		currState = 0;

		while (counter > 0) {
			//getCS(CS, fsm->isOutputState());
			//printf("%u/%u %u %s\n", currIdx, cs.size(), lastConfIdx, FSMmodel::getInSequenceAsString(CS).c_str());
			if (cs.back()->confirmed) {
				currIdx = seq_len_t(cs.size());
				lastConfIdx = currIdx - 1;
			}
			if (currIdx < cs.size()) {
				if (!cs[currIdx]->confirmed) {
					auto nextState = cs[currIdx]->state;
					auto nextInput = E[nextState].begin();
					if (equalSeqPart(currIdx + 1, nextInput, E[nextState].end(), cs)) {
						currState = cs.back()->state;
						for (; nextInput != E[cs[currIdx]->state].end(); nextInput++) {
							nextState = fsm->getNextState(currState, *nextInput);
							outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
							outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, *nextInput) : DEFAULT_OUTPUT;
							cs.emplace_back(make_unique<TestNodeC>(*nextInput, outputTransition, nextState, outputState));
							currState = nextState;
						}
						cs[currIdx]->confirmed = true;
						newlyConfirmed.emplace(currIdx);
						update(lastConfIdx, cs, newlyConfirmed, verifiedTransition, verifiedState, verSeq, confirmedNodes, counter);
						processNewlyConfirmed(cs, newlyConfirmed, verifiedTransition, verifiedState, verSeq, confirmedNodes, counter,
							currIdx, lastConfIdx);
					}
				}
				else {
					lastConfIdx = currIdx;
				}
				currIdx++;
			}
			else if (verifiedState[cs.back()->state] > 0) {
				currState = cs.back()->state;
				for (input_t input = 0; input < P; input++) {
					if (!verifiedTransition[currState][input]) {
						auto nextState = fsm->getNextState(currState, input);
						outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
						outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, input) : DEFAULT_OUTPUT;
						cs.emplace_back(make_unique<TestNodeC>(input, outputTransition, nextState, outputState));
						cs.back()->confirmed = true;
						newlyConfirmed.emplace(currIdx); //cs.size()-1

						sequence_in_t seqE(E[nextState]);
						// output-confirmed
						if (!E[currState].empty() && input == E[currState].front()) {
							sequence_in_t suf(E[currState]);
							suf.pop_front();
							auto outSuf = fsm->getOutputAlongPath(nextState, suf);
							auto outE = fsm->getOutputAlongPath(nextState, E[nextState]);
							//printf("(%d,%d,%d) %s/%s %s\n", currState, input, nextState,
							//      FSMmodel::getInSequenceAsString(suf).c_str(),
							//    FSMmodel::getOutSequenceAsString(outSuf).c_str(),
							//  FSMmodel::getOutSequenceAsString(outE).c_str());
							seq_len_t lenE = 0; //outE.size();
							for (state_t i = 0; i < N; i++) {
								if (i != nextState) {
									auto outSufI = fsm->getOutputAlongPath(i, suf);
									auto osl = equalLength(outSuf.begin(), outSufI.begin(), seq_len_t(outSuf.size()));
									if (osl != outSuf.size()) {
										bool outConfirmed = false;
										auto sufIt = suf.begin();
										osl++;
										while (osl-- > 0) sufIt++;
										for (auto& cnIdx : confirmedNodes[i]) {
											auto sufBeginIt = suf.begin();
											if (equalSeqPart(cnIdx + 1, sufBeginIt, sufIt, cs)) {
												outConfirmed = true;
												break;
											}
										}

										if (outConfirmed) {
											continue;
											/*
											outConfirmed = false;
											for (auto cnIdx : confirmedNodes[nextState]) {
											auto sufBeginIt = suf.begin();
											if (equalSeqPart(cnIdx, sufBeginIt, sufIt)) {
											outConfirmed = true;
											break;
											}
											}
											if (outConfirmed) {
											continue;
											}
											*/
										}
									}
									auto outI = fsm->getOutputAlongPath(i, E[nextState]);
									auto oel = 1 + equalLength(outE.begin(), outI.begin(), seq_len_t(outI.size()));
									//printf("%s/%s x %s %d %d-%d\n", 
									//      FSMmodel::getInSequenceAsString(E[nextState]).c_str(),
									//    FSMmodel::getOutSequenceAsString(outE).c_str(),
									//  FSMmodel::getOutSequenceAsString(outI).c_str(),
									//oel, lenE, outE.size());
									if (oel > lenE) {
										lenE = oel;
										if (lenE == outE.size()) {// entire E is needed
											break;
										}
									}
								}
							}
							// adjust E
							for (; lenE < outE.size(); lenE++) {
								seqE.pop_back();
							}
						}
						currState = nextState;
						for (const auto& input : seqE) {
							nextState = fsm->getNextState(currState, input);
							outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
							outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, input) : DEFAULT_OUTPUT;
							cs.emplace_back(make_unique<TestNodeC>(input, outputTransition, nextState, outputState));
							currState = nextState;
						}
						update(currIdx - 1, cs, newlyConfirmed, verifiedTransition, verifiedState, verSeq, confirmedNodes, counter);
						processNewlyConfirmed(cs, newlyConfirmed, verifiedTransition, verifiedState, verSeq, confirmedNodes, counter,
							currIdx, lastConfIdx);
						break;
					}
				}
			}
			else {// find unverified transition
				vector<bool> covered(N, false);
				list<pair<state_t, sequence_in_t>> fifo;
				currState = cs.back()->state;
				covered[currState] = true;
				fifo.emplace_back(currState, sequence_in_t());
				while (!fifo.empty()) {
					auto current = move(fifo.front());
					fifo.pop_front();
					for (input_t input = 0; input < P; input++) {
						auto nextState = fsm->getNextState(current.first, input);
						if (nextState == WRONG_STATE) continue;
						if (verifiedState[nextState] > 0) {
							for (auto nextInput = current.second.begin(); nextInput != current.second.end(); nextInput++) {
								nextState = fsm->getNextState(currState, *nextInput);
								outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
								outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, *nextInput) : DEFAULT_OUTPUT;
								cs.emplace_back(make_unique<TestNodeC>(*nextInput, outputTransition, nextState, outputState));
								cs.back()->confirmed = true;
								currState = nextState;
							}
							nextState = fsm->getNextState(currState, input);
							outputState = (fsm->isOutputState()) ? fsm->getOutput(nextState, STOUT_INPUT) : DEFAULT_OUTPUT;
							outputTransition = (fsm->isOutputTransition()) ? fsm->getOutput(currState, input) : DEFAULT_OUTPUT;
							lastConfIdx = seq_len_t(cs.size());
							cs.emplace_back(make_unique<TestNodeC>(input, outputTransition, nextState, outputState));
							cs.back()->confirmed = true;
							currIdx = seq_len_t(cs.size());
							fifo.clear();
							break;
						}
						if (!covered[nextState]) {
							covered[nextState] = true;
							sequence_in_t newPath(current.second);
							newPath.push_back(input);
							fifo.emplace_back(nextState, move(newPath));
						}
					}
				}

			}
		}
		return getCS(fsm->isOutputState(), cs);
	}