public static PosAndDir GetNewBodyPos(PosAndDir pad) { PosAndDir newpad = new PosAndDir(); newpad.Dir = pad.Dir; const int delta = 18; switch (pad.Dir) { case 0: newpad.X = pad.X - delta; newpad.Y = pad.Y; break; case 1: newpad.X = pad.X + delta; newpad.Y = pad.Y; break; case 2: newpad.Y = pad.Y + delta; newpad.X = pad.X; break; case 3: newpad.Y = pad.Y - delta; newpad.X = pad.X; break; } return(newpad); }
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { KeyboardState keyboardState = Keyboard.GetState(); if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) { Exit(); } GenerateFoodPosition(); PosAndDir oldSnakePosition = snake.snakePosition; snake.Move(); snake.Turn(keyboardState); if (snake.snakePosition.X > Window.ClientBounds.Width - snake.snakeTexture.Width - 1 || snake.snakePosition.X < 0 || snake.snakePosition.Y > Window.ClientBounds.Height - snake.snakeTexture.Height - 1 || snake.snakePosition.Y < 0) { snake.X = 4; } if (Collide()) { Increase(); snake.snakeBody.Add(PosAndDir.Zero); if (snake.BodySize > 1) { for (int i = snake.BodySize - 1; i > 0; i--) { snake.snakeBody[i] = SnakeParam.GetNewBodyPos(snake.snakeBody[i - 1]); } } snake.snakeBody[0] = SnakeParam.GetNewBodyPos(oldSnakePosition); foodPosition = Vector2.Zero; } else { if (snake.BodySize > 1) { for (int i = snake.BodySize - 1; i > 0; i--) { snake.snakeBody[i] = SnakeParam.GetNewBodyPos((snake.snakeBody[i - 1])); } } if (snake.BodySize > 0) { snake.snakeBody[0] = SnakeParam.GetNewBodyPos(oldSnakePosition); } } base.Update(gameTime); }
public SnakeParam() { snakeBody = new List <PosAndDir>(); snakePosition = PosAndDir.Zero; snakeBodyPosition = Vector2.Zero; }