Jogos Livros Técnicos Palestras Links
Criando seus próprios jogos para XBox 360 - Parte 3

(Publicado na revista XBox 360 ano 2 número 19)

Na parte 1 deste artigo, vimos como desenhar as sprites (imagens) do bastão e da bola, ainda fixas na tela. Na parte dois, vimos como controlar os bastões com o gamepad do Xbox 360 e como fazer a bola se movimentar, mas ainda sem "quicar" em nada.  Agora, vamos ver como escrever o código para fazer a bola quicar nas bordas de cima e de baixo da janela, e como fazer para que os bastões a rebatam!

Pronto?  Então, vamos lá!

1.Rebater a bola na parte de cima da tela é simples: basta inverter a velocidade se a coordenada Y da bola (armazenada na variável posBola) for menor do que zero, já que a coordenada Y começa do zero, na parte de cima da tela. Assim, inclua no método Update a da classe Game1 as seguintes linhas: 


if (posBola.Y + velBola.Y < 0)
velBola.Y *= -1;
Lembrando: tanto a posição quanto a velocidade da bola são do tipo Vector2, um tipo de dados especial que armazena duas posições (X e Y). Multiplicando a velocidade por -1, invertemos o valor de X e de Y, gerando o efeito da rebatida.

2. Para rebater na parte de baixo da tela, o teste é semelhante, sendo que devemos lembrar de dois detalhes: A tela possui (como padrão, podendo ser mudado via código) 600 pixels de altura; e para rebater desde a parte “de baixo” da bola , precisamos somar o tamanho da bola - 16 pixels – pois sua posBola é a posição do canto superior direito da bola:


if (posBola.Y + 16 + velBola.Y > 600)
velBola.Y *= -1;

3. Para calcular se a bola está batendo no bastão, precisamos testar se alguma das coordenadas X,Y da bola está entre as coordenadas X,Y do bastão.   Neste caso, não há como fugir de um pouco de matemática. Lembrando que a bola tem 16 pixel de altura e de largura; que o bastão tem 16 pixels de largura e 96 de altura; precisamos testar se as coordenadas da bola estão entre as coordenadas do bastão. Para o bastão da esquerda, que é fixo na posição 20 da tela (conforme o código que escrevemos no primeiro artigo desta série) este teste seria:


if (posBola.X < (20+16) && posBola.X + 16 > 20 &&
    posBola.Y < posBastaoEsquerda + 96 && posBola.Y + 16 > posBastaoEsquerda)
          velBola *= -1;


O código pode parecer meio confuso a princípio, mas desenhe a bola e o bastão com suas coordenadas em um papel e acompanhe o código que você entenderá melhor. Podemos lê-lo da seguinte forma: 
Se alguma das coordenadas X da bola (que vão de posBola.X até posBola.X+16) está entre as coordenadas X do bastão (20 até 20 + 16, já que o bastão tem a mesma largura da bola, 16 pixels)  E
Se alguma das coordenadas Y da bola (posBola.Y até posBola.Y + 16) está entre as coordenadas Y do bastão (de posBastaoEsquerda até posBastaoEsquerda + 96, já que o bastão tem 96 pixels de altura
    então multiplique a velocidade da bola por -1, ou seja, inverta a velocidade da bola

4. Para fazer o teste com o bastão da direita, basta repetir o mesmo código, trocando o número 20 por 764, a posição do bastão da direita.  O código final do método Update é apresentado a seguir:


protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed
        || Keyboard.GetState().IsKeyDown(Keys.Escape))
            this.Exit();

    // Move a bola
    posBola += velBola;

    // Altera a posição do bastão com o gamepad
    GamePadState meuGamePad= GamePad.GetState(PlayerIndex.One);
    posBastaoEsquerda += meuGamePad.ThumbSticks.Left.Y * -10;
    posBastaoDireita += meuGamePad.ThumbSticks.Right.Y * -10;

    // Faz a bola quicar nas bordas de cima e de baixo da janela
    // Borda de baixo (a tela tem 600 pixels de altura)
    if (posBola.Y + 16 + velBola.Y > 600)
        velBola.Y *= -1;
    // Borda de cima
    if (posBola.Y + velBola.Y < 0)
        velBola.Y *= -1;

    // Testa colisão com bastão da esquerda
    if (posBola.X < (20 + 16) && posBola.X + 16 > 20 &&
        posBola.Y + 16 > posBastaoEsquerda && posBola.Y < posBastaoEsquerda + 96)
    {
        velBola *= -1;
    }

    // Testa colisão com bastão da direita
    if (posBola.X < (764 + 16) && posBola.X + 16 > 764 &&
        posBola.Y + 16 > posBastaoDireita && posBola.Y < posBastaoDireita + 96)
    {
        velBola *= -1;
    }

    base.Update(gameTime);
}

Rodando nosso programa agora, veremos que é possível controlar os bastões com os dois thumbsticks do gamepad, e rebater a bola (que quica nas bordas de cima e de baixo da janela).   No entanto, se o bastão "erra", a bola sai pela lateral e some.

Na revista XBox 360 número 20, de julho, veremos o código para contar pontos e mostrá-los na tela, e para reiniciar a bola quando ela sai pelas laterais, concluindo este nosso pequeno passeio pelo maravilhoso mundo do desenvolvimento indie (independente) de jogos!

Baixe o código completo desta coluna aqui.  E para consultar uma versão um pouco mais "profissional", onde é criada uma classe para gerenciar as sprites, veja este outro código.

E para saber mais sobre o XNA, consulte os slides na página de palestras!

Voltar