*= -1; } // Verificando se alcancou a borda direita if (posicao.X + velocidade.X + tamanho.X > tamanhoDaTela.X) { velocidade.X *= -1; } // Verificando se alcancou a borda superior if (posicao.Y + velocidade.Y < 0) { velocidade.Y *= -1; } // Verificando se alcancou a borda inferior if (posicao.Y + velocidade.Y + tamanho.Y > tamanhoDaTela.Y) { velocidade.Y *= -1; } posicao += velocidade;}Podemos agora executar o projeto e verificaremos que ao alcancar uma das bordas, nosso sprite inverte a movimentacao.Movimentacao do sprite utilizando o TecladoNa classe Game1 vamos criar uma nova instancia da classe que representa nosso sprite, esta ira se mover de acordo com comandos, utilizando as setas do teclado.public class Game1 : Microsoft.Xna.Framework.Game{ GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Ball ball; // Nosso sprite Ball ball2; // Novo sprite controlado pelo tecladoInicializamos o novo objeto no metodo LoadContent, este objeto se diferenciara do outro na posicao inicial e na velocidade.protected override void LoadContent(){ // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here // Carregando nosso sprite ball = new Ball(Content.Load("ball"), new Vector2(0, 0), new Vector2(2, 2), new Vector2(graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight)); ball2 = new Ball(Content.Load("ball"), new Vector2(100, 100), new Vector2(5, 5), new Vector2(graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight));}Alteramos o metodo UnloadContent para liberar os recursos utilizados pelo novo objeto:protected override void UnloadContent(){ ball.Textura.Dispose(); ball2.Textura.Dispose();}Desenharemos o novo objeto utilizado o metodo Draw:protected override void Draw(GameTime gameTime){ GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); ball.Draw(spriteBatch); ball2.Draw(spriteBatch); spriteBatch.End(); base.Draw(gameTime);}A leitura de teclas e realizada no metodo Update, onde verificaremos se uma das teclas esta pressionada e entao moveremos o sprite de acordo com a tecla. Utilizamos o metodo GetState da classe KeyBoard que nos retorna o estado atual do teclado e entao podemos verificar quais teclas estao pressionadas.O metodo Update fica entao a seguinte forma:{ // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // Movimentando o novo sprite Vector2 posicao = ball2.Posicao; Vector2 velocidade = ball2.Velocidade; KeyboardState keyboard = Keyboard.GetState(); if (keyboard.IsKeyDown(Keys.Up)) { posicao.Y -= velocidade.Y; } if (keyboard.IsKeyDown(Keys.Down)) { posicao.Y += velocidade.Y; } if (keyboard.IsKeyDown(Keys.Left)) { posicao.X -= velocidade.X; } if (keyboard.IsKeyDown(Keys.Right)) { posicao.X += velocidade.X; } ball2.Posicao = posicao; // TODO: Add your update logic here ball.Mover(); base.Update(gameTime);}Com isso podemos executar nosso projeto e mover o segundo sprite utilizando as setas do teclado.Deteccao de colisaoEm nosso projeto os sprites estao simplesmente 'atravessando' um ao outro quando se encontram. A deteccao de colisao nos permite saber o exato momento em que objetos se encontram para entao realizarmos alguma acao.Existem diversos algoritmos para deteccao de colisao em diferentes formas de objetos, em nosso exemplo estamos utilizando circulos, entao a deteccao sera feita verificando a distancia dos centros dos circulos com a soma de seus raios.Criaremos as propriedades de centro e raio na classe que representa nosso sprite:public Vector2 Centro { get { return posicao + (tamanho / 2); } }public double Raio { get { return tamanho.X / 2; } }Entao criamos um metodo para verificar a colisao dos objetos:public Boolean VerificarColisao(Ball ball){ if (Vector2.Distance(Centro, ball.Centro) < (Raio + ball.Raio)) { return true; } else