public void AddNewSegment(Point position) { SnakeSegments.Add(new SnakeSegment(position, Settings.SnakeSegmentSize, false)); SpeedUp(); NotifyOfPropertyChange(() => SnakeSegments); }
public void AddSegment() { if (SnakeSegments.Count > 0) { _score += 100; } SnakeSegments.Add(new SnakeSegment(_snakeTailSprite, _lastSegmentPosition, _lastSegmentRotation, _lastSegmentDirection)); }
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); }
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; } }