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(); }
//============================================================================= // 更新 void CloudsUnit::Update() { LimitedPosition(); MovePosition(); }
void C4Object::MovePosition(int32_t dx, int32_t dy) { MovePosition(itofix(dx), itofix(dy)); }
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(); }