- Título: Lendo Arquivos Online
- GM Version: :GMS:
- Link para download da Engine: ARQUIVOSONLINE
- Requer Extensões: Não
- Requer DLLs: Não. GML Puro e aplicado =)
- Tags: Ler online; arquivos online; ler webserver;
Bom, tudo começou quando eu estava querendo fazer uma aplicação para Android que buscasse os dados em um servidor web.
Obviamente não poderia fazer uso de DLL's, pois não era pra rodar no Windows.
Depois de muito quebrar a cabeça e tentar entender (até pq vcs verão que é um tanto quanto estranho a forma do GMS alocar esses dados), consegui exorcizar e espero tornar a vida de vcs mais fácil.
Para que vcs entendam mesmo, temos que ir por partes.... então vamos lá:
Parte 1 - Eventos Assíncronos
A única forma eficiente de buscar algo online é através de eventos assíncronos (asynchronous events). São chamados assim porque nós nunca sabemos quando a função assíncrona vai completar o seu trabalho.
Para todas as funções normais (síncronas), a chamada de linha do algoritmo dura 1 step.
No caso das funções assíncronas, estas são disparadas e só Jesus sabe quando (em qual step) que vão retornar alguma coisa.
MAAASSSSS, quando retornam (aleluia), é disparado um evento assíncrono no GMS (Asynchronous Event). Essa é a hora de checar o que foi retornado.
Parte 2 - Função http_get(url)
A função http_get() é uma função assíncrona (ohhh!). Isso significa que é aquele tipo de função que vc chama e esquece. Em algum step do jogo ela vai voltar (qdo ela conseguir carregar o conteúdo da url que vc passou como parâmetro).
Por isso, vc não vai conseguir trabalhar com o conteúdo da URL na próxima chamada (step). Pode esperar a vida toda que não vai dar certo.... a única forma de dar certo é sendo sinalizado por um Evento Assíncrono relacionado a essa bendita função http_get(). E esse evento está dentro de ASYNCHRONOUS, mais precisamente o evento HTTP.
Bom, com isso nós já temos o "QUANDO".
Agora falta o "ONDE".
Pasmem, a função http_get() não vai te retornar bulhufas.... (na verdade vai, mas não é o que vc quer... vcs vão entender mais a frente). O conteúdo da URL é salvo numa váriavel global nativa chamada async_load.
É desse corno que vamos falar agora.
Parte 3 - variável async_load
Esse cara é uma variável global nativa do GMS. É uma variável do tipo DS_MAP. (Se não sabem como funciona um DS_MAP, vão estudar essa estrutura de dados no manual do GMS, mas pra simplificar posso dizer que o DS_MAP é um mapa que contém várias chaves dentro de cada posição (quase como se fosse um arquivo.ini salvo na memória).
A estrutura da varíavel async_load quando fazemos uma chamada pelo http_get() será composta pelas chaves abaixo:
*ID : A posição (ID) do conteúdo da chamada http (que vc fez através do http_get()). Toda vez que vc chama essa função (http_get), um novo conjunto de chaves é criado dentro do mapa async_load. Começando na posição (ID) 0. Assim, se vc faz 3 chamadas http_get() no seu código, vc gera 3 eventos assíncronos do tipo HTTP, alimentando o mapa async_load em 3 posições (0, 1 e 2) - uma para cada chamada. Vejam vcs que quando chamamos o http_get(url), na verdade ela retorna essa chave, ou seja, o valor da chave "ID" da variável async_load onde a url em questão será descarregada.
Pra eu entender isso tive que perder uma tarde inteira.... como sou burro...
*URL : O endereço que vc passou na função http_get - Tipo http://www.game.com/teste.ini
*result : Aqui está o conteúdo (que é salvo numa string) do arquivo que vc apontou na url (ou seja, aqui está o conteúdo do arquivo online teste.ini) - my precious! :face:
*http_status : É o código http que é retornado na chamada http_get. Ex: 200 para OK. 404 para não encontrado. 204 para sem conteúdo, etc... O negócio aqui é torcer pra dar o valor 200, senão, é pq o webserver não aceita acessar diretamente esse arquivo, ou vc passou o endereço errado, ou está fora do ar, ou vc é uma anta, etc.
◦status : Quando dá algum erro, um valor menor que 0 é retornado nessa chave.
Pronto, agora temos a faca e o queijo na mão!!!! Vamos ver na prática como funciona essa joça.
Parte 4 - A p**** do código =)
Não precisamos mais que uma room e um objeto (dentro da room de preferência ¬¬).
No CREATE_EVENT:
Código: Selecionar todos
pega_arquivo = http_get("http://www.dorway.com/test.txt");
O que acontece no código acima é que a variável "pega_arquivo" vai disparar um evento http_get(). O conteúdo dessa url vai ser salvo no mapa async_load. o ID do async_load vai ser o mesmo salvo na variável pega_arquivo.
Isto posto, precisamos de um evento ASYNCHRONOUS / HTTP para pegarmos o resultado dessa chamada (que é salvo na variável async_load - nada mais nada menos que um mísero ds_map).
No evento HTTP (Asynchronous)
Código: Selecionar todos
show_message(string(ds_map_find_value(async_load,"id")));
a função http_get(), o valor vai ser 0. Se for a segunda vez, vai ser 1. E assim sucessivamente.
Código: Selecionar todos
show_message(ds_map_find_value(async_load,"url"));
Código: Selecionar todos
show_message(string(ds_map_find_value(async_load,"http_status")));
Código: Selecionar todos
show_message(ds_map_find_value(async_load,"result")));
Assim vc pode trabalhar dentro dessa chave. Pode por exemplo salvar localmente. Etc...
Bom, agora vcs (assim como eu) estão doutrinados nessa missão.
Espero que esse tutorial tenha sido de grande valia, e que vcs não tenham que bater tanto a cabeça quanto eu pra carregar conteúdo online.
No início do post tem o link de um GMZ para vcs importarem e verem a engine funcionando no GMS. A engine basicamente faz o download do arquivo que está hospedado no webserver e mostra na tela a primeira linha desse arquivo.
Boas criações à todos.
Titio Fred.