quinta-feira, 8 de março de 2007

Controlando o fluxo do programa

Até agora nós vimos coisas estáticas na tela do DS. Só que um jogo sempre tem ação. A ação vem da repetição de passos, então vamos estudar como passar diversas vezes pelo mesmo ponto.

while
O while é o primeiro controle de fluxo que iremos executar. A sintaxe dele segue o seguinte padrão:

while (expressão_lógica) { comandos }

while significa "enquanto". Ele é um controle de fluxo do tipo loop (loop significa dar uma volta - por isso a manobra "looping" da aviação tem esse nome, porque o avão dá uma volta no ar). A lógica do while é repetir a execução dos comandos que estão entre chaves enquanto a expressão_lógica for verdadeira. Olhem o exemplo:
x=0;
while (x<10) {
    x=x+1;
}
Tradução: x começa com 0. Cada vez que o loop é executado, x é acrescido de 1. Quando x chegar a 10, a expressão_lógica passa a ser falsa e o loop não é mais executado, passando o fluxo para o que vier depois dele.

if
If é um controle de fluxo do tipo decisão. If significa "se". A sua sintaxe é a seguinte:

if (expressão_lógica) { comandos1 } else { comandos2 }

"else { comandos2 }" é opcional, não precisa ser usado sempre que usar um comando if. Else signica "senão". A lógica é a seguinte: se a expressão_lógica for verdadeira, o conjunto de comandos1 é executado, senão o conjunto comandos2 é executado. Por exemplo:
if (x>20) {
    a=0;
    b=15;
} else {
    a=10;
    c=30;
}
Tradução: se x for maior que 20, então a passa a valer 0 e b passa a valer 15, senão a passa a valer 10 e c passa a valer 30.

Vamos a um programa exemplo para o DS:
Antes de "PA_Init();" digite o seguinte:
    u16 x=0;
    u16 y=0;
    s8 passox=1;
    s8 passoy=1;
    u16 xvelho=0;
    u16 yvelho=0;

Depois de "PA_InitVBL();", digite o seguinte:
    PA_InitText(1,0);
    PA_SetTextCol(1,31,31,0);
    PA_InitRand();
    x=PA_RandMinMax(1,30);
    y=PA_RandMinMax(1,22);


Entre as chaves do "while(1)", antes de "PA_WaitForVBL();" , digite o seguinte:
    xvelho=x;
    yvelho=y;
    x=x+passox;
    y=y+passoy;
    if (x==0) { passox=1; }
    if (x==31) { passox=-1; }
    if (y==0) { passoy=1; }
    if (y==23) { passoy=-1; }
    PA_OutputSimpleText(1,x,y,"o");
    PA_OutputSimpleText(1,xvelho,yvelho," ");

O que o programa faz:
primeiro, inicializa as variáveis (u16 significa que vai ser um valor numérico de 16 bits sem sinal, podendo variar de 0 a 65535; s8 significa um valor numérico de 8 bits com sinal, podendo variar de -128 a 127). Depois prepara a tela de cima para receber texto na cor amarela, inicializa o gerador de números aleatórios e define o valor aleatório de x e y dentro da área de texto do DS, sem encostar nas bordas (a posição de um caracter de texto pode variar horizontalmente entre 0 e 31 e verticalmente entre 0 e 23).
Dentro do loop while, que é um loop infinito, pois 1 sempre vai ser verdadeiro (lembram? 1 é verdadeiro, 0 é falso), roda os seguintes comandos:
  • armazena a posição antiga de x e y em xvelho e yvelho
  • soma o passo de x e y a x e y
  • verifica se x ou y chegaram a uma borda e inverte o passo de quem chegou
  • escreve "o" na posição nova de x e y
  • escreve um espaço (tem que digitar um espaço entre " ") na posição antiga de x e y, apagando o "o" que tinha ali.

2 comentários:

Leonardo Zimbres disse...

hun... e de extra vem um conceito simples para a colisão de um objeto que quica. Legal.

Abel Ferreira disse...

Bem massa!
Vou portar meu jogos pra DS agora.
Vlw cara.
Breve lumines no DS?
Vou tentar...