Variaveis globais sao aquelas que valem para todo o programa e nao apenas para uma funcao. Como o C trabalha? Variaveis declaradas dentro de uma funcao sao apenas daquela funcao. Variaveis declaradas fora de funcoes valem para todo o programa. Nao e interessante usar so variaveis globais? Nao. Variaveis globais consomem mais memoria que variaveis locais, pois continuam ocupando o seu espaco na memoria depois que a funcao termina de executar. Alem disso, se eu mudar o valor de uma variavel em uma funcao e esta variavel estiver sendo usada em outra funcao, o valor na outra funcao tambem sera alterado. Olhem o exemplo:s16 i=0;void func2() { i++;}void func1 () { for (i=0; i<40; i++) { func2(); PA_OutputText(0,i>>1,'i=%d',i); }}No exemplo acima, vai imprimir os numeros de 0 a 39 pulando de dois em dois, apesar do for em func1 mandar i++. Isso complica muito a interpretacao e pode mascarar erros. Entao vamos usar variaveis globais para aquilo que envolve todo o programa, como a posicao do tanque, o angulo do canhao, a posicao do tiro, etc.Para organizar melhor a funcao main, vamos usar funcoes para as diversas acoes do jogo. Desta forma a funcao main contem o esqueleto principal, e o detalhamento de cada acao fica em uma funcao diferente. Olhem o fonte do programa como ficou:// Includes#include <PA9.h> // Include for PA_Lib#include "gfx/all_gfx.c"#include "gfx/all_gfx.h"// Variaveis Globaiss16 angulo_body=0;s16 angulo_turret=0;s16 velocidade=1;s16 x=111;s16 y=79;s16 angulo_tiro=0;s32 x_tiro=-8<<8;s32 y_tiro=-8<<8;s16 vel_tiro=4;s8 atirando=0;void giraturret() { if (Stylus.Held) { angulo_turret=PA_GetAngle(x+16,y+16,Stylus.X,Stylus.Y); PA_SetRotsetNoZoom(0,0,angulo_turret); }}void movetanque() { if ((Pad.Held.Left && Pad.Held.A) || (Pad.Held.Right && Pad.Held.Y) || (Pad.Held.Up && Pad.Held.B) || (Pad.Held.Down && Pad.Held.X) || (Pad.Held.X && Pad.Held.B) || (Pad.Held.Y && Pad.Held.A)) { //o usuário está sacaneando, não executa nada } else if (!(Pad.Held.Up || Pad.Held.Down || Pad.Held.Left || Pad.Held.Right || Pad.Held.A || Pad.Held.B || Pad.Held.X || Pad.Held.Y)) { //nenhuma direção foi pressionada } else { if ((Pad.Held.Left || Pad.Held.Y || Pad.Held.Right || Pad.Held.A) && !(Pad.Held.Up || Pad.Held.X || Pad.Held.Down || Pad.Held.B)) { angulo_body=256*(Pad.Held.Left || Pad.Held.Y); x+=velocidade*(Pad.Held.Right || Pad.Held.A)-velocidade*(Pad.Held.Left || Pad.Held.Y); } else if (!(Pad.Held.Left || Pad.Held.Y || Pad.Held.Right || Pad.Held.A) && (Pad.Held.Up || Pad.Held.X || Pad.Held.Down || Pad.Held.B)) { angulo_body=128*(Pad.Held.Up || Pad.Held.X)+384*(Pad.Held.Down || Pad.Held.B); y+=velocidade*(Pad.Held.Down || Pad.Held.B)-velocidade*(Pad.Held.Up || Pad.Held.X); } else { angulo_body=256*(Pad.Held.Left || Pad.Held.Y); x+=velocidade*(Pad.Held.Right || Pad.Held.A)-velocidade*(Pad.Held.Left || Pad.Held.Y); if (angulo_body) { angulo_body=192*(Pad.Held.Up || Pad.Held.X)+320*(Pad.Held.Down || Pad.Held.B); } else { angulo_body=64*(Pad.Held.Up || Pad.Held.X)+448*(Pad.Held.Down || Pad.Held.B); } y+=velocidade*(Pad.Held.Down || Pad.Held.B)-velocidade*(Pad.Held.Up || Pad.Held.X); } if (x<0) { x=0; } if (x>223) { x=223; } if (y<0) { y=0; } if (y>159) { y=159; } PA_SetRotsetNoZoom(0,1,angulo_body); PA_SetSpriteXY(0,0,x,y); PA_SetSpriteXY(0,1,x,y); }}void atira() { if (atirando) { x_tiro+=PA_Cos(angulo_tiro)*vel_tiro; y_tiro-=PA_Sin(angulo_tiro)*vel_tiro; PA_SetSpriteXY(0,2,x_tiro>>8,y_tiro>>8); if (x_tiro<-8<<8 || x_tiro>260<<8 || y_tiro<-8<<8 || y_tiro>200<<8) { atirando=0; } } else { if (Pad.Newpress.L || Pad.Newpress.R) { atirando=1; angulo_tiro=angulo_turret; x_tiro=(x+12)<<8; y_tiro=(y+12)<<8; x_tiro+=PA_Cos(angulo_tiro)*24; y_tiro-=PA_Sin(angulo_tiro)*24; PA_SetRotsetNoZoom(0,2,angulo_tiro); PA_SetSpriteXY(0,2,x_tiro>>8,y_tiro>>8); } }}// Function: main()int main(int argc, char ** argv){ PA_Init(); // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_Init16bitBg(0,0); PA_Draw16bitRect(0,0,0,255,191,32768+10*1024+31*32+25); PA_LoadSpritePal(0, 0, (void*)tank_turret_Pal); PA_CreateSprite(0, 0, (void*)tank_turret_Sprite, OBJ_SIZE_32X32, 1, 0, x, y); PA_LoadSpritePal(0, 1, (void*)tank_body_Pal); PA_CreateSprite(0, 1, (void*)tank_body_Sprite, OBJ_SIZE_32X32, 1, 0, x, y); PA_LoadSpritePal(0, 2, (void*)tiro_Pal); PA_CreateSprite(0, 2, (void*)tiro_Sprite, OBJ_SIZE_8X8, 1, 0, -8, -8); PA_SetSpriteRotEnable(0, 0, 0); PA_SetSpriteRotEnable(0, 1, 1);