Notícias

TUTORIAL 15 - ACESSANDO UM BANCO DE DADOS

        Neste tutorial aprenderemos como acessar um banco de dados “Access”, ler e gravar dados nele, usando a linguagem script do 3D Game Builder.

        Primeiramente faça o download do seguinte arquivo:

        http://www.eternix.com.br/pt/3dgamebuilder/bd_exemplo.zip

      Salve o arquivo em “C:\”. Este arquivo é um banco de dados “Access” com apenas uma tabela chamada de ator e que possui 3 campos:

      Id = Integer
      Nome = String
      Energia = Integer

      Agora crie um novo projeto ou utilize um dos criados anteriormente, e crie também um cenário e adicione a este cenário um Ator MD2, este pode ser o ator padrão do 3D Game Builder. Crie também um pequeno formulário, com um campo onde será digitado um novo nome para o ator, utilize os objetos do tipo “GUI Objects”, na parte superior da tela adicione também dois “Labels” como mostrado na imagem abaixo.

      Após concluir o cenário deve estar parecido com este:

      Agora vamos criar um script de leitura de dados, quando o mapa for carregado devemos ler os dados da tabela “ator”. Para isso acesse o menu “Mapas -> Eventos -> OnCreate”, o script para a leitura do nome ficou assim:

      var Conn: TADOConnection;
      var DataSet: TADODataset;

      Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\bd_exemplo.mdb;');

DataSet:=Conn.Execute('select nome, energia from ator where id = 0');

      if DataSet.RecordCount <> 0 then
      begin
          SetLabelText('Objeto3', 'Nome:'+DataSet.FieldAsString[0]);
          SetLabelText('Objeto2', 'Energia: '+DataSet.FieldAsString[1]);
      end;

      HideObject('Objeto5');
      HideObject('Objeto6');
      HideObject('Objeto7');
      HideObject('Objeto8');

      WriteGlobalVar('EditarNome', 0);

      DataSet.free;
      Conn.free;

      Lembre-se que “Objeto2” e “Objeto3” são os nomes dos meus objetos do tipo “Label” que estão na parte superior da tela, caso os seus possuam outro nome, altere o script para o nome dos seus objeto, ou então altere o nome dos seus objetos no mapa para os respectivos nomes. E os nomes “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são referentes aos outros objetos do tipo “GUI Objects” que formam o formulário de alteração do nome.

      Agora vamos à explicação de cada uma das linhas do script.

      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_exemplo.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)

      DataSet:=Conn.Execute('select nome, energia from ator where id = 0');

(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 = 0” da tabela ator)

      if DataSet.RecordCount <> 0 then

(Caso a consulta tenha retornado algum registro para o “DataSet”)

      SetLabelText('Objeto3', 'Nome:'+DataSet.FieldAsString[0]);

(Utiliza o comando “SetLabelText” para alterar o texto do objeto do tipo “Label” de nome “Objeto3” colocando como texto a string “Nome:” mais o valor do registro convertido em String na posição 0 do “DataSet”)

      SetLabelText('Objeto2', 'Energia: '+DataSet.FieldAsString[1]);

(Utiliza o comando “SetLabelText” para alterar o texto do objeto do tipo “Label” de nome “Objeto2” colocando como texto a string “Energia:” mais o valor do registro convertido em String na posição 1 do “DataSet”)

      HideObject('Objeto5');
      HideObject('Objeto6');
      HideObject('Objeto7');
      HideObject('Objeto8');

(O comando “HideObject” torna um objeto invisível, isto é feito para que o formulário para alteração do nome não esteja visível quando o jogo for iniciado, e os meus objetos “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são os objetos que formam o formulário)

      WriteGlobalVar('EditarNome', 0);

(Cria uma variável global para ser utilizada como controle do formulario visível ou não visível)

      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)

      Salve o script e agora vamos criar o script para alterar o valor do nome no banco, para isso selecione o botão “Salvar” do seu formulário, e acesse a aba “eventos” nas propriedades do objeto, e clique no evento “OnInteract” este evento ocorrerá no momento que o botão for clicado pelo mouse.

      O script para gravação de dados ficou assim:

      var Conn: TADOConnection;

      Conn:=TADOConnection.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\bd_exemplo.mdb;');

      Conn.ExecuteSQL('update ator set nome = ' + QuotedStr(GetEditText('Objeto7')) + ' where id = 0');

      Conn.Close;

      SetLabelText('Objeto3', 'Nome: '+GetEditText('Objeto7'));

      HideObject('Objeto5');
      HideObject('Objeto6');
      HideObject('Objeto7');
      HideObject('Objeto8');

      Conn.Free;

      Lembre-se que “Objeto7” é o nome do meu objeto do tipo “Edit” onde o jogador irá escrever o novo nome, e o “Objeto3” é o “Label” onde aparece o nome que está na parte superior da tela, caso os seus possuam outro nome, altere o script para o nome dos seus objetos, ou então altere o nome dos seus objetos no mapa para os respectivos nomes. E os nomes “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são referentes aos outros objetos do tipo “GUI Objects” que formam o formulário de alteração do nome.

      Agora vamos para a explicação de cada uma das linhas:

      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_exemplo.mdb;');

(Cria o objeto “Conn” definindo a String de conexão com o banco de dados assim como foi explicado anteriormente)

      Conn.ExecuteSQL('update ator set nome = ' +  QuotedStr(GetEditText('Objeto7')) + ' where id = 0');

(Utiliza a conexão para executar um comando SQL de update para alterar o valor de “nome” do registro com o “id=0” para o valor que estiver no texto do “Objeto7” que é o objeto do tipo “Edit” que esta no formulario)

      Conn.Close;

(Fecha a conexão com o banco de dados)

      SetLabelText('Objeto3', 'Nome: '+GetEditText('Objeto7'));

(Utiliza o comando “SetLabelText” para alterar o texto do objeto do tipo “Label” de nome “Objeto3” colocando como texto o texto que estiver no “Edit” do formulário”)

      HideObject('Objeto5');
      HideObject('Objeto6');
      HideObject('Objeto7');
      HideObject('Objeto8');

(O comando “HideObject” torna um objeto invisível, isto é feito para que o formulário para alteração do nome não esteja visível quando o jogo for iniciado, e os meus objetos “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são os objetos que formam o formulário)

      Conn.free;

(Destrói o objeto “Conn” liberando-o do da memória)

      Agora precisamos exibir o formulário para a alteração do nome, já que ele é tornado invisível na criação do mapa, para isto selecione o ator que foi colocado anteriormente no mapa, e vá até o seu evento “OnCollision”, quando o ator principal tocar no outro ator o formulário de alteração de nome será exibido.

      O script para exibir o formulário ficou assim:

      if ReadGlobalVar('EditarNome') = 0 then
      begin
          WriteGlobalVar('EditarNome', 1);
          ShowObject('Objeto5');
          ShowObject('Objeto6');
          ShowObject('Objeto7');
          ShowObject('Objeto8');
      end;

      Lembre-se que os nomes “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são referentes aos objetos do tipo “GUI Objects” que formam o formulário de alteração do nome, caso os seus possuam outro nome, altere o script para o nome dos seus objetos.

      Agora vamos à explicação do script:

      if ReadGlobalVar('EditarNome') = 0 then

(É utilizado o comando “ReadGlogalVar” para ler o valor da variável “EditarNome” para saber se o formulário de edição de nomes já não esta visível, caso na esteja ele deverá ser exibido)

      WriteGlobalVar('EditarNome', 1);

(Altera o valor da variável global “EditarNome” para 1, isto significa que o formulário de edição do nome já esta visivel)

      ShowObject('Objeto5');
      ShowObject('Objeto6');
      ShowObject('Objeto7');
      ShowObject('Objeto8');

(O comando “ShowObject” torna um objeto visível, e os objetos “Objeto5”, “Objeto6”, “Objeto7” e “Objeto8” são os objetos que formam o formulário)

      Se você fez tudo corretamente esta pronto o seu acesso de leitura e gravação no banco de dados, então execute o projeto para ver o resultado.

      Como você pode notar acessar um banco de dados não é uma coisa muito complexa, é possível utilizar o banco de dados para diversas tarefas como para salvar o jogo, salvar o estado dos atores e dos objetos do mapa, para criar agentes que aprendem no decorrer do jogo, entre outras possibilidades. Este tutorial mostrou como acessar um banco de dados “Access”, mas também é possível acessar outros formatos de banco, como o Firebird, SQLServer, entre outros. E também é possível acessa o banco sem utilizar a string de conexão, basta criar um “Alias” para o banco e utilizar este “Alias” no lugar da string de conexão. Nos próximos tutoriais aprenderemos a fazer outras coisas utilizando a linguagem scripts.