Exemple #1
0
bool Board::isFinished(Player &winner) const
{
	bool finished = false;
	int row = 0;
	while (row < BOARD_SIZE && !finished)
	{
		int column = 0;
		while (column < BOARD_SIZE && !finished)
		{
			Position pos = MakePosition(row, column);
			
			Box &box = this->boxAtPosition(pos);
			if (box.isOccupied())
			{
				const Player &player = box.getPlayer();
				
				int nDirections;
				Direction *directions = this->getDirectionsToCheckForPosition(pos, nDirections);
				int i = 0;
				while (i < nDirections && !finished)
				{
					Direction nextDirection = directions[i];
					
					bool samePlayer = true;
					Position nextPos = MovePosition(pos, nextDirection);
					while (this->positionIsValid(nextPos) && samePlayer)
					{
						Box &box = this->boxAtPosition(nextPos);
						samePlayer = (box.isOccupied() && box.getPlayer() == player);
						nextPos = MovePosition(nextPos, nextDirection);
					}
					
					finished = (samePlayer);
					if (finished)
					{
						winner = player;
					}
					++i;
				}
				
				delete [] directions;
			}
			
			++column;
		}
		++row;
	}
	
	return finished;
}
uint8 MatchTap(const InputEventQueue::Queue & Queue, InputEventQueue::Queue::const_iterator & InputEventIterator)
{
	if (Queue.end() == InputEventIterator)
		return 1;

	if (IsPointerButtonEvent<Pointer::VirtualCategory::POINTING, 0, true>(*InputEventIterator))
	{
		Vector2n DownPosition(InputEventIterator->m_PostEventState.GetAxisState(0).GetPosition(), InputEventIterator->m_PostEventState.GetAxisState(1).GetPosition());
		auto DownTime = InputEventIterator->GetTimestamp();

		auto InputEventIterator2 = InputEventIterator;
		++InputEventIterator2;
		for (; Queue.end() != InputEventIterator2; ++InputEventIterator2)
		{
			if (IsPointerButtonEvent<Pointer::VirtualCategory::POINTING, 0, false>(*InputEventIterator2))
			{
				Vector2n UpPosition(InputEventIterator2->m_PostEventState.GetAxisState(0).GetPosition(), InputEventIterator2->m_PostEventState.GetAxisState(1).GetPosition());
				auto UpTime = InputEventIterator2->GetTimestamp();

				if (   (UpPosition - DownPosition).LengthSquared() <= (TapRadius * TapRadius)
					&& (UpTime - DownTime) <= TapTime)
				{
					++InputEventIterator2;
					InputEventIterator = InputEventIterator2;
					return 2;
				}
				else
				{
					return 0;
				}
			}
			else if (IsPointerPointingMoveEvent<0>(*InputEventIterator2))
			{
				Vector2n MovePosition(InputEventIterator2->m_PostEventState.GetAxisState(0).GetPosition(), InputEventIterator2->m_PostEventState.GetAxisState(1).GetPosition());
				auto NewTime = InputEventIterator2->GetTimestamp();

				if (   (MovePosition - DownPosition).LengthSquared() <= (TapRadius * TapRadius)
					&& (NewTime - DownTime) <= TapTime)
				{}
				else
				{
					return 0;
				}
			}
			else
			{
				return 0;
			}
		}

		// Only if there's still a chance a new event can come in time to make a match
		if ((glfwGetTime() - DownTime) <= TapTime)
		{
			return 1;
		}
	}

	return 0;
}
void Scene_Inca_Mainscreen::Draw()
{
   double fElapsed = MyGame::getGame()->getKWindow()->getFrameTime();
   if (_bAnimDoor) {
      _lpAnimDoor->move(fElapsed);
      // Déplace la porte
      RestorePosition("inca_main_door");
      MovePosition("inca_main_door", GetRandom(-1.0, 1.0), _lpAnimDoor->getCurrentValue());
      if (_lpAnimDoor->isCompleted()) {
         _bAnimDoor = false;
         ResolveTask("task_inca_opendoor");
         AddObjective("inca","4artefacts");
         AddHint("inca","4artefacts","where");
         AddHint("inca","4artefacts","light");
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_CINEMATIC, false);
      }
   }
   
   EScene::Draw();
}
Exemple #4
0
//=============================================================================
// 更新
void CloudsUnit::Update()
{
	LimitedPosition();
	MovePosition();
}
Exemple #5
0
void C4Object::MovePosition(int32_t dx, int32_t dy)
{
	MovePosition(itofix(dx), itofix(dy));
}
Exemple #6
0
std::map<Position, int> Board::weightForBoxesFromPositionInDirectionForPlayer(Position position, Direction direction, Player player)
{
	int weight = 0;
	bool canComplete = true;
	Position nextPosition = position;
	while (canComplete && this->positionIsValid(nextPosition))
	{
		Box &box = this->boxAtPosition(nextPosition);
		if (!box.isOccupied())
		{
			++weight;
		} else
		{
			canComplete = (box.getPlayer() == player);
		}
		nextPosition = MovePosition(nextPosition, direction);
	}
	
	Direction invDirection = InversedDirection(direction);
	Position prevPosition = MovePosition(position, invDirection);
	while (canComplete && this->positionIsValid(prevPosition))
	{
		Box &box = this->boxAtPosition(prevPosition);
		if (!box.isOccupied())
		{
			++weight;
		} else
		{
			canComplete = (box.getPlayer() == player);
		}
		prevPosition = MovePosition(prevPosition, invDirection);
	}
	
	
	std::map<Position, int> weightsByPosition;
	nextPosition = position;
	while (this->positionIsValid(nextPosition))
	{
		Box &box = this->boxAtPosition(nextPosition);
		if (canComplete)
		{
			 if (box.isOccupied() /*&& box.getPlayer() == player*/)
			 {
				 weightsByPosition[nextPosition] = -1;
			 } else
			 {
				 weightsByPosition[nextPosition] = weight;
			 }
		} else
		{
			if (box.isOccupied())
			{
				weightsByPosition[nextPosition] = -2;
			} else
			{
				weightsByPosition[nextPosition] = 0;
			}
		}
		
		nextPosition = MovePosition(nextPosition, direction);
	}
	
	prevPosition = MovePosition(position, invDirection);
	while (this->positionIsValid(prevPosition))
	{
		Box &box = this->boxAtPosition(prevPosition);
		if (canComplete)
		{
			if (box.isOccupied() /*&& box.getPlayer() == player*/)
			{
				weightsByPosition[prevPosition] = -1;
			} else
			{
				weightsByPosition[prevPosition] = weight;
			}
		} else
		{
			if (box.isOccupied())
			{
				weightsByPosition[prevPosition] = -2;
			} else
			{
				weightsByPosition[prevPosition] = 0;
			}
		}
		prevPosition = MovePosition(prevPosition, invDirection);
	}
	
	return weightsByPosition;
}
MatchResult MatchDoubleTap2(const InputEventQueue::FilteredQueue & Queue, InputEventQueue::FilteredQueue::const_iterator InputEventIterator)
{
	auto Match = MatchDown(Queue, InputEventIterator);
	if (2 == Match.Status)
	{
		Vector2n DownPosition((*InputEventIterator)->m_PostEventState.GetAxisState(0).GetPosition(), (*InputEventIterator)->m_PostEventState.GetAxisState(1).GetPosition());
		auto DownTime = (*InputEventIterator)->GetTimestamp();
		auto PointingPointer = (*InputEventIterator)->m_Pointer;

		uint8 NumberOfTaps = 0;

		auto FilteredQueue2 = InputEventQueue::FilterByPointer(InputEventQueue::CreateFilteredQueue(Queue, Match.End), PointingPointer);
		for (auto InputEventIterator2 = FilteredQueue2.begin(); FilteredQueue2.end() != InputEventIterator2; ++InputEventIterator2)
		{
			Match.Events.push_back(*InputEventIterator2);

			if (IsPointerButtonEvent<Pointer::VirtualCategory::POINTING, 0, false>(**InputEventIterator2))
			{
				Vector2n UpPosition((*InputEventIterator2)->m_PostEventState.GetAxisState(0).GetPosition(), (*InputEventIterator2)->m_PostEventState.GetAxisState(1).GetPosition());
				auto UpTime = (*InputEventIterator2)->GetTimestamp();

				if (   (UpPosition - DownPosition).LengthSquared() <= (TapRadius * TapRadius)
					&& (UpTime - DownTime) <= DoubleTapTime)
				{
					if (1 == NumberOfTaps)
					{
						++InputEventIterator2;
						return MatchResult(InputEventIterator2, Match.Events);
					}
					else
						++NumberOfTaps;
				}
				else
				{
					return MatchResult();
				}
			}
			else if (IsPointerPointingMoveEvent<0>(**InputEventIterator2))
			{
				Vector2n MovePosition((*InputEventIterator2)->m_PostEventState.GetAxisState(0).GetPosition(), (*InputEventIterator2)->m_PostEventState.GetAxisState(1).GetPosition());
				auto NewTime = (*InputEventIterator2)->GetTimestamp();

				if (   (MovePosition - DownPosition).LengthSquared() <= (TapRadius * TapRadius)
					&& (NewTime - DownTime) <= TapTime)
				{}
				else
				{
					return MatchResult();
				}
			}
			else if (IsPointerButtonEvent<Pointer::VirtualCategory::POINTING, 0, true>(**InputEventIterator2))
			{
				Vector2n DownAgainPosition((*InputEventIterator2)->m_PostEventState.GetAxisState(0).GetPosition(), (*InputEventIterator2)->m_PostEventState.GetAxisState(1).GetPosition());
				auto NewTime = (*InputEventIterator2)->GetTimestamp();

				if (   (DownAgainPosition - DownPosition).LengthSquared() <= (TapRadius * TapRadius)
					&& (NewTime - DownTime) <= TapTime)
				{}
				else
				{
					return MatchResult();
				}
			}
			else
			{
				return MatchResult();
			}
		}

		// Only if there's still a chance a new event can come in time to make a match
		if ((glfwGetTime() - DownTime) <= DoubleTapTime)
		{
			Match.Status = 1;
			return Match;
		}
	}
	else
	{
		return Match;
	}

	return MatchResult();
}