Avatar do usuário
Tutoriais & Aulas
Colaborador
Colaborador
Autor
Mensagens: 174
Registrado em: Qui Abr 28, 2016 11:37 am
Karma: 240

[NET] [Tutorial] - Lendo (e carregando) arquivos online

Sex Abr 29, 2016 1:33 pm

Autor original: fredcobain


  • 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;

Lendo arquivos Online

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... :x

*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:


pega_arquivo = http_get("http://www.dorway.com/test.txt");

Essa url é de um arquivo txt que procurei aleatoriamente no google. A idéia é vc passar onde vc salva seu arquivo .ini por exemplo.

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)

show_message(string(ds_map_find_value(async_load,"id")));

A chave ID do async_load tem que ter o mesmo valor retornado pelo http_get(). Se foi a primeira vez que vc executou
a função http_get(), o valor vai ser 0. Se for a segunda vez, vai ser 1. E assim sucessivamente.

show_message(ds_map_find_value(async_load,"url"));

O código acima vai mostrar justamente a url que vc passou quando chamou a função http_get()

show_message(string(ds_map_find_value(async_load,"http_status")));

O código acima está o status http da chamada que foi feita no http_get

show_message(ds_map_find_value(async_load,"result")));

No código acima, meus caros, ESTÁ O OURO!!!! Sim, o conteúdo do arquivo passado na URL é salvo na chave "result" desse maldito ds_map
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.
1

Tags:
 
marquinhossm
Membro
Membro
Mensagens: 70
Registrado em: Qui Ago 04, 2016 12:51 pm
Karma: 64

Re: [NET] [Tutorial] - Lendo (e carregando) arquivos online

Qua Ago 31, 2016 9:15 pm

Muito bom o tutorial, graças a essa explicação excelente, consegui fazer um sistema simples de pontuação com php e mysql..
Muito bom o tutorial, obrigado por compartilhar esse conhecimento.

Abraço!
 
Natanael
Novato
Novato
Mensagens: 2
Registrado em: Ter Set 08, 2015 5:15 pm
Karma: 0

Re: [NET] [Tutorial] - Lendo (e carregando) arquivos online

Dom Jan 29, 2017 6:37 pm

Cara estou fazendo um banco de dados via PHP e não consigo baixar sua engine para estudar. Tem como me passar um outro link?
 
Avatar do usuário
Eddy
Membro
Membro
Mensagens: 29
Registrado em: Seg Nov 23, 2015 10:32 pm
Karma: 48

Re: [NET] [Tutorial] - Lendo (e carregando) arquivos online

Qui Fev 02, 2017 3:42 pm

Caaaaara que top

tava mesmo precisando disso aew.
Até salvei para no futuro (incerto desse forum) poder ter guardado essa informação especial

muito boa a forma como vc escreveu
TOP
voto para ser permanente e matéria principal de parte online

EDIT: Mesmo caso, ERRO (404)

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes