Você está na página 1de 32

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

O que me incentivou ?
J vai fazer um ano que eu me cadastrei no frum PDJ. Desde ento, reparei que a grande dvida de todos os iniciantes : POR ONDE EU COMEO Pensando nisso, comecei a escrever esse e-book para ensinar desde o mais bsico at o mais avanado da programao de jogos. Os exerccios, como vocs podem ver, no tm respostas no final. No tem mesmo, no foi por que eu esqueci. A idia que todos resolvam os exerccios utilizando o frum (do PDJ e/ou do GameDev), por que assim, ajudando um ao outro, acredito que seja mais fcil aprender. No final do curso, o aluno dever saber: Algoritmos C++ Blender 3D OpenGL GIMP Bom, chega de conversa fiada e vamos ao trabalho !!! Site PDJ: http://www.pdj.com.br/ Site GameDev: http://www.gamedev.com.br/

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Introduo
A idia desse curso ensinar ao leitor como montar algoritmos e logo depois traduzi-los para c++ sendo os algoritmos voltados programao de jogos. Nesta parte do curso voc no aprender a utilizar imagens, objetos ou modelos seja em 2D ou 3D. Voc aprender a montar a estrutura do jogo em c++. Para utilizar imagens,... voc usar como auxlio o OpenGL por exemplo. Mas isso assunto para outra parte do livro. Por hora, nos preocupemos em aprender a melhor parte. Programao. No comeo, apenas um livro de c++ normal. Quando j soubermos repeties, variveis, funes e estruturas entraremos na programao de joguinhos simples (coisas como RPG's de papel, estilo D&D). No desanime. Tudo tem um comeo. O comeo para fazer jogos o que voc ver a seguir. Obs.: Algumas vezes os usurios mais experientes vero que eu escrevi uma ou outra besteira... for proposital ! Leia o livro todo e ver correes mais para a frente.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 1 As variveis
{Zankoku na tenshi no you ni Shounen yo shinwa ni nare - Evangelion}
Como um anjo cruel jovem torne-se uma lenda

No vou ficar com conversa fiada. Vamos ao que interessa !! Primeiramente necessrio aprender o funcionamento de algoritmos. Para isso mostrarei um algoritmo bem simples e explicarei o seu funcionamento logo depois. Algoritmo declare i, j numrico i <- 0 j <- 0 escreva digite um valor leia i escreva digite outro valor leia j escreva a soma dos valores i+j fim algoritmo Algoritmo e fim algoritmo dispensa comentrios. declare uma palavra-chave. Ela diz que voc est declarando uma varivel. O que uma varivel ouo voc dizer. Para entender o funcionamento de uma varivel imagine aquele brinquedinho em que temos vrios buracos de diferentes formas e devemos introduzir o objeto correspondente sua forma. (Fig. 1)

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz Quando voc declara uma varivel voc pode imaginar analogamente que voc est fazendo um buraco de uma determinada forma. As letras a, b, c e d so os nomes desses buracos. A palavra-chave numrico est indicando a forma desse buraco (no algoritmo, i e j possuem a mesma forma. Analogamente voc poderia dizer que i e j so circulares por exemplo). As duas linhas seguintes dizem i<-0 e j<-0. Isso significa que voc est dizendo que o valor numrico de i 0 e o mesmo para o j. Como o nome diz, varivel significa que varia, ou seja, voc pode atribuir o valor que voc quiser varivel no momento em que desejar. Analogamente ao brinquedo das formas voc pode imaginar que os objetos podem ter cores diferentes (as variveis i e j podem ter vrios valores, contanto que seja um nmero). (Fig 2)

A palavra-chave escreva diz ao computador escreva isso aqui. Uma frase deve ficar entre parnteses. Quando voc se refere a uma varivel voc no coloca parnteses. A palavra-chave leia diz ao computador manda o usurio digitar um valor para essa varivel. Traduzindo para o c++, teramos: #include <iostream.h> int main() { int i = 0; int j = 0; cout << digite um valor; cin >> i; cout << digite outro valor; cin >> j; cout << a soma dos valores i+j; return(0); } #include <iostream.h> significa: Computador: Procure o significado dos meus cdigos nessa biblioteca (iostream.h, no caso). Em int main(){} voc disse ao computador que o seu cdigo principal est l dentro

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz (dentro das chaves). Funes ou qualquer outra coisa, veremos mais pra frente. Por enquanto vamos trabalhar dentro do main(){} somente. int i = 0 o mesmo que declare i numrico i<-0, o mesmo serve para o j. cout << texto; o mesmo que escreva texto cin >>; o mesmo que leia Por enquanto, esquea o return(0);, digite e no reclame ;-). Obs.: Repare que na declarao das variveis i e j, utiliza-se a palavra-chave int. Isso se deve ao fato de que as linguagens de programao no aceitam um valor que tenha um ponto flutuante (3,1415, por exemplo) atribudo a uma varivel declarada como inteira (int). Para utilizar nmeros com ponto flutuante, utiliza-se, no lugar de int, a palavrachave float. Agora veja o seguinte algoritmo: Algoritmo declare a, b numrico a <- 0 b <- 0 escreva Digite um valor para a: leia a escreva Digite um valor para b: leia b escreva a+b fim algoritmo Esse algoritmo muito simples. Ele pede para digitar um valor para a e um valor para b. Depois de digitados ele escreve a soma dos dois. Voc pode fazer isso com todos os operadores. Veja a lista deles: Operador + * / Em C++: #include <iostream.h> int main() { int a = 0; int b = 0; cout << Digite um valor para a:; cin >> a; cout >> Digite um valor para b:; Funo Soma Subtrao Multiplicao Diviso Exemplo a+b a-b a*b a/b

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz cin >> b; cout << a+b; return(0);

Nos jogos: Na programao de jogos voc vai usar muuuitas variveis. Mas fcil perceber que voc poderia utilizar esse recurso para, por exemplo, armazenar quantos tiros, vidas, HP, mana, etc o seu personagem possui. Como incrementar ou decrementar voc ver adiante. Exerccios: 1) Faa um algoritmo que declare 3 variveis (escolha o nome que quiser, com quantas letras quiser* (minha_variavel, por exemplo)). Organize 2 delas em ordem crescente (qualquer que seja o valor digitado). 2) Faa um algoritmo pea ao usurio para digitar valores para x na seguinte equao: y = x + 2x + 1. Escreva o valor de y para cada valor de x digitado. 3) Traduza os algoritmos para c++. * No se esquea que as regras de nomenclatura so semelhantes s da internet (sem espaos, pontuao) e tambm no pode comear com nmeros.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 2 Condicionais
{ Hakuna Matata, isto , sem problemas Timo e Pumba }

Imagine que voc queira que, dependendo do valor digitado, o programa execute uma funo diferente, por exemplo: Algoritmo declare cond, a, b numrico a <- 0 b <- 0 cond <- 0 escreva Digite um valor para a leia a escreva Digite um valor para b leia b escreva O que voc quer fazer? 1 = a+b e 2 = a-b leia cond se cond = 1 ento escreva a+b fim se se cond = 2 ento escreva a-b fim se fim algoritmo Nesse caso o algoritmo pergunta se o usurio quer somar ou subtrair os dois valores digitados. simples no ? Agora veja em C++: #include <iostream.h> int main() { int a = 0; int b = 0; int cond = 0; cout << Digite um valor para a; cin >> a; cout << Digite um valor para b; cin >> b; cout << O que voc quer fazer? 1 = a+b e 2 = a-b; cin >> cond; if(cond == 1){ cout << a+b; } if(cond == 2){ cout << a-b; }

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz } return(0);

Imagine agora que voc gostaria que uma certa ao seja repetida um nmero finito de vezes, sendo que este nmero pode ou no ser determinado por voc, por exemplo: Voc tem 100 alunos. Voc quer digitar as 4 notas dos seus alunos em um programa e quer que este calcule a mdia. Voc poderia fazer assim: Algoritmo declare nota1, nota2, nota3, nota4, mdia numrico escreva digite a nota 1 leia nota1 escreva digite a nota 2 leia nota2 . . . mdia <- (nota1+nota2+nota3+nota4)/4 escreva mdia fim algoritmo E cada vez que voc quisesse calcular a mdia de um novo aluno voc deveria reiniciar o programa ou chamar a funo de alguma maneira . Ou, talvez fosse melhor utilizar uma estrutura de repetio. Veja um mtodo inteligente de utilizar uma estrutura de repetio nesse caso (das notas): Algoritmo declare nota, mdia, contador, contaaluno numrico mdia <- 0 contador <- 1 contaaluno <- 1 repita se contaaluno > 100 ento interrompa fim se repita se contador > 4 ento interrompa fim se escreva digite a nota contador leia nota mdia <- mdia + nota contador <- contador + 1 fim repita escreva a mdia do aluno contaaluno mdia/4 contaaluno <- contaaluno + 1 fim repita fim algoritmo O programa ficou mais complexo, porm, ficou mais funcional. Antes voc tinha todos

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz aqueles problemas. Agora ficou mais inteligente. Essa a funo de uma estrutura de repetio. Veja agora a explicao do cdigo (o que voc ainda no sabe): A palavra-chave repita, dispensa comentrios. O que est dentro de: repita . . . fim repita executado um certo nmero de vezes. O nmero de vezes determinado pela condio de parada. Repare nas linhas: se (alguma coisa ocorrer) ento interrompa fim se A palavra-chave interrompa se refere repetio em que esta est includa. Resumindo, quando o programa verifica e v que a condio (x>9, por exemplo) verdadeira ele interrompe a repetio em que o se...fim se est includo. Para que o nmero atinja a condio de parada, alguma varivel dever ser incrementada a cada ciclo. Veja: /* declarao e inicializao da varivel x */ repita se x > 9 ento interrompa fim se escreva x x <- x + 1 fim repita Quando o computador ler fim repita ele voltar para repita e comear um novo ciclo. Se o x no for maior que 9 (5, por exemplo) ele continuar. Na tela aparecer: 5 Depois o x (que est valendo 5) aumentar 1 (passar a ser 6) Como 6 no maior que 9, na tela aparecer: 6 Enfim, acho que voc entendeu. Como o C++ possui vrias estruturas de repetio, essas sero abordadas em captulos distintos. Para finalizar este captulo, imagine que voc queira que o programa apresente dois comportamentos distintos, dependendo do resultado da condio. Veja:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz /* declarao e inicializao da varivel x */ repita se x > 9 ento interrompa seno escreva x fim se x <- x + 1 fim repita Enquanto o x no for maior que 9, o programa escrever ainda no chegou l Para entender melhor, veja a simulao (suponha que x comea valendo 1): Vamos simular o algoritmo abaixo: (Obs.: o que estiver entre /* */ ou depois de // so comentrios meus... no aparecer na tela ;-)) /* declarao e inicializao da varivel x */ repita se x > 9 ento interrompa fim se escreva x x <- x + 1 fim repita
// (1>9... NO) 1 // (2>9... NO) 2 // (3>9... NO) 3 // (4>9... NO) 4 // (5>9... NO) 5 // (6>9... NO) 6 // (7>9... NO) 7 // (8>9... NO) 8 // (9>9... NO) 9 // (10>9... SIM) /* o programa finaliza */

Agora veja a simulao do seguinte algoritmo:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz /* declarao e inicializao da varivel x */ repita se x > 9 ento interrompa seno se x < 5 ento escreva x ainda menor que 5 fim se fim se escreva x igual a x x <- x + 1 fim repita
// (1>9... NO) x ainda menor que 5 x igual a 1 // (2>9... NO) x ainda menor que 5 x igual a 2 // (3>9... NO) x ainda menor que 5 x igual a 3 // (4>9... NO) x ainda menor que 5 x igual a 4 . . . // (10>9... SIM) x igual a 10

Repare que enquanto x foi menor que 5 ele escreveu x ainda menor que 5. Isso se deve ao seno se. Uma boa idia para entender algoritmos fazer os seus prprios e simul-los. Simule tambm os que eu no simulei e veja os resultados. Nos jogos: Voc poderia usar uma estrutura de repetio, por exemplo, para que enquanto o contador de vidas fosse maior que 0 a tela de game-over no aparecesse. Poderia ainda, utilizar para que a cada vez que voc pressionasse o boto ctrl seria decrementado 1 do contador de tiros. Existem centenas de utilidades nos jogos. Exerccios: 1) Faa um algoritmo (no traduza para c++) que calcule com grande preciso a raiz de qualquer nmero (positivo bvio). Obs.: Para calcular a raiz de um nmero, use o seguinte esquema: nmero que se deseja descobrir a raiz = x possvel valor da raiz = y y = (x/y+y)/2 Por exemplo, raiz de 2: (2/1 + 1)/2 = 1,5 >> (2/1,5 + 1,5)/2 = 1,41666 >> ... A repetio deve ocorrer um nmero grande de vezes (10.000 vezes, por exemplo).

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 3 O uso do se, ou melhor, if no c++


{ Me diga seu nome... Shinta... Muito suave para um espadachin de agora em diante seu nome ser KENSHIN OVA's Kenshin Himura}

Algumas vezes, simplesmente queremos que o programa escolha um caminho dependendo do resultado e outro caminho no caso contrrio. Para isso serve o if. Veja o trecho de algoritmo: (voc j viu se...fim se em algoritmo !!) //declarao de variveis e tudo mais repita se x > 9 ento interrompa seno escreva x fim se x <- x + 1 fim repita //qualquer coisa relevante Repare que o se est dividido em duas partes: ento e seno. Ou seja, se alguma coisa ento faa isso, seno faa aquilo. Essa a idia do if. Agora vamos ao que interessa. A sintaxe bsica essa: //comeo do programa if(condio){
//aes

} else{
//mais aes

} //fim do programa A parte if(condio){} equivale a se condio ento. J else{} equivale a seno. Veja o primeiro exemplo do captulo traduzido para o c++ (sem o repita por enquanto ok?). //declarao de variveis e tudo mais //alguma estrutura de repetio if(x > 9){ break; } else{ cout << x; } x = x + 1; //fim da estrutura de repetio //qualquer coisa relevante No h segredos como voc pde ver. Assim funciona a estrutura if. Antes de continuarmos, vejamos a tabela de operadores:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz Operador == != < > <= >= Significado Igual a Diferente de Menor que Maior que Menor ou igual Maior ou igual Exemplo A==B A != B A<B A>B A <= B A >= B

Esses so os operadores de comparao. Use-os nas estruturas que necessitarem de algum tipo de comparao como o if. H uma tcnica chamado aninhamento, onde voc coloca um se dentro de outro, ou seja: se isso ento, se isso, ento se isso... faa isso seno isso.... Veja: //coisas relevantes se x > 0 ento //alguma coisa seno se x < 100 ento //mais alguma coisa seno se x > 51
//mais mais mais alguma coisa

seno
//outra coisa

fim se
//mais coisas XD

fim se
//finalmente faa isso !!

fim se //fim do programa No h nada novo nesse cdigo. s uma tcnica. Veja como fica em c++: //coisas relevantes if(x > 0){
//alguma coisa

} else{ if(x < 100){


//mais alguma coisa

} else{ if(x > 51){


//mais mais mais alguma coisa

} else{

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz
//outra coisa

}
//mais coisas

}
//finalmente faa isso !!

} //fim do programa Eu sei, eu sei meio confuso mas voc se acostuma. Exerccios: 1) Faa um algoritmo que retorne resultados diferentes dependendo do nmero que o usurio digitar (de 0 a 5). Se o nmero for maior que 5 ou menor que 0, o algoritmo deve retornar (digite um nmero vlido). Traduza para o c++.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 4 Para escolher... use o switch case


{ De um lado Narusegawa san... de outro Mutsumi san... cara isso tortura Keitar Urashima }

Voc deve ter ficado um pouco invocado e confuso com o aninhamento. Pois na hora de usar o aninhamento para apresentar escolhas, use o switch case (aninhamento sucks). Veja: Escolha com aninhamento: //coisas relevantes if(letra == 'A'){
//alguma coisa

} else{ if(letra == 'B'){


//mais alguma coisa

} else{ if(letra == 'C'){


//mais mais mais alguma coisa

} else{
//outra coisa

} //fim do programa Escolha com switch case: //coisas relevantes letra = toupper(letra); switch (letra) { case 'A': /*alguma
coisa*/

break; case 'B': /*mais alguma


coisa*/

break; case 'C': /* mais mais mais


alguma coisa*/

break; default: /*outra


coisa*/

} //fim do programa Acredito que no houve problemas a no se na palavra toupper e break. Toupper

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz apenas converte uma letra para maiscula caso o usurio utilize minscula (c++ case sensitive). O break para a repetio. S isso. Nos jogos: Nos jogos a utilizao do switch case evidente. Voc mostra vrias opes ao jogador e ele escolhe uma. Simples. claro que se o menu do jogo for desenvolvido em ambiente grfico, o switch case ficar esquecido ( s adicionar uma funo para cada boto ). Existem algumas outras utilizaes. Mas essa bvia. Exerccios: 1) Faa o mesmo exerccio da aula anterior utilizando o switch case (no faa o algoritmo).

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 5 While e do... while


{ I do not know what strength is in my blood but I swear to you, I will not let the White City fall nor our people fail
Eu no sei quanta fora h no meu sangue mas eu lhe juro, eu no vou deixar a Cidade Branca cair nem nosso povo falhar Aragorn Senhor dos Anis

Se voc est curioso para saber como se escreve o repita... fim repita no c++, aqui vai um dos mtodos: Algoritmo declare a, contador numrico a <- 0 contador <- 0 leia a repita se contador > 2 ento interrompa fim se a <- a*a contador <- contador + 1 fim repita escreva a fim algoritmo Esse algoritmo bem bsico (simule e ver que bem bsico). Ele apenas eleva um nmero ao cubo. Agora veja em c++: #include <iostream.h> int main() { int a = 0; int contador = 0; cin >> a; while(contador < 3) { a = a*a; contador+=1; } cout << a; return(0); } While significa enquanto, ou seja, segundo o programa, enquanto contador for menor que 3, faa o que estiver dentro das chaves ( {...} ). JAMAIS se esquea de aumentar o contador em um determinado valor a cada iterao. Se voc omitir o contador+=1; (que exatamente a mesma coisa que contador = contador + 1;) o loop ficar infinito (o nome dessas repeties ou iteraes loop). Repare agora que no

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz algoritmo, a condio era (se contador for maior que 2 ento interrompa). J em c++ a condio (enquanto contador for menor que 3, faa isso). Isso se deve ao fato de no algoritmo estarmos usando uma condicional se para parar a repetio. apenas questo de ponto de vista, acho que voc no se assustou com isso... certo ? Veja agora o seguinte cdigo: #include <iostream.h> int main() { int a = 0; int contador = 0; cin >> a; while(++contador < 3) { a = a*a; } cout << a; return(0); } Na verdade ele faz EXATAMENTE a mesma coisa que o cdigo anterior... O nome disso notao prefixada. Ela funciona assim:

O contador aumentado A condio testada Se for true (verdadeiro), ele entrar na repetio. Se for false (falso) ele ir interromper

H ainda a notao posfixada. Ela funciona assim:


A condio testada O contador aumentado Se a condio (que j foi testada) for true, ele entrar na repetio. Se for false ele ir interromper

Veja o mesmo exemplo usando a notao posfixada: #include <iostream.h> int main() { int a = 0; int contador = 0; cin >> a; while(contador++ < 3) { a = a*a; } cout << a; return(0); }

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz Repare que no esquema acima, ele calcular o nmero elevado a quarta potncia. Para corrigir isso, faa assim: while(contador++ < 2). Pronto !! Erro corrigido. Agora, vejamos o do... while: #include <iostream.h> int main() { int a = 0; int contador = 0; cin >> a; do { a = a*a; contador += 1; }while(contador < 2); cout << a; return(0); } Voc deve estar pensando: Mas no a mesma coisa ?!?!?!?!?! No exatamente. O loop do while funciona de um jeito semelhante notao posfixada. Mas a grande diferena entre o while e o do while que no do while os comandos so executados pelo menos uma vez !! Isso se deve a ele testar a condio somente no final. Resumindo: faa ... (ou seja ele far de qualquer jeito) enquanto algo for verdadeiro. Exerccios: 1) Traduza para o c++: Algoritmo declare nota, mdia, contador, contaaluno numrico mdia <- 0 contador <- 1 contaaluno <- 1 repita se contaaluno > 100 ento interrompa fim se repita se contador > 4 ento interrompa fim se escreva digite a nota contador leia nota mdia <- mdia + nota contador <- contador + 1 fim repita escreva a mdia do aluno contaaluno mdia/4 contaaluno <- contaaluno + 1 fim repita fim algoritmo

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 6 O loop for


{ One, two, three, four... I love marine corp. - Recrutas Full Metal Jacket }

Depois de ver o loop while e do while, o loop for parece meio intil. Quando voc j estiver experiente ver que no necessariamente intil. Veja o cdigo: #include <iostream.h> int main() { int a = 0; int contador; cin >> a; for(contador = 0; contador == 3; contador++) { a = a*a; } cout << a; return(0); } Veja a enorme semelhana com o loop while posfixado. Agora repare que neste caso a condio funciona de uma maneira diferente. No loop while, a condio normalmente modificada (voc ver isso mais para frente) dentro das condicionais if. No loop for, h um determinado nmero de vezes para acontecer a iterao, ou seja, voc tem certeza de quantas vezes a coisa ir acontecer. No nosso caso, 3 vezes. Entenda agora, a sintaxe: for(contador = 0; contador == 3; contador++) for() { ... } // voc apenas indicou que um loop for contador = 0; // voc inicializou a varivel contador == 3; // condio (repita 3 vezes) contador++ // incremente a varivel contador Voc deve estar confuso com duas coisas (espero que sejam somente essas duas ). Primeiro, inicializar uma varivel e segundo, incrementar a varivel contador. Inicializar uma varivel atribuir um valor inicial a ela. A inicializao da varivel no exatamente obrigatria. Porm, mais para frente voc ver que alguns erros ocorrem pela falta de inicializao. Para evitar isso faa como um bom programador (espero que essa seja sua meta). INICIALIZE TODAS AS VARIVEIS... SEMPRE. A partir de agora inicializaremos todas. Incrementar a varivel significa apenas aumentar seu valor em (+1). Voc tambm pode decrementar (-1). A escolha sua. Veja agora o gabarito para usar o loop for. Nunca fuja disso e voc nunca ter problemas.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz #include <iostream.h> int main() { int contador; for(contador = 0; contador < 10; contador++) { cout << contador << endl; //endl pula uma linha } cout << a; return(0); } O programa ir mostrar os nmeros de 0 a 9 Ou voc tambm pode decrementar a varivel: #include <iostream.h> int main() { int contador; for(contador = 9; contador > 0; contador--) { cout << contador << endl; //endl pula uma linha } cout << a; return(0); } O programa ir mostrar os nmeros de 9 a 0 XD

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 7 Algo sobre variveis bsicas...


{ Veja esta tcnica pela ltima vez.. o melhor presente de adeus que eu podia lhe dar... - Dohko }

Lembra do primeiro captulo, onde as variveis podiam ter formas diferentes? Vou explicar direito nesse captulo. Para comear, a varivel (sem viagens agora) um espao reservado na memria de seu computador. Ao declarar uma varivel, voc est reservando um espao que somente o seu programa pode ter acesso e estar disponvel at a finalizao do programa. As variveis podem ser de vrios tipos bsicos. So eles: Tipo unsigned short int short int unsigned long int long int char bool float double Tamanho 2 bytes 2 bytes 4 bytes 4 bytes 1 byte 1 byte 4 bytes 8 bytes Valores 0 a 65.535 - 32.768 a 32.767 0 a 4.294.967.295 -2.147.483.648 a 2.147.483.647 256 valores de caractere Verdadeiro ou falso 1,2e-38 a 3,4e38 2,2e-308 a 1,8e308

Voc deve ter notado a incrvel semelhana entre os nomes long int e short int e mais ainda entre unsigned (short int e long int). Na verdade as variveis so somente int e short. Repare nos valores numricos da unsigned short e short e da unsigned int e int. Some o mdulo dos dois valores da short int: |-32.768 + 32.767| = 65.535. O resultado ser igual ao valor da unsigned short no coincidncia. Unsigned significa sem sinal, ou seja, ao dizer sem sinal voc no aumentou o valor da varivel. Voc apenas afirmou que o resultado dela positivo com certeza e com isso aumentou (no campo dos nmeros positivos) o intervalo de valores sem utilizar o dobro de memria. O mesmo vale para a unsigned int que igual soma dos mdulos dos dois valores da int. |-2.147.483.648| + |2.147.483.647| = 4.294.967.295. Para entender melhor (se voc ainda no entendeu, veja o esquema:

-32.768 65.535

32.767

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz Nos jogos: Em jogos muito grandes, cada mnimo de memria que voc puder economizar, no hesite... ECONOMIZE !!!

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 8 Variveis compostas homogneas unidimensionais


{ Rozan Hyakuryu-Ha Clera dos 100 drages Dohko }

Imagine a seguinte situao: Voc precisa acessar, somar, multiplicar... centenas de valores um pelo outro. Ento voc pega e declara 400 variveis inteiras (int) e 1000 variveis com ponto flutuante(float) . CLARO QUE NO!!. Para isso existem arrays ou variveis estruturadas ou variveis compostas. Veja o seguinte algoritmo: Algoritmo declare s, i, a, b numrico declare A[1:10] numrico i <- 1 s <- 0 repita se i > 10 ento interrompa fim se escreva Digite um valor: leia a leia b A[i] <- a + b s <- s+A[i] i <- i+1 fim repita escreva s fim algoritmo Repare que no foi necessrio declarar 10 variveis A (A1, A2, A3, A4...). Foi necessrio apenas digitar A[1:10] para o computador entender que na verdade no uma so 10 !!!. Repare tambm que eu usei uma outra varivel para acessa-la. Isso foi feito para que o programa percorresse o vetor. A cada iterao o valor de i aumenta em uma unidade. Portanto a cada repetio, o programa acessa uma posio diferente do vetor. Veja o esquema: A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]

Suponha agora que o usurio digitou os 3 primeiros valores de a e b: a(1, 3, 5) e b(2, 4, 6). Veja o resultado final: A[1] 3 A[2] 7 A[3] 11 A[4] A[5] A[6] A[7] A[8] A[9] A[10]

Acho que a imagem fala por si s. O valor dentro dos colchetes (A[1], B[2]...), o valor de i. Veja agora o algoritmo traduzido:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz #include <iostream.h> int main() { int s = 0; int i = 0; int a = 0; int b = 0; int A[9]; //estrutura de repetio if(i > 10){ break; } cout << endl<< Digite um valor:; cin >> a; cin >> b; A[i] = a + b s = s+A[i] i = i+1 //fim da estrutura de repetio cout << \n << s; return(0); } Repare que eu coloquei A[9] ao invs de A[10]. Isso se deve ao fato de o limite inferior do C++ ser 0 por padro. De 0 a 9, temos 10 nmeros. No se preocupe com limite inferior por enquanto (mesmo porque no C++ no precisa se preocupar com isso). Uma bitolinha sempre subtrair um do tamanho de seu vetor. Nos jogos: Na programao de jogos com OpengGL ou DirectX, voc ainda vai ouvir muito falar de arrays... No tenha dvidas. Exerccios: 1) Faa um algoritmo que leia e escreva 10 valores numricos. 2) Faa um algoritmo que leia 2 arrays (A e B). Some os valores de A e B (A[1] + B[1], A[2] + B[2]...) e insira o resultado em um array C. Escreva os valores do vetor C.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 9 Variveis compostas homogneas bidimensionais


{ Do you know: What It Is ? - The Matrix is everywhere Morpheus }

Arrays bidimensionais so apenas os arrays comuns (unidimensionais) com vrias linhas. Pense como se fossem matrizes. Matriz pode ser M1x2, A1x4 quando s possui colunas e M22x2, B5x8, ou genricamente MATRIZixj, sendo i = linhas e j = colunas. Veja uma matriz 1x4: i1, j1 Agora veja uma matriz 3x5 i1, j1 i2, j1 i3, j1 i1, j2 i2, j2 i3, j2 i1, j3 i2, j3 i3, j3 i1, j4 i2, j4 i3, j4 i1, j5 i2, j5 i3, j5 i1, j2 i1, j3 i1, j4

Resumindo: Arrays bidimensionais servem para armazenar dados que contenham uma relao prxima entre si, por exemplo: Voc quer armazenar todas as notas dos alunos de uma sala (sala com 20 alunos) e o nmero do aluno, portando uma matriz que tenha 2 colunas e 20 linhas ou 2 linhas e 20 colunas. Nmero do aluno 1 2 3 4 . . . 20 Nota do aluno 7 6 8 2 . . . 9

A forma de representar em algoritmo Matriz[1:2, 1:20]. Veja um exemplo simples para armazenar os dados: Algoritmo declare s, i numrico declare A[1:2, 1:20] numrico i <- 1 s <- 0 repita se i > 20 ento interrompa fim se escreva Digite a nota do aluno: A[i][1] <- i leia A[i][2]

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz s <- s+A[i][2] i <- i+1 fim repita escreva s/20 fim algoritmo O algoritmo apenas l as notas e a cada repetio adiciona o nmero correspondente ao aluno. Veja a simulao: Nmero do aluno 1
//repetio

Nota do aluno 7

Nmero do aluno 1 2
//acho que voc entendeu !!!

Nota do aluno 7 6

Agora, como de praxe, veja o algoritmo traduzido: #include <iostream.h> int main() { int s; int i; int A[1][19] // olha que legal... o c++ no faz questo de A[1:2][1:20] i = 0; s = 0;
//estrutura de repetio

if(i > 19){ break; } cout << Digite a nota do aluno:; A[i][0] = i; cin >> A[i][1]; s = s+A[i][1]; i = i+1;
//fim da repetio

cout << s/20; return(0);

Voc deve ter se perguntado (por que diabos A[1:2]. Isso se deve a linguagens como pascal. O padro o seguinte: Matriz[limite inferior:limite superior]. Eu poderia falar muita coisa e te deixar confuso. Mas a funo disso a seguinte: Veja um exemplo com limite inferior 1 e limite superior 4 (Matriz[1:4]:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz 1 2 3 4

Agora veja uma matriz com limite inferior 3 e limite superior 8 (Matriz[3:8]) 3 4 5 6 7 8

Mas s isso?!?!?!?!?!... Sim s isso . Linguagens como o pascal so muito formais... exigem coisas meio chatas mesmo, v se acostumando. Nos jogos: Como dito no captulo passado, voc ainda vai ver muitas arrays na hora de fazer jogos (3D). Se acostume com isso tambm. Exerccios: 1) Leia o algoritmo abaixo, simule-o e traduza-o: Algoritmo declare mdia, i, j numrico declare n_alunos[1:20][1:6] i <- 1 j <- 1 mdia <- 0 repita se i > 20 ento interrompa fim se escreva Aluno i : repita se j > 4 ento interrompa fim se escreva Escreva a nota j do aluno i : n_alunos[i][j] <- i leia n_alunos[i][j+1] mdia <- mdia + n_alunos[i][j+1] j <- j+1 fim repita n_alunos[i][6] <- mdia/4 escreva A mdia do aluno i n_alunos[i][6] mdia <- 0 i <- i+1 fim repita fim algoritmo

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 10 Variveis compostas homogneas tridimensionais


{ Even now in this very room Morpheus }

Voc j viu arrays unidimensionais (faa relao com uma reta), j viu bidimensionais (pense em um plano). Agora, veremos tridimensionais (slido). Veja a evoluo: j1
Unidimensional

j2

j3

i1, j1 i2, j1 i3, j1


Bidimensional

i1, j2 i2, j2 i3, j2

i1, j3 i2, j3 i3, j3

i1, j1, k1 i2, j1, k1 i3, j1, k1 Pgina 1


Tridimensional (Pgina 1)

i1, j2, k1 i2, j2, k1 i3, j2, k1 Pgina 2 Pgina 3

i1, j3, k1 i2, j3, k1 i3, j3, k1

i1, j1, k2 i2, j1, k2 i3, j1, k2 Pgina 1


Tridimensional (Pgina 2)

i1, j2, k2 i2, j2, k2 i3, j2, k2 Pgina 2 Pgina 3

i1, j3, k2 i2, j3, k2 i3, j3, k2

i1, j1, k3 i2, j1, k3 i3, j1, k3 Pgina 1


Tridimensional (Pgina 3)

i1, j2, k3 i2, j2, k3 i3, j2, k3 Pgina 2 Pgina 3

i1, j3, k3 i2, j3, k3 i3, j3, k3

s uma continuao intuitiva. claro que se j temos linhas e colunas, faltam as pginas (cada pgina pode estar relacionada a um cliente, as colunas podem ser o salrio e o nmero de horas de trabalho e as linhas cada ms do ano !!).

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz Veja: Ms 1 2 Jos(Pg. 1) Joo(Pg. 2) Horas extra 10 4 Salrio 3.000 2.400 Manoel(Pg. 3)

Simples no ? Agora veja como armazenar esses dados : Algoritmo defina fator 100 declare i, conta, k numrico declare tabela[1:12][1:3][1:20] numrico i <- 1 conta <- 0 k <- 1 repita se k > 20 ento interrompa fim se repita se i > 12 ento interrompa fim se escreva Digite os dados referentes ao ms i repita se conta = 1 ento interrompa fim se escreva Digite quantas horas extra k trabalhou: leia tabela[i][2][k] tabela[i][3][k] <- (tabela[i][2][k]*fator)+2000 conta <- 1 fim repita conta <- 0 i <- i+1 fim repita k <- k+1 fim repita fim algoritmo Quando voc bateu o olho deve ter pensado NOSSA!!!!!!! que cdigo gigante. Acredite. Esse cdigo muito pequeno e simples de entender. Leia, releia, trileia at entender tudo. Alm disso, uma palavra nova apareceu defina. Isso significa que voc definiu uma constante, ou seja, um espao na memria que no pode ser modificado e tem um valor determinado (ao contrrio de uma varivel que pode ser modificada a hora que voc quiser). Em c++:

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz #include <iostream.h> #define fator 100 int main() { int i = 0; int k = 0; int tabela[11][2][19]; while(k < 20) { while(i < 12) { cout << Digite os dados referentes ao ms << i; for(conta = 0; conta < 1; conta++) { cout << Digite quantas horas extra << k << trabalhou:; cin >> tabela[i][1][k]; tabela[i][2][k] = (tabela[i][1][k]*fator)+2000; } i += 1; } k += 1; } return(0); } S repare em duas coisas: Primeiro: A constante foi declarada antes do main() Segundo: Usei o loop for Exerccios: 1) Faa um sistema de cadastro de notas. Aluno = pgina Coluna { 1 = nmero do aluno, 2 = primeira nota, 3 = segunda nota e 4 = mdia final [ ( nota1+nota2 )/2 ] } Linhas = bimestres (4 no total) Obs.: Faa em algoritmo e logo aps em c++.

Curso C++ para criao de jogos (Bsico) Por: Rodrigo da Silva Vaz

Captulo 11 Variveis compostas heterogneas


{ Jiu-jitsu.. I going learn Jiu-jitsu ? Neo }

Quando voc viu o sistema de cadastro, deve ter pensado: Ser que eu no posso declarar uma varivel composta homognea unidimensional, cujo tipo seja caracteres para armazenar os nomes dos empregados, sendo esta varivel intimamente ligada com a principal ?? Sim !! Existe uma tcnica para isso. Vamos agora aos arrays paralelos.

Prximos captulos: Funes (captulo muito longo XD) Estrutura (um pouco extenso tambm) Sobrecarga de operador Tratamento de arquivos OOP (muuuuuito longo) Polimorfismo Ponteiros // aqui acaba a parte do c++ bsico e intermedirio C++ Avanado (bmp, wav...)

Você também pode gostar