TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Este tutorial tem por objetivo ensinar de forma prática como salvar elementos de um jogo criado no 3D Game Builder. Para isso, vamos criar um jogo simples e aplicar os conhecimentos nele. Antes de começarmos, é importante frisar algumas coisas importantes, tais como o conceito de Game Designer e Programador. Toda pessoa que entra nesse mundo de jogos sabe que um jogo de verdade é algo complexo e por isso demanda tempo, paciência, conhecimento em diversas áreas e pessoal. Então, como é muito difícil alguém reunir todas as características necessárias, normalmente são montadas equipes e as tarefas são divididas. São várias as áreas, mas vamos nos focar no Game Designer e no Programador. O primeiro é a idéia por trás do jogo, é ele que cria o jogo, mas sem contudo dizer COMO fazer na prática para essa ou aquela coisa acontecer. Já o programador é quem vai pegar essa idéia e colocar em prática e, dependendo das ferramentas e recursos que possuir, poderá até adaptar ou vetar alguma coisa por ser inviável. Para evitar isso, é importante que o Game Design tenha ao menos conhecimentos básicos destas ferramentas. Vou dar um exemplo: uma vez eu quis fazer um jogo de teste em que o jogador atirava, mas a sua munição era limitada e acabava depois de um tempo. Eu sabia que a engine permitia um jogo de tiro, mas normalmente esses tiros são ilimitados. A idéia foi lançada, acabou a parte do Game Design, agora entra o Programador pra ver o “COMO”. Bom, eu descobri que no banco de dados de armas era possível desabilitar os tiros, mas não havia um script que fizesse isso, e nem como desabilitar uma tecla, então descobri um script que trocava a arma do atirador, então o que fiz: cadastrei uma nova arma com os tiros desabilitados e outro que fazia a troca quando a munição acabava. Esse foi o trabalho do programador. Muitas vezes, em função da falta de recursos ou pessoal, a equipe tem que ser reduzida e alguns assumem mais de uma função. É normal o Programador também ser o Game design. Então, para que ele possa cumprir bem as suas tarefas ele precisa conhecer bem os recursos e limitações da sua engine, bem como a linguagem de programação usada, assim ele não vai criar algo que depois não pode ser feito, seja porque é realmente impossível ou muito complexo, ou ainda, porque vai pesar muito na máquina... Vamos então criar o nosso jogo pensando nesses conceitos. Faremos um jogo de tiro (para isso existe um modelo pronto, inclusive com o jogador, está em MD2). Neste jogo, teremos uma área para atirar e outra onde faremos a recarga da arma, que descarregará. Usaremos um alvo http://alemdanimacao.zip.net Página 1 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR móvel para acertarmos. O jogo consistirá em acertar o alvo, outro ator MD2 (vou usar o espantalho sofredor, rsrsrsrs!), e para ganhar teremos que acertar uma certa quantidade de tiros nele. Bom, isso é fácil, se a gente tentar, tentar, vai acertar ele, uns mais rápido, outros mais devagar, mas vamos acabar chegando à quantidade de acertos necessária para ganhar, logo, nunca iremos perder! Então, vamos deixar interessante: o jogador começa com certo número de tiros e eles vão acabando à medida em que atiramos e, quando acabarem, temos que recarregar a arma. Aí, para ficar legal, vamos estipular um número de recargas possíveis. Se você ficar sem munição e as recargas estiverem esgotadas, acaba o jogo e você perde! Viu, conhecendo um pouquinho da engine fizemos o nosso trabalho de Game Designer e criamos um jogo viável, agora vamos ver o COMO fazer… Agora é que entra o Programador (Eu mesmo, rsrsrs!). Bom vamos então criar um novo projeto, para isso leia o TUTORIAL 01 – CRIANDO UM PROJETO: http://www.eternix.com.br/pt/3dgamebuilder/Tutorial01.php Crie uma pasta para ele em algum lugar do PC. Vamos chamá-lo de Tiro Certo (ou outro nome qualquer!). Na hora de escolher o tipo, escolha Shooter Dynamic Câmera Game, e como nome do primeiro mapa, escreva INICIALIZAR. Esse mapa tem como função apenas analisar os dados necessários e a partir dele iniciar o jogo. Agora vamos aos dados que precisamos e como armazená-los. 1 – O nome do jogador, é legal personalizar ele. 2 – Sua localização no jogo, existirão duas áreas, uma para atirar e outra para recarregar a arma. 3 – Qual a situação da sua munição 4 – Quantos tiros ele conseguiu acertar. 5 – Quantas recargas já fez. 6 – Quantos tiros foram disparados Como você pode ver, o programador vai ter algum trabalho, rsrsrs, já o modelador nem tanto, porque o 3D Game Builder já tem os modelos necessários prontos! Vejamos agora como se armazenam dados num jogo; existem duas formas, a interna, por meio de Variáveis Globais e a externa, por meio de bancos de dados ou outros arquivos, como de texto. Vamos nos ater apenas ao modo com banco de dados. As variáveis globais são funções que armazenam valores DURANTE a execução do jogo, elas são lidas e alteradas todo o tempo, em função de eventos e scripts, mas uma vez terminado o jogo, elas voltam ao valor inicial, isto é, aquele que foi gravado primeiramente. Por exemplo, se o seu http://alemdanimacao.zip.net Página 2 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR jogador começar com 50 tiros e ao carregar ficar com 100, quando você terminar e fechar o jogo, ao reabrir vai estar com os mesmos 50 tiros... Por serem Globais, elas afetam todo o jogo e não apenas o mapa atual. Para CRIAR ou MODIFICAR uma variável global, usamos o comando WriteGlobalVar e para LER essa variável usamos o comando ReadGlobalVar. Comumente criamos as variáveis no evento ON Create do mapa, de tal forma que isso seja feito apenas um vez e só precisemos mexer quando houver alteração. Para suprir a deficiência da variável global, isto é, ser resetada a cada fim de jogo, seus dados precisam ser armazenados externamente, é aí que entra o banco de dados. O problema do banco de dados é que ele não é lido todo o tempo pelo jogo, para ser acessado é necessário um complexo processo de conexão com ele, e assim que lermos ou alteramos seus dados, que ficarão então armazenados nas variáveis globais, durante todo o jogo, temos que desfazer essa conexão para liberar a memória. Por isso é necessário que o mapa inicial, o inicializar, cumpra essa função. Quando o jogo estiver carregando, primeiro ele vai checar se o banco de dados existe (senão vai dar erro!) e depois, se existir, vai ler os seus dados e gravar nas variáveis globais e, quando acabar, irá desfazer a conexão, liberando a memória (isso é feito no Evento On create desse mapa) só voltando a refazer isso quando resolvermos salvar o jogo. Baixe o banco de dados nesse link: http://www.eternix.com.br/pt/3dgamebuilder/bd_exemplo.zip Este arquivo é um banco de dados “Access” com apenas uma tabela chamada de ator e que possui 3 campos: Id = Integer, Nome = String e Energia = Integer. Antes de criarmos os scripts, vamos criar mais alguns mapas, para isso vá em Menu > Arquivo > Novo Mapa. Vamos chamar esse mapa de ERRO. Esse mapa será chamado caso o banco de dados não seja encontrado. Vamos criar um terceiro mapa, que chamaremos de GAME, ou JOGO. É nele que a ação irá se desenvolver e será carregado caso a verificação veja que o BD (Banco de Dados) existe, uma vez que seus dados poderão ser lidos e copiados. Observe que o mapa um, o inicializar, só vai existir enquanto ele estiver lendo os dados, porque se o BD não existir, o mapa ERRO será carregado e nada mais poderá ser feito e se ele existir, seus dados serão lidos, salvos nas variáveis globais e o mapa GAME será carregado, iniciando o jogo. Temos então o primeiro, INICIALIZAR, o segundo ERRO e o terceiro, GAME. Antes de começarmos a fazer os scripts, precisamos entender algo muito importante na linguagem, sobre conflitos; você sabe que as linhas de código são numeradas, começando em 1 e se estendendo até sei lá quanto. http://alemdanimacao.zip.net Página 3 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Bom, imagine uma situação em que haja um conflito, isto é, dois comandos que não poderiam existir ao mesmo tempo. Vou dar um exemplo: imagine que você faz um script de inteligência artificial em que o espantalho corra em direção a uma árvore e que ao chegar perto dela ele pare de correr e faça uma careta. E imagine que você escreva um outro em que, ao chegar perto de você, ele pare também e faça outro gesto. Até aí tudo bem, mas imagine que você esteja ao lado da árvore! Ele vai chegar perto de vocês dois, os dois scripts estão em conflito, qual ação executar, a da árvore ou a de perto de você? Simples, a que estiver na linha de cima! Isso mesmo, em scripts independentes, não importa a ordem, mas em outros, é importante ver quem vem primeiro. Cuidado com isso! Eu fiz esse comentário porque existirão outras instruções que devem obedecer uma certa ordem de execução. No mapa INICIALIZAR, devemos desabilitar o jogador porque não tem sentido ele se mexer e, somente depois, vamos criar as variáveis globais e escrever o script de leitura do banco de dados. Note que neste mapa não existe GRAVAÇÃO de dados e sim somente leitura, a gravação será feita durante o jogo, em outro mapa e de outra forma. Por isso, os dados que serão lidos no BD devem inicialmente ser iguais ao Default, ou seja, os dados iniciais do jogo, nome inicial, quantidade de munição, etc., e esses mesmos valores devem estar nas variáveis. Mãos à obra então. No primeiro mapa, o INICIALIZAR, vamos criar um piso qualquer, só para que o jogador não caia no infinito. Para isso crie um cubo, altere a escala dele assim: X=200, Y=1, Z=200. É o único objeto a ser criado neste mapa. Se você fez tudo certo até aqui, seu jogo deve estar assim: http://alemdanimacao.zip.net Página 4 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Agora vamos começar a criar os outros elementos dos outros mapas. Nos mapas ERRO e GAME, faça a mesma coisa que foi feita no mapa INICILIZAR, crie o cubo e altere a escala. A diferença é que no mapa ERRO, a gente pára por aqui e no mapa GAME faremos mais coisas. Algumas coisas serão faladas com menos detalhes porque são coisas básicas, que podem ser aprendidas lendo os tutoriais do site: http://www.eternix.com.br/pt/3dgamebuilder/tutoriais.php No mapa GAME, abra o banco de dados Materiais, clique em Grass e altere o Texture Escale dele para 200 em X, Y, e Z. Depois, aplique esse material ao cubo que você criou, ele vai ser o chão do jogo. Neste chão, você vai criar dois cercadinhos, cada um com uma pequena passagem. Eles serão os dois locais aonde o jogador irá ser posicionado. Para fazer as paredes, basta fazer cubos, alterar a sua escala e aplicar algum material a eles. Depois, selecione uma parede e clone ela quatro vezes usando o botão direito do mouse e arrume elas formando o cercadinho, com a passagem no canto de uma das laterais. Esse será o local do “tiro-ao-espantalho”. Depois, pegue a parede original, DUPLIQUE ela usando o botão direito e aplique outro material e a partir desta nova parede monte outro cercado do lado, pode ser com a passagem no outro canto de uma das laterais, assim dificulta um pouco chegar até o local da recarga, que ficará no centro desse cercado. Aplique o Skybox default se quiser. Agora, vamos colocar no primeiro cercado a nossa vítima, o ator MD2 default, o espantalho! Se você fez tudo certo até aqui, seu jogo deve estar mais ou menos assim: http://alemdanimacao.zip.net Página 5 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Vamos fazer um script de inteligência artificial pra ele, a idéia é que ele corra sem parar ao redor do cercado. Para isso, criaremos 4 events área, um em cada canto do cercado do espantalho e criaremos um script de movimentação cíclico. Como são 4 pilares, criaremos uma variável chamada “Rota”, com 4 opções. A cada colisão com um pilar, essa variável terá seu valor mudado. No início do jogo, no evento on create do mapa INICIALIZAR, declararemos essa variável de um jeito que quando for lida, faça o espantalho ir na direção do 1º pilar. Assim, não importa aonde estiver o espantalho, ele vai começar o jogo correndo para o primeiro ponto. Daí, quando ele colidir com o primeiro pilar, automaticamente a variável muda e o programa, ao lê-la, vai apontar o espantalho para o 2º pilar, quando bater no 2º corre pro 3º, quando bater no 3º corre pro 4º e quando bater no 4º volta para o 1° e começa tudo de novo. Eventos de colisão são fáceis de fazer quando é o jogador que colide com o objeto. Para isso, basta fazer o script e colocar no evento OnCollision do objeto, mas quando é algum objeto do jogo, no caso o espantalho, a coisa muda, teremos que usar outras funções, a GetCollidedObject1 e a GetCollidedObject2, no evento On Collision do mapa. Neste evento, a cada colisão, a variável muda. Já no evento OnLoop do espantalho iremos colocar o script de leitura dessas variáveis e seu efeito, isto é, um script que mude a animação, a direção e a força aplicada sobre o espantalho a cada valor da variável Rota. Também precisamos criar dois events área, um na porta de cada cercado, porque quando o jogador passar por ali é que haverá a mudança de lugar, na variável responsável por marcar sua localização. No centro do segundo cercado, colocaremos uma árvore, ela fará a recarga, quando colidirmos. Se você fez tudo certo, seu mapa deve estar assim: http://alemdanimacao.zip.net Página 6 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Os meus 4 events área, responsáveis pelo giro do espantalho, são, começando da porta e girando em sentido anti-horário, respectivamente: Objeto16, Objeto17, Objeto18 e Objeto6. O Espantalho é Ator1. Comecei declarando a variável no evento ON Create do mapa INICIALIZAR: WriteGlobalVar('Rota', 4); Agora, no evento OnCollision do mapa GAME: //---Begin Script Builder: Fazer o espantalho correr para o 2º pilar quando bater no 1º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto16') then begin WriteGlobalVar('Rota', 1); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto16') then begin WriteGlobalVar('Rota', 1); end; end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 3º pilar quando bater no 2º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto17') then begin WriteGlobalVar('Rota', 2); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto17') then begin WriteGlobalVar('Rota', 2); end; http://alemdanimacao.zip.net Página 7 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 4º pilar quando bater no 3º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto18') then begin WriteGlobalVar('Rota', 3); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto18') then begin WriteGlobalVar('Rota', 3); end; end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 1º pilar quando bater no 4º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto6') then begin WriteGlobalVar('Rota', 4); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto6') then begin WriteGlobalVar('Rota', 4); end; end; //---End Script Builder---// http://alemdanimacao.zip.net Página 8 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Agora, no evento OnLoop do espantalho (Ator1): //---Begin Script Builder: Fazer o espantalho correr em volta do cercado---// if ReadGlobalVar('Rota') = 4 then begin if GetObjectAnimation('Ator1') <> '02run0' then SetObjectAnimation('Ator1', '02run0'); PointObjectTo('Ator1', 'Objeto16'); ApplyForce('Ator1', 3000, 0, 0); end else if ReadGlobalVar('Rota') = 1 then begin if GetObjectAnimation('Ator1') <> '02run0' then SetObjectAnimation('Ator1', '02run0'); PointObjectTo('Ator1', 'Objeto17'); ApplyForce('Ator1', 3000, 0, 0); end else if ReadGlobalVar('Rota') = 2 then begin if GetObjectAnimation('Ator1') <> '02run0' then SetObjectAnimation('Ator1', '02run0'); PointObjectTo('Ator1', 'Objeto18'); ApplyForce('Ator1', 3000, 0, 0); end else if ReadGlobalVar('Rota') = 3 then begin if GetObjectAnimation('Ator1') <> '02run0' then SetObjectAnimation('Ator1', '02run0'); PointObjectTo('Ator1', 'Objeto6'); ApplyForce('Ator1', 3000, 0, 0); end; //---End Script Builder---// http://alemdanimacao.zip.net Página 9 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Observe que cada valor da variável faz com que o comando PointObjectTo aponte para um objeto diferente, de tal modo que ele vá na direção dele, colida e altere a variável, o que faz ele apontar para outro objeto, ininterruptamente. O comando GetObjectAnimation é para escolher a animação de correr e o ApplyForce é para aplicar força nele. Para testar, verifique os scripts, salve. Depois vá em Menu > Projeto > Propriedades e altere o mapa inicial para o mapa Game. Depois salve o mapa e rode o jogo. O espantalho vai correr em volta de todo o cercado. Você já poderá atirar nele, mas nada vai acontecer. Se quiser, também vá em projeto, propriedades e na armas do jogador coloque no efeitos “Default”. O tiro vai ficar estilizado, rsrsrsrs! Vamos criar agora os comandos de mudança de mapa e reconhecimento do banco de dados, que é o que nos interessa. Vá agora no mapa INICIALIZAR, vamos declarar as variáveis que irão ser salvas no banco de dados (lembre-se que já declaramos a variável Rota com o comando: WriteGlobalVar('Rota', 4);): Nome do jogador: WriteGlobalVar('IndicadorNome', 'Jogador'); Localização do jogador: WriteGlobalVar('IndicadorLocal', 1); Munição restante: WriteGlobalVar('IndicadorBalas', 80); Acertos no espantalho: WriteGlobalVar('IndicadorAcertos', 0); Recargas Feitas: WriteGlobalVar('IndicadorRecargas', 0); Disparos feitos: WriteGlobalVar('IndicadorDisparos', 0); Essas variáveis serão mostradas por meio de Labels (indicadores visuais) na tela do jogo. Além destas, precisamos de ainda mais uma variável, que seria “ResultadoJogo”, que vai dizer se ganhamos ou perdemos: WriteGlobalVar('ResultadoJogo', 0); Esta variável não irá aparecer na tela, apenas o seu resultado no jogo. Durante a execução do jogo, ela fica em 0. Se você ganha, ela muda para 1 e, com isso, uma mensagem de vitória é exibida na tela. Se você perde, ela muda para 2 e outra mensagem, de derrota, é exibida. Depois eu vou mostrar como fazer o script para isso, mas é importante entender como funciona. O jogo consiste em acertar o espantalho algumas vezes. Você começa batizando o seu jogador (IndicadorNome) e atirando. Como você irá começar na arena 1, você estará no local 1 (IndicadorLocal). Você começa com 80 balas e vai disparando. A cada tiro, a munição irá se consumindo, e a munição restante vai sendo mostrada no Label (IndicadorBalas). Quando ela chega em 0, você não consegue mais atirar e precisa recarregar. Aí vai ter que sair da Arena 1 e ir para a Arena 2, onde tem o carregador. Quando http://alemdanimacao.zip.net Página 10 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR entrar nessa arena 2, vai pisar no event área que tem na porta, e a sua localização irá mudar para 2 (IndicadorLocal). Ao chegar no centro dessa arena, onde tem a árvore, ele irá colidir com ela e isso recarregará a arma, fazendo com que a variável IndicadorBalas volte a 80. Aí você volta para a Arena 1 e automaticamente pisa no event área da porta, alterando a variável IndicadorLocal para 1. Todos os tiros que você der serão registrados pela variável IndicadorDisparos. Para ganhar o jogo e fazer a variável ResultadoJogo mudar de 0 para 1, basta acertar 15 tiros no espantalho, antes de ficar sem munição. Você terá direito a 2 recargas. Se a variável IndicadorRecargas estiver em 2 e a sua munição chegar a 0 (você terá gasto 240 balas, 80 iniciais mais 160 resultantes das 2 recargas a que tem direito), e você não tiver acertado 15 tiros no espantalho, a variável ResultadoJogo muda para 2, o jogo trava e a mensagem FIM DE JOGO é exibida. O script então, no Evento OnCreate do mapa INICIALIZAR, está assim por enquanto: WriteGlobalVar('Rota', 4); WriteGlobalVar('IndicadorNome','Jogador'); WriteGlobalVar('IndicadorLocal', 1); WriteGlobalVar('IndicadorBalas', 80); WriteGlobalVar('IndicadorAcertos', 0); WriteGlobalVar('IndicadorRecargas', 0); WriteGlobalVar('IndicadorDisparos', 0); WriteGlobalVar('ResultadoJogo', 0); Essas variáveis serão salvas no banco de dados ao clicarmos em um botão que iremos criar. Salvaremos todos os dados e a posição do jogador também. Quando o jogo iniciar esses dados serão lidos e reprogramados nas variáveis, de tal forma que se salvarmos o jogo com 40 balas, ao abrir, estaremos com as mesmas 40 balas. Se estivermos na arena 2, iremos começar o jogo na arena 2, e assim por diante. Quando terminarmos o jogo, perdendo ou ganhando, isto é, com a variável ResultadoJogo sendo maior do que 0, o jogo automaticamente salva os dados originais no banco de dados, isto é, a munição volta a 80, as recargas a 2, etc... Desta forma, você pode ver que a hora que quiser pode parar o jogo no estado em que está e voltar depois, recomeçando de onde parou. Vamos agora trabalhar nosso banco de dados. Primeiro renomeie ele para BD_TIRO. Depois, abra ele, e no campo (coluna) ID, coloque na primeira linha 1, na segunda 2 e na terceira 3, automaticamente será criada uma quarta linha com zero, mas não se preocupe. http://alemdanimacao.zip.net Página 11 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Altere o nome “Teste” na primeira linha do campo Nome para “Jogador”. Nesta mesma linha, no campo Energia, vamos gravar o valor da variável IndicadorLocal como 1. Agora vamos para a linha 2. No campo Nome desta linha, grave o valor da variável IndicadorBalas, 80, e no campo Energia o valor da variável IndicadorAcertos, 0. Finalmente, vá para a linha 3 e no campo Nome desta linha, grave o valor da variável IndicadorRecargas, 0 e no campo Energia o valor da variável IndicadorDisparos, 0. Salve e feche. Coloque esse banco no Disco local “C:”. Com isso, você tem os valores iniciais que precisa para trabalhar, tanto nas variáveis globais que vai declarar, quanto no banco de dados. Note que a primeira e a última não precisam ser gravadas, a primeira é só pra dar a partida no espantalho, depois ele se vira sozinho, isso nunca muda, acontece somente DURANTE o jogo, e a última é o resultado do jogo, que só poderá mudar DURANTE o jogo, e uma vez alterada, ela mesma se encarrega de alterar os valores do banco de dados, resetando tudo. Vamos agora criar no jogo os labels e elementos que irão exibir as mudanças de variáveis (pra você ver como mudam e como são salvas!). Veja bem, o posicionamento desses elementos pode variar, mas eles precisam existir. Vá no menu Objetos > GUI Objects. Eu optei por colocar duas placas embaixo, à esquerda eu criei um objeto tipo Panel, com 120 x 200, e sobre ele coloquei os 6 indicadores que preciso, usando LB Labels (batizei seus nomes com os mesmos das variáveis pra facilitar): IndicadorNome (nome do objeto) – JOGADOR: (caption, nome na tela) IndicadorLocal – ARENA: IndicadorBalas – MUNIÇÃO: IndicadorAcertos – ACERTOS: IndicadorRecargas – RECARGAS: IndicadorDisparos – DISPAROS: IndicadorAcertos – ACERTOS: À direita, embaixo, eu criei um objeto Form, com 120 x 200, modifiquei o Caption (o texto exibido) para “SALVAR DADOS” e sobre ele coloquei um objeto tipo Edit com Caption “NOVO NOME” e um Button, com o Caption “SALVAR”. Posicionei eles de tal forma que, durante o jogo, eles não comprometam a visão geral, mas é possível depois ocultar esses objetos. Se você fez tudo certo até aqui, seu projeto deve estar assim: http://alemdanimacao.zip.net Página 12 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Eu posicionei eles de tal forma que na janela do jogo cada um fique num cantinho embaixo. Está na hora de começar a fazer o jogo começar de forma certa, pelo mapa INICIALIZAR. Mas então já teremos que ter um script que mude o mapa para o mapa GAME, onde vai acontecer jogo. Vamos colocar também um script pra mudar o nome “GAME” que aparece em cima da janela, usando a função SetWindowCaption. Vamos também já fazer um script PROVISÓRIO de mudança de mapa, isto é, porque ainda não fizemos o script de leitura do banco, apenas ele checa se o banco existe ou não. Se ele existe, carrega o mapa GAME, se não existe, carrega o mapa ERRO. O código completo, no evento ON CREATE do Mapa INICIALIZAR, por enquanto ficou assim: SetWindowCaption('TIRO CERTO'); DisablePlayerMove; WriteGlobalVar('Rota', 4); WriteGlobalVar('IndicadorNome','Jogador'); WriteGlobalVar('IndicadorLocal', 1); WriteGlobalVar('IndicadorBalas', 80); WriteGlobalVar('IndicadorAcertos', 0); WriteGlobalVar('IndicadorRecargas', 0); WriteGlobalVar('IndicadorDisparos', 0); WriteGlobalVar('ResultadoJogo', 0); http://alemdanimacao.zip.net Página 13 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR if (FileExists('C:\BD_TIRO.mdb')= false) then begin ShowLoadingScreen('LoadScreen', '', 0, 0); LoadMap('ERRO.gbm', 0, 3, 0, 10); end else if (FileExists('C:\BD_TIRO.mdb')= true) then begin LoadMap('GAME.gbm', 0, 3, 0, 10); end; A função “FileExists” checa se o banco de dados BD_TIRO está mesmo no disco local “C:” e retorna verdadeiro ou falso. Se falso, carrega uma textura qualquer (crie um material cadastrado com o nome de LoadScreen) e o mapa ERRO (veja o tutorial de mudança de mapa: http://www.eternix.com.br/pt/3dgamebuilder/Tutorial13.php ). Se retornar verdadeiro, o mapa GAME é carregado. Note que a segunda instrução deste mapa é o comando DisablePlayerMove, que paralisa o jogador, que não tem que fazer nada neste mapa. Então, se o mapa erro for carregado, como lá não acontece nada também, não precisamos reabilitar o Player, mas se o mapa GAME for carregado, precisamos reativá-lo. Para isso, no evento ON Create do mapa Game coloque o seguinte comando: EnablePlayerMove; Desta forma, o Player será reativado. Já podemos ir nas propriedades do projeto e colocar como mapa inicial o INICIALIZAR. Se você tirar o BD_TIRO do disco local C:, o jogo não iniciará, mas se deixar, ele vai iniciar e ficará assim: http://alemdanimacao.zip.net Página 14 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Vamos começar a fazer as variáveis aparecerem na tela. Uma vez que elas já existem, vamos fazer com que os LB labels as mostrem. Para isso, você deve colar os seguintes códigos no evento MainLoop do mapa GAME (esse evento ocorre durante todo o jogo): //---Mostrar as variáveis nos Labels correspondentes---// SetLabelText('IndicadorNome', 'JOGADOR:' +ReadGlobalVar('IndicadorNome')); SetLabelText('IndicadorLocal', 'ARENA:' +IntToStr(ReadGlobalVar('IndicadorLocal'))); SetLabelText('IndicadorBalas', 'MUNIÇÃO:' +IntToStr(ReadGlobalVar('IndicadorBalas'))); SetLabelText('IndicadorAcertos', 'ACERTOS:' +IntToStr(ReadGlobalVar('IndicadorAcertos'))); SetLabelText('IndicadorRecargas', 'RECARGAS:' +IntToStr(ReadGlobalVar('IndicadorRecargas'))); SetLabelText('IndicadorDisparos', 'DISPAROS:' +IntToStr(ReadGlobalVar('IndicadorDisparos'))); //---End Script Builder---// Observem a segunda linha; SetLabelText é o comando para mostrar no label um texto. O primeiro nome IndicadorLocal é o nome do meu objeto label (lembra que renomeamos eles pra ficar mais fácil de achar?), a palavra ARENA: é o texto que já existe lá e ao invés de modificá-lo, apenas acrescentamos o texto complementar, igual ao valor da variável (por isso tem o sinal de “+”). Como essas variáveis estão exibindo números (Integer), eles precisam ser convertidos para o formato correto de string, pra isso tem o comando IntToStr. Finalmente, o valor a ser convertido é o da variável IndicadorLocal, que é lido através do comando ReadGlobalVar. Eu falei da segunda linha, porque ela é igual às outras quatro que vem logo abaixo, todas tem o comando IntToStr, menos a primeira linha. Isso acontece porque o valor da variável IndicadorNome não é um número (Integer) e sim uma String, e por isso é lido direto, sem necessitar de conversão. Olha que lindo que ficou com os valores nos Labels: http://alemdanimacao.zip.net Página 15 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Bom, agora vamos criar os eventos que irão alterar as variáveis. É o último passo antes de gravá-los e lê-los no banco. Vamos começar com os fáceis, alterar a variável IndicadorLocal (isso porque mudar o nome do jogador implica num comando mais chato). Para mudar a variável é só ir colocar o comando de alteração no evento oncolision dos events área que ficam nas passagens dos cercados. Vá no evento oncolision do event área na porta da Arena 1, onde está o espantalho, e coloque o código: WriteGlobalVar('IndicadorLocal', 1); Depois, vá no evento oncolision do event área na porta da Arena 2, onde está a árvore, e coloque o código: WriteGlobalVar('IndicadorLocal', 2); Rode o jogo e passe de um cercado para o outro e observe a mudança no label ARENA! Esse é um bom exercício com variáveis. Vamos então criar o restante dos scripts que tem a ver com os tiros. Antes disso, devemos criar uma nova arma para o atirador, só que sem balas! Para isso, clique no link e baixe o arquivo shooteractor: http://www.eternix.com.br/temp/shooteractor.rar Esse arquivo possui os arquivos MD2 do atirador e sua arma. Descompacte os dois dentro da pasta raiz do seu jogo, ou dentro da pasta data ou ainda, crie uma nova pasta. Depois, vá em Menu > Projeto > Armas do ator principal. Nesse editor, crie uma nova arma, chame de Arma02 e com o botão LOAD localize o arquivo Shotgun.md2. Depois, vá até o a caixa Tiro e em enabled marque false. Com isso, essa nova arma fica sem poder atirar. Vamos fazer agora o script que fará com que a cada tiro a variável global IndicadorAcertos seja alterada. É parecido com aquele de colisão do espantalho com os pilares (events área) e também deve ser colocado no Evento ON Collision do mapa GAME (depois do script de colisão do espantalho com os pilares, que já está lá): //---Begin Script Builder: Alterar a Variável Global IndicadorAcertos em função de cada acerto no espantalho---// if Copy(GetCollidedObject1(), 0, 6) = 'Bullet' then begin if (GetCollidedObject2 = 'Ator1') then begin WriteGlobalVar('IndicadorAcertos', ReadGlobalVar('IndicadorAcertos')+1); end; end; if Copy(GetCollidedObject2(), 0, 6) = 'Bullet' then http://alemdanimacao.zip.net Página 16 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR begin if (GetCollidedObject1 = 'RoboPrincipal') then begin WriteGlobalVar('IndicadorAcertos', ReadGlobalVar('IndicadorAcertos')+1); end; end; //---End Script Builder---// O script analiza a colisão entre o objeto disparado pelo jogador (Bullet) e o nosso espantalho, o Ator1. A cada colisão, a variável IndicadorAcertos passa a ser igual à leitura dela mesma ReadGlobalVar('IndicadorAcertos') com 1 (+1). É assim que alteramos (WriteGlobalVar) a variável a cada evento, poderia ser +10, -3, etc... Rode o jogo e teste. Ah, uma observação, durante esse tutorial, nosso 3D Game Builder foi atualizado da versão 1.5, onde começamos, para a 1.6. Com isso, não podemos mais usar “Ç” e nem acentos, então o nome “MUNIÇÃO” que estava no Label virou “MUNIO”, então teremos que alterar ele para BALAS, no Caption do Label! Se você fez tudo certo até aqui, ao acertar o espantalho você verá o Label ACERTOS mudar de 0 para 1 e assim sucessivamente a cada acerto: http://alemdanimacao.zip.net Página 17 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Vamos mexer agora na variável IndicadorDisparos. E também na variável IndicadorBalas, uma vez que ambas dependem do mesmo evento, ou seja, o disparo do tiro. Enquanto a IndicadorDisparos vai aumentar, a IndicadorBalas vai diminuir até chegar em 0. Como esse evento se desenrola durante o jogo, esse script deve ser colocado no evento MainLoop do mapa GAME: //---Begin Script Builder: Descarregar a arma e alterar as variáveis Indicador Disparos e Indicador Balas conforme a execução da animação attack---// if (ReadGlobalVar('IndicadorBalas') >0) and (ReadGlobalVar('IndicadorBalas') <=80) then begin If (GetObjectAnimation('mainActor') ='attack') then begin WriteGlobalVar('IndicadorDisparos', ReadGlobalVar('IndicadorDisparos')+1); end end; if (ReadGlobalVar('IndicadorBalas') >0) then begin If (GetObjectAnimation('mainActor') ='attack') then begin WriteGlobalVar('IndicadorBalas', ReadGlobalVar('IndicadorBalas')-1); end end; //---End Script Builder---// Funciona assim: primeiro ele checa se a variável está entre os valores 0 e 80, menos que isso não pode disparar por falta de munição e mais que isso não pode porque é o máximo possível. O termo “and” quer dizer “e” e diz que as duas condições precisam ser respeitadas para que a ação ocorra. Se ambas estão satisfeitas, ele checa a animação do ator principal e se for “attack”, ela altera a variável IndicadorDisparos somando 1 a cada disparo. Note que esse script poderia ser feito em função de teclarmos a barra de espaço, que é responsável pelo tiro, para isso usaríamos o comando IsKeyPress, mas ocorre um problema porque essa tecla tem um nome esquisito, 0x20, e se usamos esse termo no script, a verificação o rejeita... Então, para contornar isso, usamos a referência da animação attack, afinal toda vez que o jogador vai disparar, ele precisa executar ela! http://alemdanimacao.zip.net Página 18 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Bom, agora que fizemos o indicador disparos aumentar a cada tiro, vamos fazer com que a munição acabe, e para isso tem a segunda parte do script; primeiro ele checa se tem balas ainda (if (ReadGlobalVar('IndicadorBalas') >0 ), se tiver, a cada tiro (execução da animação attack), ele diminui a variável IndicadorBalas em -1. Se você fez tudo certo, vai observar que a cada tiro, o label MUNIO (aqui ocorreu um pequeno BUG, eu alterei o caption do label para BALAS, mas durante a execução do jogo ele não mudou, depois eu tento deletar esse label e colocar outro pra ver se resolve...) diminui e o Disparos aumenta! Se você acertar o espantalho sofredor, o label ACERTOS vai contar seus pontos. Mas você vai ver algo estranho, apesar da contagem estar certa, quando acabarem as balas (80 disparos), não haverão mais alterações nos Labels, mas o jogador continuará disparando, e é para isso que vamos criar agora um script que troque a arma dele por uma arma descarregada assim que acabar a munição (lembra que você criou uma Arma02, com os tiros desabilitados?). Ainda no evento MainLoop do mapa GAME, copie e cole esse script: //---Begin Script Builder: Desabilitar disparos da Arma quando descarregada---// if (ReadGlobalVar('IndicadorBalas') <= 0) then begin LoadMainActorWeapon('Arma02'); end; //---End Script Builder---// Observe que enquanto a variável IndicadorBalas estiver > 0, a arma usada é a Arma01, que tem seus disparos habilitados, e assim que ela chega em 0, uma nova arma é carregada, a Arma02, que não pode atirar, por meio do comando LoadMainActorWeapon. Agora acaba a munição e ele não pode mais atirar. Experimente atirar até acabar a munição, ele tem que parar de atirar. Bom, agora vamos ao evento que vai recarregar a arma. Lembra que isso aconteceria ao colidirmos com a árvore? Então vamos a ela, selecione-a e clique em Eventos > OnCollision e cole o seguinte script: //---Begin Script Builder: Recarregar a arma SE estiver descarregada e contar as recargas, com um limite de 2---// if (ReadGlobalVar('IndicadorBalas') < 80) then begin if (ReadGlobalVar('IndicadorRecargas') <2) then begin http://alemdanimacao.zip.net Página 19 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR WriteGlobalVar('IndicadorRecargas', (ReadGlobalVar('IndicadorRecargas')+1)); WriteGlobalVar('IndicadorBalas', 80); LoadMainActorWeapon('Arma01'); end end; //---End Script Builder---// Esse script faz o seguinte: primeiro ele checa se a variável é menor que 80 (if (ReadGlobalVar('IndicadorBalas') < 80)), isto é, você está com arma abaixo da carga máxima. Note que mesmo que ela não esteja totalmente descarregada você poderá fazer uma recarga. Se ela estiver cheia, não, o evento não pode ocorrer. Isso é bom pra evitar que a colisão faça a variável IndicadorRecargas disparar feito doida. Então cuidado pra não desperdiçar munição recarregando tendo ainda algumas balas! Depois ele checa se você não estourou o limite de recargas, que é 2 (if (ReadGlobalVar('IndicadorRecargas') <2)). Você só pode recarregar se não tiver feito nenhuma, 0 ou tiver feito só 1. Se essas condições foram satisfeitas, então a variável IndicadorRecargas vai ter somado a ela o valor 1(WriteGlobalVar('IndicadorRecargas', (ReadGlobalVar('IndicadorRecargas')+1));) a arma será recarregada porque a variável IndicadorBalas terá seu valor alterado pra 80 (WriteGlobalVar('IndicadorBalas', 80);) e a Arma01 é carregada por meio do script: LoadMainActorWeapon('Arma01'); . Vamos então aos testes: 1 – Inicie o jogo e não dê nenhum tiro. Vá até a árvore e colida com ela. Nada deve acontecer. 2 – Dê alguns tiros e antes que a munição se acabe, colida com a árvore; a munição deve ser recarregada até 80, indicando no Label Munio:80, e a variável IndicadorRecargas vai mudar pra 1, também indicado no Label Recargas. 3 – Agora que você viu que pode recarregar, descarregue a arma mais uma vez e observe que não consegue mais atirar. Aí, colida de novo com a árvore, recarregando novamente a arma. Note que o Label Recargas vai mudar pra 2. 4 – Você está no limite das recargas, então descarregue a arma de novo e tente colidir com árvore novamente. Você não poderá mais recarregar... Se os testes deram certo, você deverá ver os Labels mais ou menos assim: http://alemdanimacao.zip.net Página 20 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Observe que o label Disparos chegou a 124. O que limita ele é apenas a sua munição. Você deve estar se perguntando o que aconteceu com a árvore! Será que o tutorial demorou tanto pra sair que ela secou? KKKKK! Não, é que o Edirlei me explicou que a árvore do jogo é bastante pesada, então, para economizar minha pobre CPU, eu optei por essa árvore seca! Só copiei o evento OnCollision dela para esta nova árvore. E o Label Munio ainda continua errado... Bom, com isso já criamos todos os eventos para o funcionamento do jogo (pode ser jogado, mas não salvo), exceto um, que é o resultado do jogo. Bom, vamos criar então mais 3 GUI Objects. Um é um Panel de 80 x 300. Nele coloquei 2 Labels, em cima coloque: “VOCÊ VENCEU O JOGO!” e embaixo coloquei: “FIM DE JOGO! VOCÊ PERDEU!” Veja como ficou: http://alemdanimacao.zip.net Página 21 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Para que esses novos elementos não sejam mostrados, vá até o evento ONCreate do mapa GAME e cole o seguinte script: //---Begin Script Builder: Ocultar as mensagens de final de jogo---// HideObject('Panel0'); HideObject('Label0'); HideObject('Label1'); //---End Script Builder---// Esses são os nomes dos 3 novos GUI Objects que eu criei. Antes de fazer o script do resultado do jogo, vamos agora ao que mais interessa, que é lidar com o banco de dados. Vamos criar agora um script de leitura dele, que vai transferir os dados para as variáveis. É importante que você entenda o processo de desenvolvimento do jogo e não apenas decore códigos. Até aqui você viu que existem elementos que não precisam ser salvos e outros que sim. Aqueles elementos que você quer salvar devem ser traduzidos para variáveis globais. Se você quer que o personagem tenha magia, coloque um valor em uma variável, se quer salvar a posição, marque posições estratégicas e grave na variáveis, se ele muda de estado (paralizado ou não), o evento também pode ser traduzido como uma variável. É isso que você tem que entender, antes de tentar salvar algo, defina como armazenar a informação em forma de variável e depois sim salve. Vamos começar com a leitura dos dados. Esse evento é colocado no evento On Create do primeiro mapa, o INICIALIZAR. Esse script é baseado no tutorial 15 e muitas explicações serão copiadas dele: http://www.eternix.com.br/pt/3dgamebuilder/Tutorial15.php Bom, nós já alteramos o nosso banco de dados e salvamos no disco local C:\. Veja como ele deve estar: A idéia é criar primeiro checar a existência dele, se não existir carregamos o mapa erro. Depois, se ele existir, fazemos a conexão, lemos, alteramos as variáveis e fechamos. Depois, se tudo estiver certo, carregamos o mapa GAME. Vou escrever o primeiro script e depois explicar, porque temos que testá-lo antes de passar para uma segunda etapa, que é posicionar o jogador ora num local, ora em outro. Copie e cole esse código http://alemdanimacao.zip.net Página 22 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR no evento ON Create do Mapa INICIALIZAR substituindo tudo que estava lá antes: SetWindowCaption('TIRO CERTO'); DisablePlayerMove; WriteGlobalVar('Rota', 4); WriteGlobalVar('IndicadorNome','Jogador'); WriteGlobalVar('IndicadorLocal', 1); WriteGlobalVar('IndicadorBalas', 80); WriteGlobalVar('IndicadorAcertos', 0); WriteGlobalVar('IndicadorRecargas', 0); WriteGlobalVar('IndicadorDisparos', 0); WriteGlobalVar('ResultadoJogo', 0); if (FileExists('C:\BD_TIRO.mdb')= false) then begin ShowLoadingScreen('LoadScreen', '', 0, 0); LoadMap('ERRO.gbm', 0, 3, 0, 10); end; if (FileExists('C:\BD_TIRO.mdb')= true) then begin var Conn: TADOConnection; var DataSet: TADODataset; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); DataSet:=Conn.Execute('select nome, energia from ator where id = 1'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorNome', DataSet.FieldAsString[0]); WriteGlobalVar('IndicadorLocal', DataSet.FieldAsVariant[1]); end; http://alemdanimacao.zip.net Página 23 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR DataSet:=Conn.Execute('select nome, energia from ator where id = 2'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorBalas', DataSet.FieldAsVariant[0]); WriteGlobalVar('IndicadorAcertos', DataSet.FieldAsVariant[1]); end; DataSet:=Conn.Execute('select nome, energia from ator where id = 3'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorRecargas', DataSet.FieldAsVariant[0]); WriteGlobalVar('IndicadorDisparos', DataSet.FieldAsVariant[1]); end; DataSet.free; Conn.free; end; LoadMap('GAME.gbm', 0, 3, 0, 10); Vamos agora analisar o script linha por linha: SetWindowCaption('TIRO CERTO'); Muda o nome Game da janela do jogo na execução. DisablePlayerMove; Desabilita o jogador, não é necessário movimentos nesse mapa. WriteGlobalVar('Rota', 4); WriteGlobalVar('IndicadorNome','Jogador'); WriteGlobalVar('IndicadorLocal', 1); WriteGlobalVar('IndicadorBalas', 80); WriteGlobalVar('IndicadorAcertos', 0); WriteGlobalVar('IndicadorRecargas', 0); WriteGlobalVar('IndicadorDisparos', 0); WriteGlobalVar('ResultadoJogo', 0); http://alemdanimacao.zip.net Página 24 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Conforme explicado antes, são as declarações das variáveis que precisamos if (FileExists('C:\BD_TIRO.mdb')= false) then begin ShowLoadingScreen('LoadScreen', '', 0, 0); LoadMap('ERRO.gbm', 0, 3, 0, 10); end; Conforme explicado antes, se o arquivo do banco de dados não existir, o mapa ERRO é carregado. if (FileExists('C:\BD_TIRO.mdb')= true) then begin Se banco de dados for localizado, executar o seguinte script (conexão com o BD): var Conn: TADOConnection; (Declara um objeto do tipo “TADOConnection”, ele é responsável pela conexão com o banco de dados) var DataSet: TADODataset; (Declara um objeto do tipo “TADODataSet”, ele é responsável por utilizar os dados provenientes da conexão) Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); (Cria o objeto “Conn” definindo a String de conexão com o banco de dados, esta string de conexão é a mesma utilizada pelos objetos da paleta “ADO” ou “DBGo” do Delphi, no exemplo utilizei o provider “Microsoft.Jet.OLEDV.4.0” e o caminho para o arquivo no parâmetro “Data Source”, existem outros parâmetros que podem ser utilizados, como por exemplo o usuário e senha do banco, para saber mais sobre estes parâmetro consulte a ajuda do Delphi ou algum outro documento disponível na internet). Observe o caminho para o arquivo, C:\ , o nome e a extensão, tem que estar tudo certinho. DataSet:=Conn.Execute('select nome, energia from ator where id = 1'); (Inicializa o objeto “DataSet” definindo a String do comando SQL que será executado pelo objeto “Conn” no banco de dados, no comando SQL é selecionado o campo “nome” e “energia” do registro com o “id = 1” da tabela ator). Observe que para cada linha (id) tem um comando desses. if DataSet.RecordCount <> 0 then http://alemdanimacao.zip.net Página 25 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR (Caso a consulta tenha retornado algum registro para o “DataSet”, isto é, se existe algo lá, mesmo que seja 0) begin WriteGlobalVar('IndicadorNome', DataSet.FieldAsString[0]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorNome com o valor já como String na posição 0 do “DataSet”. Note que para string (nome) usei o comando FieldAsString para ler os dados no banco) WriteGlobalVar('IndicadorLocal', DataSet.FieldAsVariant[1]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorLocal com o valor já como Variant na posição 1 do “DataSet”. Note que para Variant (número) usei o comando FieldAsVariant para ler os dados no banco) end; DataSet:=Conn.Execute('select nome, energia from ator where id = 2'); (Inicializa o objeto “DataSet” definindo a String do comando SQL que será executado pelo objeto “Conn” no banco de dados, no comando SQL é selecionado o campo “nome” e “energia” do registro com o “id = 2” da tabela ator). Observe que para cada linha (id) tem um comando desses. if DataSet.RecordCount <> 0 then (Caso a consulta tenha retornado algum registro para o “DataSet”, isto é, se existe algo lá, mesmo que seja 0) begin WriteGlobalVar('IndicadorBalas', DataSet.FieldAsVariant[0]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorBalas com o valor já como Variant na posição 1 do “DataSet”. Note que para Variant (número) usei o comando FieldAsVariant para ler os dados no banco) WriteGlobalVar('IndicadorAcertos', DataSet.FieldAsVariant[1]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorAcertos com o valor já como Variant na posição 1 do “DataSet”. Note que para Variant (número) usei o comando FieldAsVariant para ler os dados no banco) end; http://alemdanimacao.zip.net Página 26 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR DataSet:=Conn.Execute('select nome, energia from ator where id = 3'); (Inicializa o objeto “DataSet” definindo a String do comando SQL que será executado pelo objeto “Conn” no banco de dados, no comando SQL é selecionado o campo “nome” e “energia” do registro com o “id = 3” da tabela ator). Observe que para cada linha (id) tem um comando desses. if DataSet.RecordCount <> 0 then (Caso a consulta tenha retornado algum registro para o “DataSet”, isto é, se existe algo lá, mesmo que seja 0) begin WriteGlobalVar('IndicadorRecargas', DataSet.FieldAsVariant[0]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorRecargas com o valor já como Variant na posição 1 do “DataSet”. Note que para Variant (número) usei o comando FieldAsVariant para ler os dados no banco) WriteGlobalVar('IndicadorDisparos', DataSet.FieldAsVariant[1]); (Utiliza o comando “WriteGlobalVar” para alterar a variável IndicadorDisparos com o valor já como Variant na posição 1 do “DataSet”. Note que para Variant (número) usei o comando FieldAsVariant para ler os dados no banco) end; DataSet.free; (Destrói o objeto “DataSet” liberando-o do da memória) Conn.free; (Destrói o objeto “Conn” liberando-o do da memória) end; LoadMap('GAME.gbm', 0, 3, 0, 10); Depois de todas as variáveis atualizadas, carrega o mapa GAME. Até então eu não estou usando script pra posicionar o ator principal. Para isso, usarei as coodenadas X,Y e Z que tem logo após nome do mapa. Se eu quisesse posicionar outro objeto, usaria o comando SetObjectPosition. Estude o tutorial http://www.eternix.com.br/pt/3dgamebuilder/Tutorial15.php e analise quais elementos eu usei e quais eu alterei para chegar ao resultado que eu quis. Antes de posicionar o Player, vamos testar o script para ver se está tudo certo. Lembra dos valores que gravamos no banco? Se tudo estiver certo, eles tem que alterar as variáveis e mostrá-las nos labels: http://alemdanimacao.zip.net Página 27 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Bom, parece que está tudo certo, mas como os valores do banco são os mesmos das variáveis, talvez ele não esteja lendo nada, apesar do script ter sido aprovada pela verificação. Para testar, o único jeito é alterar os dados no banco e rodar o jogo. Então, abra o banco e altere os dados assim: Se tudo estiver certo, quando rodarmos, esses novos valores terão que aparecer: http://alemdanimacao.zip.net Página 28 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Bingo! Os valores foram alterados! Logo, a conexão e a leitura do banco de dados foi perfeita, as variáveis gravadas no banco alteraram as do jogo! Agora, vamos fazer a última instrução do mapa INICIALIZAR, que é carregar o mapa GAME com a posição do jogador principal ora num lugar, ora no outro. Isso é feito por meio da análize da variável IndicadorLocal. O valor 1 indica a arena 1, do espantalho, e o valor 2 a arena 2, da árvore. Quando termina a leitura do banco, a conexão se fecha e as variáveis estão prontas para serem usadas. Então, basta fazer um script em função dela; antes, porém, é necessário anotar a posição onde queremos que o jogador apareça. Nas propriedades do projeto, o valor X=0, Y=3 e Z=0. Y é a altura, então não vamos mexer, apenas em X e Z. Para isso, crie um cubo e coloque ele onde você quiser que o jogador apareça no mapa 1. Depois anote as suas coordenadas. Então, faça o mesmo na arena 2 e anote. Para a Arena 1 eu achei X= -11 e Z=3. Na Arena 2 eu achei X=-14 e Z=33. Então, no evento ON Create do mapa INICIALIZAR, substitua o script de carregar o mapa game que está lá (LoadMap('GAME.gbm', 0, 3, 0, 10);) por esse: if (ReadGlobalVar('IndicadorLocal') =1) then begin LoadMap('GAME.gbm', -11, 3, 3, 10); end else if (ReadGlobalVar('IndicadorLocal') =2) then begin LoadMap('GAME.gbm', -14, 3, 33, 10); end; Com isso fechamos o script. Se a variável está em 1, carrega-se o mapa Game com o jogador na posição -11,3,3. Se a variável está em 2, a posição muda para -14,3,33. Para testar isso, rode o jogo com a variável IndicadorLocal em 1 e veja onde o Player vai aparecer. Depois, feche o jogo, abra o banco de dados e na primeira linha, campo energia, altere o valor de 1 para 2. Salve e feche. Agora rode o jogo e veja onde ele aparece! Com isso você pode ver que podemos salvar a posição de objetos do jogo, basta que essas posições sejam gravadas em variáveis globais e existam scripts que as leiam corretamente. Agora que criamos o script de leitura de dados, vamos fazer o de gravação. Esse script vai ser feito no evento On Interact do botão salvar. Basicamente, bastaria gravar todas as variáveis globais no banco de dados. Mas para complicar nossa vida eu incluí um campo que permite alterar esse nome e ele também é salvo, na forma de variável Global. Então, o processo é gravar primeiro o nome na variável e depois, no mesmo evento, http://alemdanimacao.zip.net Página 29 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR estabelecer a conexão com o banco, gravar os dados (inclusive do nome novo) e desfazer a conexão. Para que esse assunto possa ser compreendido, vamos fazer o script em duas partes, primeiro vamos apenas lançar o novo nome na variável global IndicadorNome e testar. Para isso, clique no botão salvar que você criou e no evento oninteract copie e cole esse script: WriteGlobalVar('IndicadorNome', GetEditText('Objeto20')); Lembre-se que Objeto20 é o nome do meu objeto tipo Edit, onde você vai escrever o nome. Se o seu tiver outro nome, mude. Salve e rode o jogo. Depois, vá nele, onde está “NOVO NOME” e escreva um nome qualquer e clique em salvar. Você vai ver que o Label JOGADOR: vai exibir o mesmo nome que você digitou. Você pode fazer isso a qualquer hora. Significa que o nome foi gravado na variável Global IndicadorNome, cujo valor é a leitura do comando GetEditText, mas só vai ficar lá durante o jogo. Quando ele for encerrado e aberto de novo, o nome que vai aparecer é aquele que está salvo no banco de dados, “Jogador”. Veja como ficou: Finalmente, vamos partir para o script que vai gravar as variáveis globais no banco de dados. Ele vai ficar no mesmo evento oninteract do botão salvar, só que depois desse que já colocamos. Lembre, primeiro grava na variável e depois no banco. Esse script é uma variação daquele outro de leitura, primeiro a gente estabelece uma conexão com o banco de dados, grava as variáveis e desfaz a conexão. Aí, uma vez com tudo salvo http://alemdanimacao.zip.net Página 30 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR no banco, da próxima vez em que ele for iniciado, durante o carregamento do mapa INICIALIZAR, os dados serão retransferidos para as variáveis. Vou colocar o script e depois explicar; copie e cole todo esse código substituindo tudo o que estiver no evento Oninteract do seu botão salvar: //---Begin Script Builder: Alterar a Variável Global IndicadorNome com o nome do jogador e gravar as 6 variáveis no banco de dados antes do encerramento do jogo---// if (ReadGlobalVar('ResultadoJogo') =0) then begin WriteGlobalVar('IndicadorNome', GetEditText('Objeto20')); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorLocal')) + ' where id = 1'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorBalas')) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorAcertos')) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorRecargas')) + ' where id = 3'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorDisparos')) + ' where id = 3'); Conn.Close; Conn.Free; end; //---End Script Builder---// Vamos agora analisar o script linha por linha: //---Begin Script Builder: Alterar a Variável Global IndicadorNome com o nome do jogador e gravar as 6 variáveis no banco de dados antes do encerramento do jogo---// if (ReadGlobalVar('ResultadoJogo') =0) then begin Checa a variável ResultadoJogo para ver se o jogo ainda não foi finalizado. Se o jogador ganha ela muda pra 1 e se perde muda pra 2. Com a finalização do jogo e a mudança da variável, não é possível salvar mais nada e o jogo é resetado automaticamente. WriteGlobalVar('IndicadorNome', GetEditText('Objeto20')); Altera a variável IndicadorNome em função do texto que está no Objeto20, por meio do comando GetEditText var Conn: TADOConnection; (Declara um objeto do tipo “TADOConnection”, ele é responsável pela conexão com o banco de dados) Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); http://alemdanimacao.zip.net Página 31 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR (Cria o objeto “Conn” definindo a String de conexão com o banco de dados assim como foi explicado anteriormente no script de leitura de dados) Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=1” (linha 1) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorLocal')) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=1” (linha 1) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorBalas')) + ' where id = 2'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=2” (linha 2) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorAcertos')) + ' where id = 2'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=2” (linha 2) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorRecargas')) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=3” (linha 3) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorDisparos')) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=3” (linha 3) para o valor que for lido na variável IndicadorNome e adaptado corretamente pelo comando QuotedStr) Conn.Close; (Fecha a conexão com o banco de dados) Conn.Free; (Destrói o objeto “Conn” liberando-o do da memória) end; //---End Script Builder---// Finalmente finalizamos esse script de salvamento, mas ainda não terminou. Isso porque o jogo ainda não pode ser finalizado. Farei agora o último script, aquele que altera a variável ResultadoJogo. Não basta apenas mostrar as mensagens, é necessário que os valores originais sejam restaurados, as recargas fiquem em 0, os disparos fiquem em 0, etc... Só o nome é que não vou resetar. Esse é um script que ocorre durante o jogo, logo deverá ser colocado no evento MainLoop do mapa http://alemdanimacao.zip.net Página 32 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR GAME. Basicamente temos que primeiro alterar a variável ResultadoJogo e depois, em função dela, fazer as outras funções, que é paralisar o Jogador, mostrar as mensagens e resetar os valores NO Banco de dados, eles não vão aparecer nos Labels, exceto quando o jogo for reiniciado. Vamos a ele então (esse script deve ser colocado após o script que já está no evento mainloop do mapa GAME): //---Begin Script Builder: Alterar a variável ResultadoJogo para 1 em caso de vitória e 2 em caso de derrota---// if (ReadGlobalVar('IndicadorAcertos') =15) (ReadGlobalVar('IndicadorBalas') >=0) then and (ReadGlobalVar('IndicadorRecargas') <2) and begin WriteGlobalVar('ResultadoJogo', 1); end else if (ReadGlobalVar('IndicadorAcertos') =15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') >0) then begin WriteGlobalVar('ResultadoJogo', 1); end else if (ReadGlobalVar('IndicadorAcertos') <15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') <=0) then begin WriteGlobalVar('ResultadoJogo', 2); end; //---End Script Builder---// //---Begin Script Builder: Travar o jogo, exibir as mensagens e resetar o jogo em função do resultado da variável ResultadoJogo---// if (ReadGlobalVar('ResultadoJogo') =1) then begin DisablePlayerMove; ShowObject('Panel0'); ShowObject('Label0'); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); http://alemdanimacao.zip.net Página 33 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); Conn.Close; Conn.Free; end else if (ReadGlobalVar('ResultadoJogo') =2) then begin DisablePlayerMove; ShowObject('Panel0'); ShowObject('Label1'); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); Conn.Close; Conn.Free; end; //---End Script Builder---// Vamos agora analisar o script linha por linha: http://alemdanimacao.zip.net Página 34 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR //---Begin Script Builder: Alterar a variável ResultadoJogo para 1 em caso de vitória e 2 em caso de derrota---// if (ReadGlobalVar('IndicadorAcertos') =15) (ReadGlobalVar('IndicadorBalas') >=0) then and (ReadGlobalVar('IndicadorRecargas') <2) and Se a variável IndicadorAcertos for igual a 15 (o objetivo do jogo) e a variável recargas for menor que 2 (você ainda pode recarregar a arma) e a sua munição tiver acabado ou não (IndicadorBalas maior ou igual a 0): begin WriteGlobalVar('ResultadoJogo', 1); Altere a variável ResultadoJogo para 1 (você ganha!). else if (ReadGlobalVar('IndicadorAcertos') =15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') >0) then Se a variável IndicadorAcertos for igual a 15 (o objetivo do jogo) e a variável recargas for igual a 2 (você não pode mais recarregar a arma) e a sua munição não tiver acabado (IndicadorBalas maior que 0): begin WriteGlobalVar('ResultadoJogo', 1); Altere a variável ResultadoJogo para 1 (você ganha!). end else if (ReadGlobalVar('IndicadorAcertos') <15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') <=0) then Se a variável IndicadorAcertos for menor que 15 (o objetivo do jogo) e a variável recargas for igual a 2 (você não pode mais recarregar a arma) e a sua munição tiver acabado (IndicadorBalas menor ou igual 0): begin WriteGlobalVar('ResultadoJogo', 2); Altere a variável ResultadoJogo para 2 (você perde!). end; //---End Script Builder---// //---Begin Script Builder: Travar o jogo, exibir as mensagens e resetar o jogo em função do resultado da variável ResultadoJogo---// if (ReadGlobalVar('ResultadoJogo') =1) then Caso você tenha ganhado: begin DisablePlayerMove; Desabilita o jogador. http://alemdanimacao.zip.net Página 35 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR ShowObject('Panel0'); Mostra o panel que serve de fundo para as mensagens. ShowObject('Label0'); Mostra a mensagem VOCÊ VENCEU O JOGO! var Conn: TADOConnection; (Declara um objeto do tipo “TADOConnection”, ele é responsável pela conexão com o banco de dados) Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); (Cria o objeto “Conn” definindo a String de conexão com o banco de dados assim como foi explicado anteriormente no script de leitura e salvamento de dados) Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=1” (linha 1) para o valor que for lido na variável IndicadorNome (o nome que você usar será mantido!) e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=1” (linha 1) para o valor defalt 1 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=2” (linha 2) para o valor defalt 80 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=2” (linha 2) para o valor defalt 0 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=3” (linha 3) para o valor defalt 0 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=3” (linha 3) para o valor defalt 0 e adaptado corretamente pelo comando QuotedStr) http://alemdanimacao.zip.net Página 36 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Conn.Close; (Fecha a conexão com o banco de dados) Conn.Free; (Destrói o objeto “Conn” liberando-o do da memória) end else if (ReadGlobalVar('ResultadoJogo') =2) then Caso você tenha perdido: begin DisablePlayerMove; Desabilita o jogador. ShowObject('Panel0'); Mostra o panel que serve de fundo para as mensagens. ShowObject('Label1'); Mostra a mensagem FIM DE JOGO! VOCÊ PERDEU! var Conn: TADOConnection; (Declara um objeto do tipo “TADOConnection”, ele é responsável pela conexão com o banco de dados) Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); (Cria o objeto “Conn” definindo a String de conexão com o banco de dados assim como foi explicado anteriormente no script de leitura e salvamento de dados) Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=1” (linha 1) para o valor que for lido na variável IndicadorNome (o nome que você usar será mantido!) e adaptado corretamente pelo comando QuotedStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=1” (linha 1) para o valor defalt 1 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=2” (linha 2) para o valor defalt 80 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); http://alemdanimacao.zip.net Página 37 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=2” (linha 2) para o valor defalt 0 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “nome” com o “id=3” (linha 3) para o valor defalt 0 e adaptado corretamente pelo comando IntToStr) Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); (Utiliza a conexão para executar um comando SQL de update para alterar o registro no campo “energia” com o “id=3” (linha 3) para o valor defalt 0 e adaptado corretamente pelo comando QuotedStr) Conn.Close; (Fecha a conexão com o banco de dados) Conn.Free; (Destrói o objeto “Conn” liberando-o do da memória) end; //---End Script Builder---// E este foi o último script! Vamos agora fazer os testes para checar se tudo funciona corretamente. A primeira coisa a ser feita é jogar um pouco, fazendo com que as variáveis mudem, de preferência, vá até a arena 2, para que a variável IndicadorLocal saia do valor defalt, 1, e mude para 2. Agora, escreve um novo nome para o jogador no campo NOVO NOME e clique no botão salvar. O Label JOGADOR: deve exibir esse novo nome. Feche o jogo e depois abra-o de novo. O jogador deverá ser posicionado na arena 2, todas as outras variáveis deverão estar intactas, e o nome que você salvou deverá aparecer no Label, assim: http://alemdanimacao.zip.net Página 38 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Agora, abra o banco de dados e cheque se houve alteração dos valores, eles devem estar iguais aos últimos salvos: Agora, abra o jogo novamente. Os valores devem reaparecer e o jogador deverá ser posicionado na Arena 2! Somente o campo NOVO NOME volta a exibir essa mensagem, mas o nome que você salvou não se altera: Continue a jogar. É necessário saber se ganhando ou perdendo os dados no banco serão resetados e as mensagens irão aparecer! Não importa se você ganhar ou perder, o Jogo deve travar, a mensagem correta deve ser exibida e os dados no banco deverão ser resetados! Não salve mais, jogue até o fim! Como você pode ver, eu reapareci na arena 2! Veja o que acontece se você acertar os 15 tiros sem ficar sem munição: http://alemdanimacao.zip.net Página 39 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Agora, vamos fechar o jogo e abrir de novo, todos os valores deverão ter sido resetados, menos o nome que você salvou: Como você pode ver, tudo funciona exatamente como o planejado, só falta checar agora o nosso banco de dados! Vejamos então: http://alemdanimacao.zip.net Página 40 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR E com isso, concluímos o nosso tutorial! Espero que você tenha entendido que mais importante que decorar códigos, é entendê-los! Só pra facilitar, vou colocar agora o resumo de todos os scripts. Em anexo eu também envio a arma e o Banco de dados, caso você não consiga baixar. RESUMO DE TODOS OS SCRIPTS DO JOGO: MAPA INICIALIZAR EVENTO ON CREATE SetWindowCaption('TIRO CERTO'); DisablePlayerMove; WriteGlobalVar('Rota', 4); WriteGlobalVar('IndicadorNome','Jogador'); WriteGlobalVar('IndicadorLocal', 1); WriteGlobalVar('IndicadorBalas', 80); WriteGlobalVar('IndicadorAcertos', 0); WriteGlobalVar('IndicadorRecargas', 0); WriteGlobalVar('IndicadorDisparos', 0); WriteGlobalVar('ResultadoJogo', 0); if (FileExists('C:\BD_TIRO.mdb')= false) then begin ShowLoadingScreen('LoadScreen', '', 0, 0); LoadMap('ERRO.gbm', 0, 3, 0, 10); end; if (FileExists('C:\BD_TIRO.mdb')= true) then begin http://alemdanimacao.zip.net Página 41 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR var Conn: TADOConnection; var DataSet: TADODataset; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); DataSet:=Conn.Execute('select nome, energia from ator where id = 1'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorNome', DataSet.FieldAsString[0]); WriteGlobalVar('IndicadorLocal', DataSet.FieldAsVariant[1]); end; DataSet:=Conn.Execute('select nome, energia from ator where id = 2'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorBalas', DataSet.FieldAsVariant[0]); WriteGlobalVar('IndicadorAcertos', DataSet.FieldAsVariant[1]); end; DataSet:=Conn.Execute('select nome, energia from ator where id = 3'); if DataSet.RecordCount <> 0 then begin WriteGlobalVar('IndicadorRecargas', DataSet.FieldAsVariant[0]); WriteGlobalVar('IndicadorDisparos', DataSet.FieldAsVariant[1]); end; DataSet.free; Conn.free; end; if (ReadGlobalVar('IndicadorLocal') =1) then http://alemdanimacao.zip.net Página 42 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR begin LoadMap('GAME.gbm', -11, 3, 3, 10); end else if (ReadGlobalVar('IndicadorLocal') =2) then begin LoadMap('GAME.gbm', -14, 3, 33, 10); end; MAPA GAME EVENTO ON CREATE EnablePlayerMove; //---Begin Script Builder: Ocultar as mensagens de final de jogo---// HideObject('Panel0'); HideObject('Label0'); HideObject('Label1'); //---End Script Builder---// EVENTO MAINLOOP //---Mostrar as variáveis nos Labels correspondentes---// SetLabelText('IndicadorNome', 'JOGADOR:' +ReadGlobalVar('IndicadorNome')); SetLabelText('IndicadorLocal', 'ARENA:' +IntToStr(ReadGlobalVar('IndicadorLocal'))); SetLabelText('IndicadorBalas', 'MUNIÇÃO:' +IntToStr(ReadGlobalVar('IndicadorBalas'))); SetLabelText('IndicadorAcertos', 'ACERTOS:' +IntToStr(ReadGlobalVar('IndicadorAcertos'))); SetLabelText('IndicadorRecargas', 'RECARGAS:' +IntToStr(ReadGlobalVar('IndicadorRecargas'))); SetLabelText('IndicadorDisparos', 'DISPAROS:' +IntToStr(ReadGlobalVar('IndicadorDisparos'))); //---End Script Builder---// //---Begin Script Builder: Descarregar a arma e alterar as variáveis Indicador Disparos e Indicador Balas conforme a execução da animação attack---// if (ReadGlobalVar('IndicadorBalas') >0) and (ReadGlobalVar('IndicadorBalas') <=80) then begin If (GetObjectAnimation('mainActor') ='attack') then begin WriteGlobalVar('IndicadorDisparos', ReadGlobalVar('IndicadorDisparos')+1); end http://alemdanimacao.zip.net Página 43 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR end; if (ReadGlobalVar('IndicadorBalas') >0) then begin If (GetObjectAnimation('mainActor') ='attack') then begin WriteGlobalVar('IndicadorBalas', ReadGlobalVar('IndicadorBalas')-1); end end; //---End Script Builder---// //---Begin Script Builder: Desabilitar disparos da Arma quando descarregada---// if (ReadGlobalVar('IndicadorBalas') <= 0) then begin LoadMainActorWeapon('Arma02'); end; //---End Script Builder---// //---Begin Script Builder: Alterar a variável ResultadoJogo para 1 em caso de vitória e 2 em caso de derrota---// if (ReadGlobalVar('IndicadorAcertos') =15) and (ReadGlobalVar('IndicadorRecargas') <2) and (ReadGlobalVar('IndicadorBalas') >=0) then begin WriteGlobalVar('ResultadoJogo', 1); end else if (ReadGlobalVar('IndicadorAcertos') =15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') >0) then begin WriteGlobalVar('ResultadoJogo', 1); end else if (ReadGlobalVar('IndicadorAcertos') <15) and (ReadGlobalVar('IndicadorRecargas') =2) and (ReadGlobalVar('IndicadorBalas') <=0) then begin WriteGlobalVar('ResultadoJogo', 2); end; //---End Script Builder---// //---Begin Script Builder: Travar o jogo, exibir as mensagens e resetar o jogo em função do resultado da variável ResultadoJogo---// if (ReadGlobalVar('ResultadoJogo') =1) then begin DisablePlayerMove; http://alemdanimacao.zip.net Página 44 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR ShowObject('Panel0'); ShowObject('Label0'); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); Conn.Close; Conn.Free; end else if (ReadGlobalVar('ResultadoJogo') =2) then begin DisablePlayerMove; ShowObject('Panel0'); ShowObject('Label1'); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(1) + ' where id = 1'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(80) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + IntToStr(0) + ' where id = 3'); http://alemdanimacao.zip.net Página 45 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR Conn.ExecuteSQL('update ator set energia = ' + IntToStr(0) + ' where id = 3'); Conn.Close; Conn.Free; end; //---End Script Builder---// EVENTO ONCOLLISION //---Begin Script Builder: Fazer o espantalho correr para o 2º pilar quando bater no 1º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto16') then begin WriteGlobalVar('Rota', 1); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto16') then begin WriteGlobalVar('Rota', 1); end; end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 3º pilar quando bater no 2º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto17') then begin WriteGlobalVar('Rota', 2); end; end; if (GetCollidedObject2 = 'Ator1') then http://alemdanimacao.zip.net Página 46 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR begin if (GetCollidedObject1 = 'Objeto17') then begin WriteGlobalVar('Rota', 2); end; end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 4º pilar quando bater no 3º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto18') then begin WriteGlobalVar('Rota', 3); end; end; if (GetCollidedObject2 = 'Ator1') then begin if (GetCollidedObject1 = 'Objeto18') then begin WriteGlobalVar('Rota', 3); end; end; //---End Script Builder---// //---Begin Script Builder: Fazer o espantalho correr para o 1º pilar quando bater no 4º ---// if (GetCollidedObject1 = 'Ator1') then begin if (GetCollidedObject2 = 'Objeto6') then begin WriteGlobalVar('Rota', 4); end; end; if (GetCollidedObject2 = 'Ator1') then begin http://alemdanimacao.zip.net Página 47 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR if (GetCollidedObject1 = 'Objeto6') then begin WriteGlobalVar('Rota', 4); end; end; //---End Script Builder---// //---Begin Script Builder: Alterar a Variável Global IndicadorAcertos em função de cada acerto no espantalho---// if Copy(GetCollidedObject1(), 0, 6) = 'Bullet' then begin if (GetCollidedObject2 = 'Ator1') then begin WriteGlobalVar('IndicadorAcertos', ReadGlobalVar('IndicadorAcertos')+1); end; end; if Copy(GetCollidedObject2(), 0, 6) = 'Bullet' then begin if (GetCollidedObject1 = 'RoboPrincipal') then begin WriteGlobalVar('IndicadorAcertos', ReadGlobalVar('IndicadorAcertos')+1); end; end; //---End Script Builder---// EVENTO ONCOLLISION DA ÁRVORE //---Begin Script Builder: Recarregar a arma SE estiver descarregada e contar as recargas, com um limite de 2---// if (ReadGlobalVar('IndicadorBalas') < 80) then begin if (ReadGlobalVar('IndicadorRecargas') <2) then begin WriteGlobalVar('IndicadorRecargas', (ReadGlobalVar('IndicadorRecargas')+1)); WriteGlobalVar('IndicadorBalas', 80); LoadMainActorWeapon('Arma01'); http://alemdanimacao.zip.net Página 48 TUTORIAL DE CRIAÇÃO DE UM JOGO NO 3D GAME BUILDER COM A FUNÇÃO SALVAR end end; //---End Script Builder---// EVENTO ONCOLLISION DO EVENT ÁREA DA PASSAGEM DA ARENA 1 WriteGlobalVar('IndicadorLocal', 1); EVENTO ONCOLLISION DO EVENT ÁREA DA PASSAGEM DA ARENA 2 WriteGlobalVar('IndicadorLocal', 2); EVENTO ONINTERACT DO BOTÃO SALVAR //---Begin Script Builder: Alterar a Variável Global IndicadorNome com o nome do jogador e gravar as 6 variáveis no banco de dados---// WriteGlobalVar('IndicadorNome', GetEditText('Objeto20')); var Conn: TADOConnection; Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\BD_TIRO.mdb;'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorNome')) + ' where id = 1'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorLocal')) + ' where id = 1'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorBalas')) + ' where id = 2'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorAcertos')) + ' where id = 2'); Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(ReadGlobalVar('IndicadorRecargas')) + ' where id = 3'); Conn.ExecuteSQL('update ator set energia = ' + QuotedStr(ReadGlobalVar('IndicadorDisparos')) + ' where id = 3'); Conn.Close; Conn.Free; //---End Script Builder---// Desejo a todos um bom estudo. Com paciência e imaginação, esses scripts podem ser adaptados a diversas situações, permitindo assim uma imensa variedade de jogos. Um grande abraço a todos e aguardem o próximo tutorial! Ronaldo Lemos Rio de Janeiro, 02 de Dezembro de 2009 http://alemdanimacao.zip.net Página 49