Пример #1
0
        public void AddNewSegment(Point position)
        {
            SnakeSegments.Add(new SnakeSegment(position, Settings.SnakeSegmentSize, false));
            SpeedUp();

            NotifyOfPropertyChange(() => SnakeSegments);
        }
Пример #2
0
        public void AddSegment()
        {
            if (SnakeSegments.Count > 0)
            {
                _score += 100;
            }

            SnakeSegments.Add(new SnakeSegment(_snakeTailSprite, _lastSegmentPosition, _lastSegmentRotation, _lastSegmentDirection));
        }
Пример #3
0
        public void Move()
        {
            for (int i = SnakeSegments.Count - 1; i > 0; i--)
            {
                SnakeSegments[i].Move(SnakeSegments[i - 1].Position);
            }

            //move the head
            Point NewPosition = new Point();

            switch (Direction)
            {
            case Direction.Up:
                NewPosition.Y = SnakeSegments.First().Position.Y - Settings.SnakeSegmentSize;
                NewPosition.X = SnakeSegments.First().Position.X;
                break;

            case Direction.Down:
                NewPosition.Y = SnakeSegments.First().Position.Y + Settings.SnakeSegmentSize;
                NewPosition.X = SnakeSegments.First().Position.X;
                break;

            case Direction.Left:
                NewPosition.X = SnakeSegments.First().Position.X - Settings.SnakeSegmentSize;
                NewPosition.Y = SnakeSegments.First().Position.Y;
                break;

            case Direction.Right:
                NewPosition.X = SnakeSegments.First().Position.X + Settings.SnakeSegmentSize;
                NewPosition.Y = SnakeSegments.First().Position.Y;
                break;

            case Direction.None:
                NewPosition = SnakeSegments.First().Position;
                break;
            }
            SnakeSegments.First().Move(NewPosition);
            NotifyOfPropertyChange(() => SnakeSegments);
        }
Пример #4
0
        public void Update(GameTime gameTime)
        {
            // See if SnakeHead is ready to be moved again
            if (!SnakeHead.CanUpdate())
            {
                return;
            }

            SnakeHead.Direction = LastInputDirection;

            if (SnakeSegments.Count < _segmentCount)
            {
                if (SnakeSegments.Count == 0)
                {
                    _lastSegmentPosition  = SnakeHead.Position;
                    _lastSegmentRotation  = SnakeHead.Direction.ToRadius();
                    _lastSegmentDirection = SnakeDirection.Right;
                }

                AddSegment();
            }

            // Previous position of the SnakeHead before Update
            Vector2        previousSnakeHeadPosition  = SnakeHead.Position;
            float          previousSnakeHeadRotation  = SnakeHead.Rotation;
            SnakeDirection previousSnakeHeadDirection = SnakeHead.Direction;

            // Move Snake Head
            SnakeHead.Update(gameTime);

            Vector2        previousPosition  = Vector2.Zero;
            float          previousRotation  = 0f;
            SnakeDirection previousDirection = SnakeDirection.Right;

            for (int i = 0; i < SnakeSegments.Count; i++)
            {
                bool         isFirstSegment = i == 0;
                bool         isTail         = i == SnakeSegments.Count - 1;
                SnakeSegment currentSegment = SnakeSegments[i];

                currentSegment.Sprite = isTail ? _snakeTailSprite : _straightBodySprite;

                if (isFirstSegment)
                {
                    previousPosition  = currentSegment.Position;
                    previousRotation  = currentSegment.Rotation;
                    previousDirection = currentSegment.Direction;

                    currentSegment.Position  = previousSnakeHeadPosition;
                    currentSegment.Rotation  = previousSnakeHeadRotation;
                    currentSegment.Direction = previousSnakeHeadDirection;
                }
                else
                {
                    Vector2        positionToConsume  = previousPosition;
                    float          rotationToConsume  = previousRotation;
                    SnakeDirection directionToConsume = previousDirection;

                    previousPosition  = currentSegment.Position;
                    previousRotation  = currentSegment.Rotation;
                    previousDirection = currentSegment.Direction;

                    currentSegment.Position  = positionToConsume;
                    currentSegment.Rotation  = rotationToConsume;
                    currentSegment.Direction = directionToConsume;
                }
            }

            for (int i = 0; i < SnakeSegments.Count; i++)
            {
                SnakeDirection previousSegmentDirection;
                SnakeDirection currentSegmentDirection;
                SnakeDirection nextSegmentDirection;

                SnakeSegment currentSegment = SnakeSegments[i];

                currentSegmentDirection  = currentSegment.Direction;
                previousSegmentDirection = i == 0 ? SnakeHead.Direction : SnakeSegments[i - 1].Direction;

                if (i < SnakeSegments.Count - 1)
                {
                    nextSegmentDirection = SnakeSegments[i + 1].Direction;

                    /*
                     * Set correct sprite and rotation based on previous, current, and next segment directions
                     */
                    ApplyAppropriateSpriteAndRotation(ref currentSegment, previousSegmentDirection, currentSegmentDirection, nextSegmentDirection);
                }
                else
                {
                    currentSegment.NoRotation = false;
                    currentSegment.Rotation   = currentSegment.Direction.ToRadius();
                }
            }

            // Save last segment position so that new segments can use it as their starting position
            _lastSegmentPosition = SnakeSegments.Last().Position;

            //// Save last segment position so that new segments can use it as their starting position
            if (SnakeSegments.Count == 1)
            {
                _lastSegmentRotation  = SnakeHead.Rotation;
                _lastSegmentDirection = SnakeHead.Direction;
            }
            else
            {
                _lastSegmentRotation  = SnakeSegments.Last().Rotation;
                _lastSegmentDirection = SnakeSegments.Last().Direction;
            }
        }