コード例 #1
0
        /// <summary>
        /// This method is used to draw the snake path and applying effects to them.
        /// </summary>
        public void DrawCurve()
        {
            // Remove any previous curves.
            // Make a path.
            if (_startPoint != null && _endPoint != null)
            {
                List <Point> ptArr = CreatePathPoints(_startPoint, _endPoint);
                MakeCurve(ptArr, 100);
                System.Windows.Media.Effects.BlurEffect blurEffect2 = new System.Windows.Media.Effects.BlurEffect();
                blurEffect2.Radius     = 3;
                blurEffect2.KernelType = System.Windows.Media.Effects.KernelType.Gaussian;
                SnakePath.Effect       = blurEffect2;

                SnakePath.Clone(ref InnerSnakePath);
                InnerSnakePath.Stroke = Brushes.DarkRed;
                System.Windows.Media.Effects.BlurEffect blurEffect0 = new System.Windows.Media.Effects.BlurEffect();
                blurEffect0.Radius     = 2;
                blurEffect0.KernelType = System.Windows.Media.Effects.KernelType.Gaussian;
                InnerSnakePath.Effect  = blurEffect0;

                SnakePath.Clone(ref CenterSnakePath);
                CenterSnakePath.Stroke = Brushes.DarkOliveGreen;
                System.Windows.Media.Effects.BlurEffect blurEffect1 = new System.Windows.Media.Effects.BlurEffect();
                blurEffect1.Radius     = 1;
                blurEffect1.KernelType = System.Windows.Media.Effects.KernelType.Gaussian;
                CenterSnakePath.Effect = blurEffect1;

                DrawTongue();
                DrawEyes();
                DrawTail();
                UpdateLayout();
            }
        }
コード例 #2
0
        /// <summary>
        /// Copy the snake path data and revert it
        /// </summary>
        private void RevertSnakePath(Vector3 revertDirection, SnakePath copyPath)
        {
            SnakePath emptySnakepath = ScriptableObject.CreateInstance <SnakePath>();
            string    fileName       = copyPath.name + "_Clone.asset";

            AssetDatabase.CreateAsset(emptySnakepath, EventFlag.Path.SnakePathSRPFolder + fileName);

            int pointCount = copyPath.PointCount;

            for (int i = 0; i < pointCount; i++)
            {
                float yOffset    = creator.YAxisConstraints.y - copyPath[i].y;
                float revertYPos = creator.YAxisConstraints.x + yOffset;

                float xOffset    = creator.XAxisConstraints.y - copyPath[i].x;
                float revertXPos = creator.XAxisConstraints.x + xOffset;

                var revertPath = new Vector3((revertDirection.x == -1) ? revertXPos : copyPath[i].x,
                                             (revertDirection.y == -1) ? revertYPos : copyPath[i].y,
                                             copyPath[i].z
                                             );

                emptySnakepath.Push(revertPath);
            }

            var snakeCreator = GUtil.UtilityMethod.CreateObjectToParent <SnakePathCreator>(creator.transform.parent, creator.transform.gameObject);

            snakeCreator.transform.position = creator.transform.position;
            snakeCreator.SetSnakePath(emptySnakepath);

            AssetDatabase.SaveAssets();
        }
コード例 #3
0
        public void SetSnakePath(SnakePath snakePath)
        {
            if (_snakeMesh == null)
            {
                return;
            }
            _snakePath = snakePath;

            RenderPathLayoutToMesh();
        }
コード例 #4
0
        private SnakeMesh SpawnSnakeMesh(Types.LevelComponent component)
        {
            SnakeMesh spawnEmptySnake = UtilityMethod.CreateObjectToParent <SnakeMesh>(SnakeHolder, snakePrefab.gameObject);

            SnakePath snakePathData = LevelSRP.GetSnakePath(component.value);

            if (snakePathData != null)
            {
                spawnEmptySnake.SetUp();
                spawnEmptySnake.SetSnakePath(snakePathData, false);
                spawnEmptySnake.RenderMesh();

                spawnEmptySnake.transform.position = new Vector3(snakePathData.OffsetPosition.x, -0.8f, default_distance - snakePathData[0].z);
            }

            return(spawnEmptySnake);
        }
コード例 #5
0
        public void SmoothCtrlPoints(int startIndex, int endIndex)
        {
            for (int i = startIndex; i <= endIndex; i += 3)
            {
                if (i <= 0 || i >= snakePath.PointCount - 1 || !SnakePath.IsAnchorPoint(i))
                {
                    continue;
                }

                Vector3 anchorFaceDir    = (snakePath[i + 3] - snakePath[i - 3]).normalized;
                float   halfPreviousDist = Vector3.Distance(snakePath[i - 3], snakePath[i]) * 0.5f;
                float   halfForwardDist  = Vector3.Distance(snakePath[i + 3], snakePath[i]) * 0.5f;

                //Debug.Log($"index {i},halfPreviousDist {halfPreviousDist}, halfForwardDist {halfForwardDist}");

                snakePath.ForceUpdate(snakePath[i] - (anchorFaceDir * halfPreviousDist), (i - 1));
                snakePath.ForceUpdate(snakePath[i] + (anchorFaceDir * halfForwardDist), (i + 1));
            }
        }
コード例 #6
0
ファイル: Snake.cs プロジェクト: bschug/CLaUn.vs.SnaKe
	public IEnumerator Spawn (float delay) {
		yield return new WaitForSeconds( delay );
		CurrentPath = SnakePathRegistry.Instance.GetUnusedPath();
		SnakePathRegistry.Instance.LockPath( CurrentPath );

		CurrentPath.ShowDigAtStart();
		yield return new WaitForSeconds( BalanceValues.Instance.SnakeSpawnDigDelay );
		SoundManager.Instance.SnakeSpawned();

		var SpawnQueue = new Queue<SnakeSegment>( Segments );
		while (SpawnQueue.Count > 0) {
			var nextSegment = SpawnQueue.Dequeue();
			nextSegment.transform.position = CurrentPath.StartPosition;
			nextSegment.gameObject.SetActive( true );
			nextSegment.Path = CurrentPath;
			while (nextSegment.transform.position == CurrentPath.StartPosition) {
				yield return null;
			}
		}

		CurrentPath.HideDigAtStart();
	}
コード例 #7
0
        void Draw(Event guiEvent)
        {
            if (creator.snakePath != null)
            {
                creator.snakePath.OffsetPosition = creator.transform.position;

                for (int i = 0; i < creator.snakePath.NumSegments; i++)
                {
                    Vector3[] points = creator.snakePath.GetPointsInSegment(i);
                    points = ConvertArrayToWorldPos(points);

                    Handles.color = Color.black;

                    Vector3 worldPos = ConvertToWorldPos(creator.snakePath[i]);
                    Vector3 newPos   = Handles.FreeMoveHandle(worldPos, Quaternion.identity, .2f, _snap, Handles.CylinderHandleCap);

                    Handles.DrawLine(points[1], (points[0]));
                    Handles.DrawLine(points[2], (points[3]));

                    Color bezierColor = (i == lastBezierSegmentInfo.SegmentIndex) ? Color.yellow : Color.green;

                    if (i == lastBezierSegmentInfo.SegmentIndex)
                    {
                        Handles.color = Color.red;
                        Handles.SphereHandleCap(0, lastBezierSegmentInfo.Position, Quaternion.identity, 0.2f, EventType.Repaint);
                    }

                    Handles.DrawBezier(points[0], points[3], points[1], points[2], bezierColor, null, 2);
                }


                for (int i = 0; i < creator.snakePath.PointCount; i++)
                {
                    bool isAnchorP = SnakePath.IsAnchorPoint(i);
                    Handles.color = (isAnchorP) ? Color.red : Color.blue;

                    Vector3 worldPos = ConvertToWorldPos(creator.snakePath[i]);
                    Vector3 newPos   = Handles.FreeMoveHandle(worldPos, Quaternion.identity, .2f, _snap, Handles.CylinderHandleCap);

                    Vector3 LocalPos = ConvertToLocalPos(newPos);

                    if (isAnchorP)
                    {
                        LocalPos = ClampPositionToConstraint(LocalPos);
                    }


                    //Move Anchor Around
                    if (creator.snakePath[i] != LocalPos && (!creator.enableAutoContorlPoint || ((creator.enableAutoContorlPoint && isAnchorP) ||
                                                                                                 //The first / last control point leave to player to decide
                                                                                                 i <= 1 || i >= creator.snakePath.PointCount - 2)))
                    {
                        Undo.RecordObject(creator.snakePath, "Move point");

                        creator.snakePath.UpdateAnchor(LocalPos, i);

                        if (creator.enableAutoContorlPoint)
                        {
                            AutoSetControlPointIfEnable(i);
                        }
                    }
                }
            }
        }