コード例 #1
0
        public Cell FindEnemyNextBlankCell(Cell currentCell, TraversalDirection traversalDirection)
        {
            Cell lastEnemyCell = null;

            while (true)
            {
                var targetCell = GetNextCell(currentCell, traversalDirection);
                if (targetCell == null)
                {
                    break;
                }

                currentCell = targetCell;

                if (lastEnemyCell != null &&
                    targetCell.OccupiedColor == PlayerColor.None)
                {
                    return(targetCell);
                }

                if (targetCell.OccupiedColor == playerColor)
                {
                    return(null);
                }

                if (targetCell.OccupiedColor != PlayerColor.None &&
                    targetCell.OccupiedColor != playerColor)
                {
                    lastEnemyCell = targetCell;
                }
            }

            return(null);
        }
コード例 #2
0
        public Cell GetNextCell(Cell currentCell, TraversalDirection traversalDirection)
        {
            int adjX = 0, adjY = 0;

            switch (traversalDirection)
            {
            case TraversalDirection.Top:
                adjY -= 1;
                break;

            case TraversalDirection.Bottom:
                adjY += 1;
                break;

            case TraversalDirection.Left:
                adjX -= 1;
                break;

            case TraversalDirection.Right:
                adjX += 1;
                break;
            }

            if (!map.CheckValidCellPosition(currentCell.X + adjX, currentCell.Y + adjY))
            {
                return(null);
            }

            return(map[currentCell.X + adjX, currentCell.Y + adjY]);
        }
コード例 #3
0
 public _DirectionalPolicyDataEntry(
     TraversalDirection direction,
     FocusNode node)
 {
     this.direction = direction;
     this.node      = node;
 }
コード例 #4
0
/*	bool Traversal(GridNode node , TraversalDirection dir,Vector2 size,int leftcount,int topcount)
 *      {
 *              if(node == null)return false;
 *
 *              if(node.isFilled)return false;
 *
 *              if(leftcount>=size.x)return true;
 *
 *              leftcount++;
 *
 *              return Traversal(GetNode(node,TraversalDirection.LEFT),TraversalDirection.LEFT,size ,leftcount,topcount);
 *
 *
 *              if(topcount>=size.y-1)return true;
 *
 *              topcount++;
 *              leftcount =0;
 *
 *              return Traversal(GetNode(node,TraversalDirection.TOP),TraversalDirection.TOP,size ,leftcount,topcount);
 *
 *      }*/
    bool Traversal(GridNode node, TraversalDirection dir, int toplimit, int limit, int traversalCount)
    {
        if (node == null)
        {
            return(false);
        }
        Debug.Log("***********************node" + node.row + "," + node.Column);
        if (node.isFilled)
        {
            return(false);
        }

        bool leftcheck = SubTraversal(GetNode(node, TraversalDirection.RIGHT), TraversalDirection.RIGHT, limit, 1);

        if (!leftcheck)
        {
            return(false);
        }

        if (traversalCount >= toplimit - 1)
        {
            return(true);
        }

        traversalCount++;

        return(Traversal(GetNode(node, TraversalDirection.TOP), TraversalDirection.TOP, toplimit, limit, traversalCount));
    }
コード例 #5
0
        public FileSystemItem(FileSystemInfo fileSystemInfo, TraversalDirection traversalDirection = TraversalDirection.Down)
        {
            TraversalDirection = traversalDirection;
            _fileSystemInfo    = fileSystemInfo;
            IsDirectory        = _fileSystemInfo is DirectoryInfo;

            if (IsDirectory)
            {
                if ((Attributes & FileAttributes.System) != 0)
                {
                    IconType = IconType.RestricedDirectory;
                }
                else
                {
                    IconType = IconType.Directory;
                }
            }
            else
            {
                if ((Attributes & FileAttributes.System) != 0)
                {
                    IconType = IconType.RestrictedFile;
                }
                else
                {
                    IconType = IconType.File;
                }
            }
        }
コード例 #6
0
        public IEnumerable <FocusNode> _sortAndFilterHorizontally(
            TraversalDirection direction,
            Rect target,
            FocusNode nearestScope)
        {
            D.assert(direction == TraversalDirection.left || direction == TraversalDirection.right);
            IEnumerable <FocusNode> nodes = nearestScope.traversalDescendants;

            D.assert(!nodes.Contains(nearestScope));
            List <FocusNode> sorted = nodes.ToList();

            FocusTravesalUtils.mergeSort <FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dx.CompareTo(b.rect.center.dx));
            IEnumerable <FocusNode> result = new List <FocusNode>();

            switch (direction)
            {
            case TraversalDirection.left:
                result = LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => node.rect != target && node.rect.center.dx <= target.left));

                break;

            case TraversalDirection.right:
                result = LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => node.rect != target && node.rect.center.dx >= target.right));

                break;

            case TraversalDirection.up:
            case TraversalDirection.down:
                break;
            }
            return(result);
        }
コード例 #7
0
        private IEnumerable <T> BreadthFirstEnumerable(TraversalDirection direction)
        {
            if (direction == TraversalDirection.TopDown)
            {
                var queue = new Queue <T>();
                queue.Enqueue(this as T);

                while (0 < queue.Count)
                {
                    var node = queue.Dequeue();
                    foreach (var child in node._children)
                    {
                        queue.Enqueue(child);
                    }

                    yield return(node);
                }

                yield break;
            }

            var stack = new Stack <T>();

            foreach (var node in BreadthFirstEnumerable(TraversalDirection.TopDown))
            {
                stack.Push(node);
            }

            while (stack.Count > 0)
            {
                yield return(stack.Pop());
            }
        }
コード例 #8
0
    public GridNode GetNextNode(GridNode node, TraversalDirection dir)
    {
        if (node == null)
        {
            return(null);
        }
        GridNode n = null;

        switch (dir)
        {
        case TraversalDirection.TOP:
            n = node.top;
            break;

        case TraversalDirection.BOTTOM:
            n = node.bottom;
            break;

        case TraversalDirection.LEFT:
            n = node.left;
            break;

        case TraversalDirection.RIGHT:
            n = node.right;
            break;
        }
        return(n);
    }
コード例 #9
0
    private void MovingObstacle()
    {
        int count = 20;
        TraversalDirection direction = TraversalDirection.LEFT;
        GridNode           node      = CheckforScopeToMove(direction, count);

        if (node == null)
        {
            direction = TraversalDirection.RIGHT;
            node      = CheckforScopeToMove(direction, count);
        }
        if (node == null)
        {
            direction = TraversalDirection.TOP;
            node      = CheckforScopeToMove(direction, count);
        }
        if (node == null)
        {
            direction = TraversalDirection.BOTTOM;
            node      = CheckforScopeToMove(direction, count);
        }
        if (node != null)
        {
            GameObject movingObs = gridManager.InstantiateObstacle(staticObstacleprefab_0, node, PoolManager.GetInstance().GetPoolContainer(false));
            SnakeBlock block     = movingObs.AddComponent <SnakeBlock>();
            StartCoroutine(MoveObstacle(block, node, direction, count));
        }
    }
コード例 #10
0
 internal void SetNewLocation(NativeString64 roadId, int laneSectionIdx, int laneId,
                              TraversalDirection direction)
 {
     RoadId         = roadId;
     LaneSectionIdx = laneSectionIdx;
     LaneId         = laneId;
     Direction      = direction;
     if (!AllRoadIds.HasBeenTraversed(roadId))
     {
         AllRoadIds.Traverse(roadId);
     }
 }
コード例 #11
0
        private static int GetNextLaneId(Lane laneCurrent, TraversalDirection direction)
        {
            var links = direction == TraversalDirection.Forward ? laneCurrent.link.successors : laneCurrent.link.predecessors;

            // Check to see if current lane terminates
            if (!links.Any())
            {
                // Zero is guaranteed to never be a valid lane value as the center is not a drivable lane
                return(0);
            }

            // TODO: We need to deal with the fact that sometimes there will be multiple connections
            return(links.First());
        }
コード例 #12
0
        public IEnumerable <T> GetEnumerable(TraversalMode mode, TraversalDirection direction)
        {
            switch (mode)
            {
            case TraversalMode.DepthFirst:
                return(DepthFirstEnumerable(direction));

            case TraversalMode.BreadthFirst:
                return(BreadthFirstEnumerable(direction));

            default:
                return(null);
            }
        }
コード例 #13
0
    TraversalDirection GetReverseDirection(TraversalDirection dir)
    {
        switch (dir)
        {
        case TraversalDirection.LEFT: return(TraversalDirection.RIGHT);

        case TraversalDirection.RIGHT: return(TraversalDirection.LEFT);

        case TraversalDirection.TOP: return(TraversalDirection.BOTTOM);

        case TraversalDirection.BOTTOM: return(TraversalDirection.TOP);
        }
        return(TraversalDirection.NONE);
    }
コード例 #14
0
        private Cube traverseIterative(Point start, ref bool[,] visited, System.Drawing.Color color, Cube cube = null)
        {
            TraversalDirection direction = TraversalDirection.None;
            Cube current = cube ?? new Cube();

            direction = traversePixels(ref start, visited, color, current);

            while (direction != TraversalDirection.None)
            {
                direction = traversePixels(ref start, visited, color, current);
            }

            return(current);
        }
コード例 #15
0
    private GridNode CheckforScopeToMove(TraversalDirection dir, int count)
    {
        GridNode node = gridManager.GetRandomPosition();
        GridNode n    = node;

        for (int i = 0; i < count; i++)
        {
            node = gridManager.GetNextNode(node, dir);
            if (node.isFilled)
            {
                return(null);
            }
        }
        return(n);
    }
コード例 #16
0
ファイル: GameManager.cs プロジェクト: lokeshs26gp/3D-Snake
    private void GetInputFromPlayer(DIRECTION dir, Vector3 start, Vector3 end)
    {
        switch (dir)
        {
        case DIRECTION.UP:
            if (currentDirection != TraversalDirection.BOTTOM)
            {
                currentDirection = TraversalDirection.TOP;
            }
            goto default;

        case DIRECTION.DOWN:
            if (currentDirection != TraversalDirection.TOP)
            {
                currentDirection = TraversalDirection.BOTTOM;
            }
            goto default;

        case DIRECTION.LEFT:
            if (currentDirection != TraversalDirection.RIGHT)
            {
                currentDirection = TraversalDirection.LEFT;
            }
            goto default;

        case DIRECTION.RIGHT:
            if (currentDirection != TraversalDirection.LEFT)
            {
                currentDirection = TraversalDirection.RIGHT;
            }
            goto default;

        default:
            //VFX
            if (GameState == GAMESTATE.INITILIZECOMPLETE)
            {
                snakeController.SetPosition(currentNode);
                GameState = GAMESTATE.GAMEPLAY;
            }
            VFXManager.OnInputLineVFX(start, end);
            break;
        }
    }
コード例 #17
0
        public override FocusNode findFirstFocusInDirection(FocusNode currentNode, TraversalDirection direction)
        {
            D.assert(direction != null);
            D.assert(currentNode != null);
            switch (direction)
            {
            case TraversalDirection.up:
                return(_sortAndFindInitial(currentNode, vertical: true, first: false));

            case TraversalDirection.down:
                return(_sortAndFindInitial(currentNode, vertical: true, first: true));

            case TraversalDirection.left:
                return(_sortAndFindInitial(currentNode, vertical: false, first: false));

            case TraversalDirection.right:
                return(_sortAndFindInitial(currentNode, vertical: false, first: true));
            }
            return(null);
        }
コード例 #18
0
        internal static void BuildSamplesInsideLaneSection(
            EcsRoadData road, int laneId, int numSamplesSection, int outputIdx, TraversalDirection samplingDirection,
            ref SamplingStateEcsRoad samplingState, ref NativeArray <PointSampleGlobal> samplesOut)
        {
            var numSamplesOut    = samplesOut.Length;
            var numEdgesToSample = math.abs(laneId);
            var numSamplesEdge   = numEdgesToSample == 0 ? numSamplesOut : numSamplesOut * numEdgesToSample;
            // We will need to sample the center line as well, if we are not between two lane edges
            var shouldSampleCenter = numEdgesToSample <= 1;
            var samplesEdges       = new NativeArray <PointSampleGlobal>(numSamplesEdge, Allocator.Temp);
            var side         = ToSide(laneId);
            var sectionStart = samplingDirection == TraversalDirection.Forward ? outputIdx : numSamplesSection + outputIdx - 1;

            for (var sampleNum = 0; sampleNum < numSamplesSection; sampleNum++)
            {
                var sampleIdx = sectionStart + sampleNum * (int)samplingDirection;
                var sRoad     = samplingState.sRoadLastComputed;
                SampleLanesOneSide(road, samplingState, side, sRoad, sampleIdx, ref samplesEdges,
                                   numEdgesToSample);
                // Lane index is lane ID - 1 because ID's start at 1, not 0
                var            laneSampleIdx = ComputeLaneSampleIdx(numEdgesToSample - 1, numSamplesOut, sampleIdx);
                var            poseOuterEdge = samplesEdges[laneSampleIdx].pose;
                RigidTransform poseInnerEdge;
                if (shouldSampleCenter)
                {
                    poseInnerEdge = SampleCenter(road, samplingState, sRoad).pose;
                }
                else
                {
                    var innerEdgeIdx = ComputeLaneSampleIdx(numEdgesToSample - 2, numSamplesOut, sampleIdx);
                    poseInnerEdge = samplesEdges[innerEdgeIdx].pose;
                }
                var positionMean = math.lerp(poseInnerEdge.pos, poseOuterEdge.pos, 0.5f);
                var rotationMean = math.nlerp(poseInnerEdge.rot, poseOuterEdge.rot, 0.5f);
                samplesOut[sampleIdx] = new PointSampleGlobal(rotationMean, positionMean);

                samplingState.Step(road);
            }

            samplesEdges.Dispose();
        }
コード例 #19
0
    IEnumerator MoveObstacle(SnakeBlock block, GridNode node, TraversalDirection dir, int moveCount)
    {
        int count = 0;

        while (_cacheState == GAMESTATE.INITILIZECOMPLETE || _cacheState == GAMESTATE.GAMEPLAY)
        {
            if (count >= moveCount)
            {
                count = 0;
                dir   = GetReverseDirection(dir);
            }
            node = gridManager.GetNextNode(node, dir);
            if (node.isFilled)
            {
                GameManager.OnGameStateChangeByOther(GAMESTATE.GAMEEND);
            }
            block.SetPosition(node);
            count++;
            yield return(new WaitForSeconds((1 / movingObstaclespeed)));
        }
    }
コード例 #20
0
        private IEnumerable <T> DepthFirstEnumerable(TraversalDirection direction)
        {
            if (direction == TraversalDirection.TopDown)
            {
                yield return(this as T);
            }

            foreach (var child in _children)
            {
                var childEnumerator = child.DepthFirstEnumerable(direction).GetEnumerator();
                while (childEnumerator.MoveNext())
                {
                    yield return(childEnumerator.Current);
                }
            }

            if (direction == TraversalDirection.BottomUp)
            {
                yield return(this as T);
            }
        }
コード例 #21
0
    bool SubTraversal(GridNode node, TraversalDirection dir, int limit, int traversalCount)
    {
        if (node == null)
        {
            return(false);
        }
        Debug.Log("***********************node" + node.row + "," + node.Column);
        if (node.isFilled)
        {
            return(false);
        }

        if (traversalCount >= limit - 1)
        {
            return(true);
        }

        traversalCount++;

        return(SubTraversal(GetNode(node, dir), dir, limit, traversalCount));
    }
コード例 #22
0
        public void _pushPolicyData(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild)
        {
            _DirectionalPolicyData policyData = _policyData[nearestScope];

            if (policyData != null && !(policyData is _DirectionalPolicyData))
            {
                return;
            }
            _DirectionalPolicyDataEntry newEntry = new _DirectionalPolicyDataEntry(node: focusedChild, direction: direction);

            if (policyData != null)
            {
                policyData.history.Add(newEntry);
            }
            else
            {
                _policyData[nearestScope] = new _DirectionalPolicyData(history: new List <_DirectionalPolicyDataEntry>()
                {
                    newEntry
                });
            }
        }
コード例 #23
0
ファイル: GameManager.cs プロジェクト: lokeshs26gp/3D-Snake
 private bool IsValideMove(TraversalDirection dir)
 {
     currentNode = gridManager.GetNextNode(currentNode, dir);
     if (currentNode == null)
     {
         return(false);
     }
     if (currentNode.isFilled)
     {
         return(false);
     }
     snakeController.SetPosition(currentNode);
     if (fruitNode == currentNode)
     {
         SoundManager.AudioPlayEvent(ConstantsList.Sfx_Collect);
         Score++;
         snakeIntialSpeed -= Time.deltaTime * snakespeedIncreaserate;
         snakeController.GenerateTail();
         gridManager.SetCollectObject(fruitObj, PoolManager.GetInstance().GetPoolContainer(false), false, out fruitNode);
     }
     return(true);
 }
コード例 #24
0
        IEnumerable <DoublyLinkedNode <TElement> > Traverse(TraversalDirection direction)
        {
            if (direction == TraversalDirection.Forwards)
            {
                var enumerator = this.Head;
                while (enumerator != null)
                {
                    yield return(enumerator);

                    enumerator = enumerator.Next;
                }
            }
            else
            {
                var enumerator = this.Tail;
                while (enumerator != null)
                {
                    yield return(enumerator);

                    enumerator = enumerator.Previous;
                }
            }
        }
コード例 #25
0
        public IEnumerable <FocusNode> _sortAndFilterVertically(
            TraversalDirection direction,
            Rect target,
            IEnumerable <FocusNode> nodes)
        {
            List <FocusNode> sorted = nodes.ToList();

            FocusTravesalUtils.mergeSort <FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => a.rect.center.dy.CompareTo(b.rect.center.dy));
            switch (direction)
            {
            case TraversalDirection.up:
                return(LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => node.rect != target && node.rect.center.dy <= target.top)));

            case TraversalDirection.down:
                return(LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => node.rect != target && node.rect.center.dy >= target.bottom)));

            case TraversalDirection.left:
            case TraversalDirection.right:
                break;
            }
            D.assert(direction == TraversalDirection.up || direction == TraversalDirection.down);
            return(null);
        }
コード例 #26
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
 /// <summary>
 /// 
 /// </summary>
 /// <param name="activity"></param>
 /// <param name="dir"></param>
 /// <remarks>Corresponds to SB.2.4 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
 private void ChoiceActivityTraversal(Activity activity, TraversalDirection dir)
 {
     if(dir == TraversalDirection.Forward)
     {
         if(SequencingRulesCheck(activity, activity.Sequencing.PreConditionRules, SequencingRuleAction.StopForwardTraversal))
         {
             throw new SequencingException(SequencingExceptionCode.SB_2_4__1);
         }
     }
     else
     {
         Utilities.Assert(dir == TraversalDirection.Backward);
         if(activity.Parent != null)
         {
             if(activity.Parent.Sequencing.ForwardOnly)
             {
                 throw new SequencingException(SequencingExceptionCode.SB_2_4__2);
             }
         }
         else
         {
             // Cannot walk backward from the root of the activity tree
             throw new SequencingException(SequencingExceptionCode.SB_2_4__3);
         }
     }
 }
コード例 #27
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
            /// <summary>
            /// 
            /// </summary>
            /// <param name="activity"></param>
            /// <param name="dir"></param>
            /// <param name="considerChildren"></param>
            /// <param name="previousDirection"></param>
            /// <param name="newDirection"></param>
            /// <returns></returns>
            /// <remarks>Corresponds to SB.2.1 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
            private Activity FlowTreeTraversal(Activity activity, TraversalDirection dir, bool considerChildren, TraversalDirection previousDirection, out TraversalDirection newDirection)
            {
                bool reversed = false;

                // Test if we have skipped all of the children in a forward only cluster moving backward
                if(previousDirection == TraversalDirection.Backward && activity.Parent != null && activity.Next == null)
                {
                    dir = TraversalDirection.Backward;
                    activity = (Activity)activity.Parent.Children[0];
                    reversed = true;
                }
                if(dir == TraversalDirection.Forward)
                {
                    // Cannot walk off the activity tree
                    if(activity.IsLastActivityInTree)
                    {
                        throw new SequencingException(SequencingExceptionCode.SB_2_1__1);
                    }
                    if(activity.IsLeaf || !considerChildren)
                    {
                        if(activity.Next == null)
                        {
                            // Recursion - Move to the activity's parent's next forward sibling
                            return FlowTreeTraversal(activity.Parent, TraversalDirection.Forward, false, TraversalDirection.NotApplicable, out newDirection);
                        }
                        else
                        {
                            newDirection = dir;
                            return activity.Next;
                        }
                    }
                    else // Entering a cluster - Forward
                    {
                        if(activity.IsLeaf)
                        {
                            throw new SequencingException(SequencingExceptionCode.SB_2_1__2);
                        }
                        ApplyRandomization(activity);
                        newDirection = dir;
                        return (Activity)activity.Children[0];
                    }
                }
                else // direction is backwards
                {
                    Utilities.Assert(dir == TraversalDirection.Backward);

                    if(activity.Parent == null) // Cannot walk off the root of the activity tree
                    {
                        throw new SequencingException(SequencingExceptionCode.SB_2_1__3);
                    }
                    if(activity.IsLeaf || !considerChildren)
                    {
                        if(!reversed) // Only test 'forward only' if we are not going to leave this forward only cluster.
                        {
                            if(activity.Parent.Sequencing.ForwardOnly) // Test the control mode before traversing
                            {
                                throw new SequencingException(SequencingExceptionCode.SB_2_1__4);
                            }
                        }
                        if(activity.Previous == null)
                        {
                            // Recursion - Move to the activity's parent's next backward sibling
                            return FlowTreeTraversal(activity.Parent, TraversalDirection.Backward, false, TraversalDirection.NotApplicable, out newDirection);
                        }
                        else
                        {
                            newDirection = dir;
                            return activity.Previous;
                        }
                    }
                    else // Entering a cluster - Backward
                    {
                        if(activity.IsLeaf)
                        {
                            throw new SequencingException(SequencingExceptionCode.SB_2_1__2);
                        }
                        ApplyRandomization(activity);
                        if(activity.Sequencing.ForwardOnly)
                        {
                            // Start at the beginning of a forward only cluster
                            newDirection = TraversalDirection.Forward;
                            return (Activity)activity.Children[0];
                        }
                        else
                        {
                            // Start at the end of the cluster if we are backing into it
                            newDirection = TraversalDirection.Backward;
                            return (Activity)activity.Children[activity.Children.Count - 1];
                        }
                    }
                }
            }
コード例 #28
0
        public override bool inDirection(FocusNode currentNode, TraversalDirection direction)
        {
            FocusScopeNode nearestScope = currentNode.nearestScope;
            FocusNode      focusedChild = nearestScope.focusedChild;

            if (focusedChild == null)
            {
                FocusNode firstFocus = findFirstFocusInDirection(currentNode, direction) ?? currentNode;
                switch (direction)
                {
                case TraversalDirection.up:
                case TraversalDirection.left:
                    FocusTravesalUtils._focusAndEnsureVisible(
                        firstFocus,
                        alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart
                        );
                    break;

                case TraversalDirection.right:
                case TraversalDirection.down:
                    FocusTravesalUtils._focusAndEnsureVisible(
                        firstFocus,
                        alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd
                        );
                    break;
                }
                return(true);
            }
            if (_popPolicyDataIfNeeded(direction, nearestScope, focusedChild))
            {
                return(true);
            }
            FocusNode       found             = null;
            ScrollableState focusedScrollable = Scrollable.of(focusedChild.context);

            switch (direction)
            {
            case TraversalDirection.down:
            case TraversalDirection.up:
                IEnumerable <FocusNode> eligibleNodes = _sortAndFilterVertically(
                    direction,
                    focusedChild.rect,
                    nearestScope.traversalDescendants
                    );
                if (focusedScrollable != null && !focusedScrollable.position.atEdge())
                {
                    IEnumerable <FocusNode> filteredEligibleNodes = LinqUtils <FocusNode> .WhereList(eligibleNodes, ((FocusNode node) => Scrollable.of(node.context) == focusedScrollable));

                    if (filteredEligibleNodes.Count() != 0)
                    {
                        eligibleNodes = filteredEligibleNodes;
                    }
                }
                if (eligibleNodes.Count() == 0)
                {
                    break;
                }
                List <FocusNode> sorted = eligibleNodes.ToList();
                if (direction == TraversalDirection.up)
                {
                    //sorted = sorted.reversed.toList();
                    sorted.Reverse();
                    sorted = sorted.ToList();
                }
                Rect band = Rect.fromLTRB(focusedChild.rect.left, float.NegativeInfinity, focusedChild.rect.right, float.PositiveInfinity);
                IEnumerable <FocusNode> inBand = LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => !node.rect.intersect(band).isEmpty));

                if (inBand.Count() != 0)
                {
                    found = inBand.First();
                    break;
                }
                FocusTravesalUtils.mergeSort <FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => {
                    return((a.rect.center.dx - focusedChild.rect.center.dx).abs().CompareTo((b.rect.center.dx - focusedChild.rect.center.dx).abs()));
                });
                found = sorted.First();
                break;

            case TraversalDirection.right:
            case TraversalDirection.left:
                eligibleNodes = _sortAndFilterHorizontally(direction, focusedChild.rect, nearestScope);
                if (focusedScrollable != null && !focusedScrollable.position.atEdge())
                {
                    IEnumerable <FocusNode> filteredEligibleNodes = LinqUtils <FocusNode> .WhereList(eligibleNodes, ((FocusNode node) => Scrollable.of(node.context) == focusedScrollable));

                    if (filteredEligibleNodes.Count() != 0)
                    {
                        eligibleNodes = filteredEligibleNodes;
                    }
                }
                if (eligibleNodes.Count() == 0)
                {
                    break;
                }
                sorted = eligibleNodes.ToList();
                if (direction == TraversalDirection.left)
                {
                    sorted.Reverse();
                    sorted = sorted.ToList();
                    //sorted = sorted.reversed.toList();
                }
                band   = Rect.fromLTRB(float.NegativeInfinity, focusedChild.rect.top, float.PositiveInfinity, focusedChild.rect.bottom);
                inBand = LinqUtils <FocusNode> .WhereList(sorted, ((FocusNode node) => !node.rect.intersect(band).isEmpty));

                if (inBand.Count() != 0)
                {
                    found = inBand.First();
                    break;
                }
                FocusTravesalUtils.mergeSort <FocusNode>(sorted, compare: (FocusNode a, FocusNode b) => {
                    return((a.rect.center.dy - focusedChild.rect.center.dy).abs().CompareTo((b.rect.center.dy - focusedChild.rect.center.dy).abs()));
                });
                found = sorted.First();
                break;
            }
            if (found != null)
            {
                _pushPolicyData(direction, nearestScope, focusedChild);
                switch (direction)
                {
                case TraversalDirection.up:
                case TraversalDirection.left:
                    FocusTravesalUtils._focusAndEnsureVisible(
                        found,
                        alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtStart
                        );
                    break;

                case TraversalDirection.down:
                case TraversalDirection.right:
                    FocusTravesalUtils._focusAndEnsureVisible(
                        found,
                        alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd
                        );
                    break;
                }
                return(true);
            }
            return(false);
        }
コード例 #29
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
            /// <summary>
            /// 
            /// </summary>
            /// <param name="activity"></param>
            /// <param name="dir"></param>
            /// <param name="previousDirection"></param>
            /// <returns></returns>
            /// <remarks>Corresponds to SB.2.2 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
            private Activity FlowActivityTraversal(Activity activity, TraversalDirection dir, TraversalDirection previousDirection)
            {
                Resources.Culture = LocalizationManager.GetCurrentCulture();
                if(!activity.Parent.Sequencing.Flow)
                {
                    throw new SequencingException(SequencingExceptionCode.SB_2_2__1);
                }
                if(SequencingRulesCheck(activity, activity.Sequencing.PreConditionRules, SequencingRuleAction.Skip))
                {
                    m_navigator.LogSequencing(SequencingEventType.IntermediateNavigation, m_command, Resources.SequencingPreConditionSkipped, activity.Key);
                    TraversalDirection newDirection;
                    Activity newActivity = FlowTreeTraversal(activity, dir, false, previousDirection, out newDirection);
                    m_navigator.LogSequencing(SequencingEventType.IntermediateNavigation, m_command, Resources.SequencingFlowingTo, newActivity.Key);

                    // Make sure the recursive call is considers the correct direction
                    if(previousDirection == TraversalDirection.Backward && newDirection == TraversalDirection.Backward)
                    {
                        // Recursive call - make sure the "next" activity is OK
                        newActivity = FlowActivityTraversal(newActivity, newDirection, TraversalDirection.NotApplicable);
                    }
                    else
                    {
                        // Recursive call - make sure the "next" activity is OK
                        newActivity = FlowActivityTraversal(newActivity, newDirection, previousDirection);
                    }
                    return newActivity;
                }
                if(CheckActivity(activity))
                {
                    throw new SequencingException(SequencingExceptionCode.SB_2_2__2);
                }
                if(!activity.IsLeaf)
                {
                    TraversalDirection newDirection;
                    Activity newActivity = FlowTreeTraversal(activity, dir, true, TraversalDirection.NotApplicable, out newDirection);
                    m_navigator.LogSequencing(SequencingEventType.IntermediateNavigation, m_command, Resources.SequencingFlowingTo, newActivity.Key);

                    // Check if we are flowing backward through a forward only cluster - must move forward instead
                    if(dir == TraversalDirection.Backward && newDirection == TraversalDirection.Forward)
                    {
                        // Recursive call - make sure the "next" activity is OK
                        newActivity = FlowActivityTraversal(newActivity, TraversalDirection.Forward, TraversalDirection.Backward);
                    }
                    else
                    {
                        // Recursive call - make sure the "next" activity is OK
                        newActivity = FlowActivityTraversal(newActivity, dir, TraversalDirection.NotApplicable);
                    }
                    return newActivity;
                }
                return activity;
            }
コード例 #30
0
        public bool _popPolicyDataIfNeeded(TraversalDirection direction, FocusScopeNode nearestScope, FocusNode focusedChild)
        {
            _DirectionalPolicyData policyData = _policyData[nearestScope];

            if (policyData != null && policyData.history.isNotEmpty() && policyData.history.First().direction != direction)
            {
                if (policyData.history.Last().node.parent == null)
                {
                    invalidateScopeData(nearestScope);
                    return(false);
                }
                bool popOrInvalidate(TraversalDirection _direction)
                {
                    FocusNode lastNode = policyData.history.removeLast().node;

                    if (Scrollable.of(lastNode.context) != Scrollable.of(FocusManagerUtils.primaryFocus.context))
                    {
                        invalidateScopeData(nearestScope);
                        return(false);
                    }
                    ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicitPolicy;

                    switch (_direction)
                    {
                    case TraversalDirection.up:
                    case TraversalDirection.left:
                        alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtStart;
                        break;

                    case TraversalDirection.right:
                    case TraversalDirection.down:
                        alignmentPolicy = ScrollPositionAlignmentPolicy.keepVisibleAtEnd;
                        break;
                    }
                    FocusTravesalUtils._focusAndEnsureVisible(
                        lastNode,
                        alignmentPolicy: alignmentPolicy
                        );
                    return(true);
                }

                switch (direction)
                {
                case TraversalDirection.down:
                case TraversalDirection.up:
                    switch (policyData.history.First().direction)
                    {
                    case TraversalDirection.left:
                    case TraversalDirection.right:
                        invalidateScopeData(nearestScope);
                        break;

                    case TraversalDirection.up:
                    case TraversalDirection.down:
                        if (popOrInvalidate(direction))
                        {
                            return(true);
                        }
                        break;
                    }
                    break;

                case TraversalDirection.left:
                case TraversalDirection.right:
                    switch (policyData.history.First().direction)
                    {
                    case TraversalDirection.left:
                    case TraversalDirection.right:
                        if (popOrInvalidate(direction))
                        {
                            return(true);
                        }
                        break;

                    case TraversalDirection.up:
                    case TraversalDirection.down:
                        invalidateScopeData(nearestScope);
                        break;
                    }
                    break;
                }
            }
            if (policyData != null && policyData.history.isEmpty())
            {
                invalidateScopeData(nearestScope);
            }
            return(false);
        }
コード例 #31
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
 /// <summary>
 /// 
 /// </summary>
 /// <param name="activity"></param>
 /// <param name="dir"></param>
 /// <param name="considerChildren"></param>
 /// <returns></returns>
 /// <remarks>Corresponds to SB.2.3 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
 private Activity Flow(Activity activity, TraversalDirection dir, bool considerChildren)
 {
     TraversalDirection newDirection;
     Resources.Culture = LocalizationManager.GetCurrentCulture();
     activity = FlowTreeTraversal(activity, dir, considerChildren, TraversalDirection.NotApplicable, out newDirection);
     m_navigator.LogSequencing(SequencingEventType.IntermediateNavigation, m_command, Resources.SequencingFlowingTo, activity.Key);
     return FlowActivityTraversal(activity, dir, TraversalDirection.NotApplicable);
 }
コード例 #32
0
 public abstract bool inDirection(FocusNode currentNode, TraversalDirection direction);
コード例 #33
0
 public abstract FocusNode findFirstFocusInDirection(FocusNode currentNode, TraversalDirection direction);
コード例 #34
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
 /// <summary>
 /// 
 /// </summary>
 /// <param name="activity"></param>
 /// <param name="dir"></param>
 /// <returns></returns>
 /// <remarks>Corresponds to SB.2.9.2 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
 Activity ChoiceFlowTreeTraversal(Activity activity, TraversalDirection dir)
 {
     if(dir == TraversalDirection.Forward)
     {
         if(activity.IsLastActivityInTree)
         {
             return null;
         }
         if(activity.Next == null)
         {
             if(activity.Parent == null)
             {
                 return null;
             }
             return ChoiceFlowTreeTraversal(activity.Parent, TraversalDirection.Forward);
         }
         return activity.Next;
     }
     else
     {
         Utilities.Assert(dir == TraversalDirection.Backward);
         if(activity == m_navigator.RootActivity)
         {
             return null;
         }
         if(activity.Previous == null)
         {
             return ChoiceFlowTreeTraversal(activity.Parent, TraversalDirection.Backward);
         }
         return activity.Previous;
     }
 }
コード例 #35
0
 private void SetupMeasurement()
 {
     NextMeasure = Measurements.Left;
     Direction = TraversalDirection.Right;
 }
コード例 #36
0
        private static void RemoveContiguousWhitespace(IntermediateNodeCollection nodes, TraversalDirection direction)
        {
            var position = direction == TraversalDirection.Forwards ? 0 : nodes.Count - 1;

            while (position >= 0 && position < nodes.Count)
            {
                var  node = nodes[position];
                bool shouldRemoveNode;
                bool shouldContinueIteration;

                switch (node)
                {
                case IntermediateToken intermediateToken:
                    shouldRemoveNode        = string.IsNullOrWhiteSpace(intermediateToken.Content);
                    shouldContinueIteration = shouldRemoveNode;
                    break;

                case HtmlContentIntermediateNode htmlContentIntermediateNode:
                    RemoveContiguousWhitespace(htmlContentIntermediateNode.Children, direction);
                    shouldRemoveNode        = htmlContentIntermediateNode.Children.Count == 0;
                    shouldContinueIteration = shouldRemoveNode;
                    break;

                case MarkupElementIntermediateNode _:
                case CSharpExpressionIntermediateNode _:
                case TagHelperIntermediateNode _:
                    // These node types may produce non-whitespace output at runtime
                    shouldRemoveNode        = false;
                    shouldContinueIteration = false;
                    break;

                case CSharpCodeIntermediateNode codeIntermediateNode:
                    shouldRemoveNode        = false;
                    shouldContinueIteration = false;
                    break;

                default:
                    shouldRemoveNode        = false;
                    shouldContinueIteration = true;     // Because other types of nodes don't produce output
                    break;
                }

                if (shouldRemoveNode)
                {
                    nodes.RemoveAt(position);
                    if (direction == TraversalDirection.Forwards)
                    {
                        position--;
                    }
                }

                position += direction == TraversalDirection.Forwards ? 1 : -1;

                if (!shouldContinueIteration)
                {
                    break;
                }
            }
        }
コード例 #37
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
 /// <summary>
 /// 
 /// </summary>
 /// <param name="activity"></param>
 /// <param name="dir"></param>
 /// <returns></returns>
 /// <remarks>Corresponds to SB.2.9.1 in the SCORM 2004 Sequencing/Navigation manual, appendix C.</remarks>
 Activity ChoiceFlow(Activity activity, TraversalDirection dir)
 {
     Activity a = ChoiceFlowTreeTraversal(activity, dir);
     if(a == null)
     {
         return activity;
     }
     return a;
 }
コード例 #38
0
        private void ContinueTraversal()
        {
            RadialDistanceMeasure currentMeasure = NextMeasure;
            if (Direction == TraversalDirection.Left)
                NextMeasure = currentMeasure.LeftNeighbour;
            else
                NextMeasure = currentMeasure.RightNeighbour;

            if (NextMeasure == null)
            {
                Direction = (Direction == TraversalDirection.Left) ? TraversalDirection.Right : TraversalDirection.Left;
                NextMeasure = currentMeasure;
                ContinueTraversal();
                return;
            }

            ServoBrick.SetPosition(ServoId, ConvertToServoAngle(NextMeasure.Angle));
        }