Пример #1
0
            private int InterpolateCorner(Vector2 position, Color[] colors, bool[] validFlags)
            {
                var result = 0;

                var xIndex = Array.BinarySearch <float>(xThresholds, position.x);
                var yIndex = Array.BinarySearch <float>(yThresholds, position.y);
                var index  = xIndex + yIndex * xThresholds.Length;

                if (!validFlags[index])
                {
                    var nearestKey = material.keys.OrderBy(x => (x.position - position).sqrMagnitude)
                                     .First();
                    var nearestXIndex = Array.BinarySearch <float>(xThresholds, nearestKey.position.x);
                    var nearestYIndex = Array.BinarySearch <float>(yThresholds, nearestKey.position.y);

                    for (int y = Mathf.Min(yIndex, nearestYIndex), yMax = Mathf.Max(yIndex, nearestYIndex) + 1; y < yMax; ++y)
                    {
                        for (int x = Mathf.Min(xIndex, nearestXIndex), xMax = Mathf.Max(xIndex, nearestXIndex) + 1; x < xMax; ++x)
                        {
                            var i = x + y * xThresholds.Length;
                            if (!validFlags[i])
                            {
                                colors[i]     = nearestKey.color;
                                validFlags[i] = true;
                                ++result;
                            }
                        }
                    }
                }

                return(result);
            }
Пример #2
0
        private void ModifyRectangle(VertexHelper vh, List <UIVertex> vertices, int[] rectangleIndices, GradationMaterial.Grid grid, Vector3[] localCorners, BaseTextMapping textMapping)
        {
            var rectangleVertices           = rectangleIndices.Select(x => vertices[x]).ToArray();
            var rectangleNormalizePositions = new Vector2[rectangleVertices.Length];

            for (int i = 0, iMax = rectangleVertices.Length; i < iMax; ++i)
            {
                rectangleNormalizePositions[i] = new Vector2(Mathf.InverseLerp(localCorners[(int)RectangleIndex.UpperLeft].x, localCorners[(int)RectangleIndex.LowerRight].x, rectangleVertices[i].position.x)
                                                             , Mathf.InverseLerp(localCorners[(int)RectangleIndex.LowerRight].y, localCorners[(int)RectangleIndex.UpperLeft].y, rectangleVertices[i].position.y)
                                                             );
            }

            GradationMaterial.Grid gridUnit = textMapping.GetGridUnit(rectangleIndices, rectangleNormalizePositions);

            var xMin = Array.BinarySearch <float>(gridUnit.xThresholds, rectangleNormalizePositions[(int)RectangleIndex.UpperLeft].x);

            if (xMin < 0)
            {
                xMin = ~xMin - 1;
            }
            var xMax = Array.BinarySearch <float>(gridUnit.xThresholds, rectangleNormalizePositions[(int)RectangleIndex.LowerRight].x);

            if (xMax < 0)
            {
                xMax = ~xMax;
            }
            var yMin = Array.BinarySearch <float>(gridUnit.yThresholds, rectangleNormalizePositions[(int)RectangleIndex.UpperLeft].y);

            if (yMin < 0)
            {
                yMin = ~yMin - 1;
            }
            var yMax = Array.BinarySearch <float>(gridUnit.yThresholds, rectangleNormalizePositions[(int)RectangleIndex.LowerRight].y);

            if (yMax < 0)
            {
                yMax = ~yMax;
            }

            for (int y = yMin; y < yMax; ++y)
            {
                for (int x = xMin; x < xMax; ++x)
                {
                    ModifyRectangleGrid(vh, rectangleVertices, gridUnit, x, y, rectangleNormalizePositions);
                }
            }
        }
Пример #3
0
        private void ModifyTriangle(VertexHelper vh, List <UIVertex> vertices, int[] triangleIndices, GradationMaterial.Grid grid, Vector3[] localCorners)
        {
            var triangleVertices           = triangleIndices.Select(x => vertices[x]).ToArray();
            var triangleNormalizePositions = new Vector2[triangleVertices.Length];

            for (int i = 0, iMax = triangleVertices.Length; i < iMax; ++i)
            {
                triangleNormalizePositions[i] = new Vector2(Mathf.InverseLerp(localCorners[(int)RectangleIndex.UpperLeft].x, localCorners[(int)RectangleIndex.LowerRight].x, triangleVertices[i].position.x)
                                                            , Mathf.InverseLerp(localCorners[(int)RectangleIndex.LowerRight].y, localCorners[(int)RectangleIndex.UpperLeft].y, triangleVertices[i].position.y)
                                                            );
            }

            var xMin = Array.BinarySearch <float>(grid.xThresholds, triangleNormalizePositions.Min(x => x.x));

            if (xMin < 0)
            {
                xMin = ~xMin - 1;
            }
            var xMax = Array.BinarySearch <float>(grid.xThresholds, triangleNormalizePositions.Max(x => x.x));

            if (xMax < 0)
            {
                xMax = ~xMax;
            }
            var yMin = Array.BinarySearch <float>(grid.yThresholds, triangleNormalizePositions.Min(x => x.y));

            if (yMin < 0)
            {
                yMin = ~yMin - 1;
            }
            var yMax = Array.BinarySearch <float>(grid.yThresholds, triangleNormalizePositions.Max(x => x.y));

            if (yMax < 0)
            {
                yMax = ~yMax;
            }

            for (int y = yMin; y < yMax; ++y)
            {
                for (int x = xMin; x < xMax; ++x)
                {
                    ModifyTriangleGrid(vh, triangleVertices, grid, x, y, triangleNormalizePositions);
                }
            }
        }
Пример #4
0
        public void CheckAnswer()
        {
            // Logic for checking answer
            if (gameWordsUIManager.GetCellStatus() == CellStatus.PARTIALY_FILLED)
            {
                instructionSoundManager.PlayPartiallyReactionSound("GameWords");
            }
            bool result;

            userInput = GetInputFromUser();
            string[] temp;
            int      ansIndex = 0;

            if (!userInput.Contains(" ") && words [missionID].AnswersDict.TryGetValue((int)LevelComplexity, out temp))
            {
                ansIndex = Array.BinarySearch(temp, userInput);
            }
            if (ansIndex > 0)
            {
                Debug.Log("ANSWER IS CORRECT -> " + ansIndex);
                result = true;
                instructionSoundManager.PlayRightCombinationSound("GameWords");
                gameWordsUIManager.UpdateStarManager(currentQuestionIndex, result);
                currentQuestionIndex++;
            }
            else
            {
                Debug.Log("ANSWER IS WRONG -> " + ansIndex);
                instructionSoundManager.PlayWrongCombinationSound("GameWords");
                if (maxAttempts > 0)
                {
                    maxAttempts--;
                }
                if (maxAttempts == 0)
                {
                    currentQuestionIndex++;
                }
                result = false;
            }
            if (onAnswerChecked != null)
            {
                onAnswerChecked(result);
            }
        }
Пример #5
0
            private Color[] GetColors()
            {
                var keysCount = xThresholds.Length * yThresholds.Length;

                if (material.keys.Count == 0)
                {
                    //有点キーが無いなら
                    return(Enumerable.Repeat(Color.white, keysCount).ToArray());
                }

                var validFlags = new bool[keysCount];
                var emptyCount = keysCount;
                var result     = new Color[keysCount];

                //有点キー設定
                foreach (var key in material.keys)
                {
                    var xIndex = Array.BinarySearch <float>(xThresholds, key.position.x);
                    var yIndex = Array.BinarySearch <float>(yThresholds, key.position.y);
                    var index  = xIndex + yIndex * xThresholds.Length;
                    result[index]     = key.color;
                    validFlags[index] = true;
                    --emptyCount;
                }

                if (emptyCount == 0)
                {
                    return(result);
                }

                //角の無点キー補間
                emptyCount -= InterpolateCorner(new Vector2(0.0f, 0.0f), result, validFlags);
                emptyCount -= InterpolateCorner(new Vector2(1.0f, 0.0f), result, validFlags);
                emptyCount -= InterpolateCorner(new Vector2(1.0f, 1.0f), result, validFlags);
                emptyCount -= InterpolateCorner(new Vector2(0.0f, 1.0f), result, validFlags);

                if (emptyCount == 0)
                {
                    return(result);
                }

                //外周の無点キー補間
                emptyCount -= InterpolateLine(0
                                              , xThresholds.Length
                                              , 1
                                              , x => xThresholds[x % xThresholds.Length]
                                              , result
                                              , validFlags
                                              );
                emptyCount -= InterpolateLine(xThresholds.Length * (yThresholds.Length - 1)
                                              , keysCount
                                              , 1
                                              , x => xThresholds[x % xThresholds.Length]
                                              , result
                                              , validFlags
                                              );
                emptyCount -= InterpolateLine(0
                                              , keysCount
                                              , xThresholds.Length
                                              , y => yThresholds[y / xThresholds.Length]
                                              , result
                                              , validFlags
                                              );
                emptyCount -= InterpolateLine(xThresholds.Length - 1
                                              , keysCount
                                              , xThresholds.Length
                                              , y => yThresholds[y / xThresholds.Length]
                                              , result
                                              , validFlags
                                              );

                if (emptyCount == 0)
                {
                    return(result);
                }

                //無点キー補間
                for (int i = 0, iMax = keysCount; i < iMax; ++i)
                {
                    emptyCount -= InterpolateCross(i, result, validFlags);
                }

                return(result);
            }