Conectar-se
Quem está conectado
21 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 21 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

[Tutorial] - Lendo (e carregando) arquivos online

em Sab 11 Maio 2013, 23:23
Reputação da mensagem: 100% (5 votos)

  • 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... Mad

*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! What a 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:


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)

Código:

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.

Código:
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()

Código:
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

Código:
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.


Última edição por fredcobain em Dom 12 Maio 2013, 16:40, editado 1 vez(es)
Ranking : Nota C
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6037
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 288

Prêmios
   :
   :
   :
Ver perfil do usuário

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

em Dom 12 Maio 2013, 12:09
Muito bom o tutorial. Quando der, continue a postar tutoriais. Vlw.
avatar
Ranking : Nota B
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Número de Mensagens : 1013
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 79

Prêmios
   : 2
   : 0
   : 0
Ver perfil do usuário

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

em Dom 12 Maio 2013, 13:00
Também achei muito bom o tutorial, muito fácil de entender.

E a função parece ser muito mais rápida que a da HTTP DLL para GM8. Continue a contribuir sempre que possível!
Data de inscrição : 29/05/2012
Número de Mensagens : 929
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 33
Ver perfil do usuário

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

em Dom 12 Maio 2013, 13:10
baixei a engine e só apareceram alguma janelas com as mensagens não era pra ele ler algum arquivo online e baixar o arquivo ?

eu demoro pra intender mais quando intendo o baguio fica loko
avatar
Ranking : Nota B
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Número de Mensagens : 1013
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 79

Prêmios
   : 2
   : 0
   : 0
Ver perfil do usuário

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

em Dom 12 Maio 2013, 13:44
Ah e, será que tem uma forma de baixar a informação do .txt e passar direto para uma string? Seria mais rápido e evitaria possíveis falhas... Quanto as falhas acho que seria bem raro acontecer assim do jeito que está mas seria mais fácil não ter de criar um .txt com as informações pra depois passar pro jogo.
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Dom 12 Maio 2013, 16:29
Mina do Rock escreveu:baixei a engine e só apareceram alguma janelas com as mensagens não era pra ele ler algum arquivo online e baixar o arquivo ?

eu demoro pra intender mais quando intendo o baguio fica loko

Então, o que a engine faz é copiar o conteúdo de um arquivo online para um arquivo local.
Dá uma olhadinha nos comentários do código.

@Gonçalves escreveu:Ah e, será que tem uma forma de baixar a informação do .txt e passar direto para uma string? Seria mais rápido e evitaria possíveis falhas... Quanto as falhas acho que seria bem raro acontecer assim do jeito que está mas seria mais fácil não ter de criar um .txt com as informações pra depois passar pro jogo.

Dá sim.

Na verdade a chave "result" do async_load é uma variável do tipo string.

Depois que vc chama o http_get(url) passando o endereço do seu arquivo txt na web, vc pode criar uma variável qualquer no evento HTTP para salvar o conteúdo:

Ex:

Código:
 conteudo = ds_map_find_value(async_load,"result");

Ou seja, no exemplo acima o texto contido no arquivo txt online (que vc passou na função http_get) será salvo na variável (do tipo string) conteúdo.

Entendeu ?

Postagens unidas por Gonçalves! Evite double-post.
avatar
Ranking : Nota B
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Número de Mensagens : 1013
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 79

Prêmios
   : 2
   : 0
   : 0
Ver perfil do usuário

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

em Dom 12 Maio 2013, 16:44
#fred

Sim, obrigado pela resposta. A teoria consegui sacar, mas não tenho como testar agora, mas tarde vejo se funciona.

Até mais! sorrindo2
avatar
Data de inscrição : 07/01/2012
Número de Mensagens : 169
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 6
Ver perfil do usuário

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

em Qua 05 Jun 2013, 17:14
legal.. Isso pode ser útil pra muitas coisas!
avatar
Data de inscrição : 22/04/2013
Número de Mensagens : 163
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 17

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Qua 05 Jun 2013, 22:18
Eu sou um novato no Game Maker, e não entendi direito uma coisa:
Para o que isso serve?
Desculpe a minha nubisse!
avatar
Ranking : Nota B
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Número de Mensagens : 1013
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 79

Prêmios
   : 2
   : 0
   : 0
Ver perfil do usuário

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

em Qua 05 Jun 2013, 22:22
#marcigre

Serve pra baixar arquivos de internet, permitindo baixar bases de dados atualizadas para softwares, buscar atualizações para jogos, ou até mesmo gerenciar downloads. Vai da imaginação do programador! o/
avatar
Ranking : Nota C
Notas recebidas : C
Data de inscrição : 28/10/2008
Número de Mensagens : 820
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 29

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Ter 11 Jun 2013, 15:34
Não tinha visto esta mensagens antes, conteúdo muito bom, bem explicado e divertido de ler, parabéns. What a Face
Agora só falta uma forma de gera estes arquivos online, dai seria perfeito. cheers
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Qua 12 Jun 2013, 12:53
@CRP-Max escreveu:Não tinha visto esta mensagens antes, conteúdo muito bom, bem explicado e divertido de ler, parabéns. What a Face
Agora só falta uma forma de gera estes arquivos online, dai seria perfeito. cheers

Amigo, obrigado pelos elogios ao post.

Penso que não tem como fazer o upload nativamente pelo GMS.

Mas acho que com PHP junto dá pra fazer.

Veja o script no fórum do GMC.

Link - Upload File
Data de inscrição : 29/05/2012
Número de Mensagens : 929
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 33
Ver perfil do usuário

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

em Qua 12 Jun 2013, 15:08
fredcobain da pra vc fazer uma engine que le um numero online, exemplo  435345345323 e se bater como o do exe ir pra room 2 ? e se nao bater aparecer uma janelinha mostrando senha invalida, vc poderia fazer isso pra nos ?
vlw
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Qua 12 Jun 2013, 15:37
@Gonzo escreveu:fredcobain da pra vc fazer uma engine que le um numero online, exemplo  435345345323 e se bater como o do exe ir pra room 2 ? e se nao bater aparecer uma janelinha mostrando senha invalida, vc poderia fazer isso pra nos ?
vlw



Fala Gonzo, desculpe, mas não entendi o que vc quis dizer com "bater com o do exe" ?

Qual seria esse número do "exe" ? Como ele é gerado ?
Data de inscrição : 29/05/2012
Número de Mensagens : 929
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 33
Ver perfil do usuário

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

em Qua 12 Jun 2013, 16:14
cara seria tipo um serial mesmo, e o do exe seria gerado manualmente pra bater com o do online, pode fazer?
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Qua 12 Jun 2013, 16:52
A idéia seria a seguinte:

Eu criaria um arquivo serial.txt e colocaria e hospedaria em algum servidor web.

Usando a minha engine, é só vc trocar a url no create event:
pega_arquivo = http_get("http://www.seuservidor.com/serial.txt");


No final, o conteúdo desse arquivo (ou seja, o serial) vai ser carregado na variável "result" do mapa async_load. Vc acessa via:
ds_map_find_value(async_load,"result")

Então vc pega esse valor e compara com o serial do seu EXE.


Entendeu?
Data de inscrição : 29/05/2012
Número de Mensagens : 929
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 33
Ver perfil do usuário

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

em Qua 12 Jun 2013, 17:21
a cara na verdade eu preciso que o o gms salve o serial do link em um arquivo ini, só isso se possivel. vlw:)

https://dl.dropboxusercontent.com/u/4532144/teste_serial.txt
avatar
Data de inscrição : 24/10/2009
Número de Mensagens : 873
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 14

Prêmios
   :
   :
   :
Ver perfil do usuáriohttp://inprovise.blogspot.com/

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

em Qui 13 Jun 2013, 22:28
Gonzo escreveu: escreveu:fredcobain da pra vc fazer uma engine que le um numero online, exemplo  435345345323 e se bater como o do exe ir pra room 2 ? e se nao bater aparecer uma janelinha mostrando senha invalida, vc poderia fazer isso pra nos ?
vlw


dê uma olhada eu consegui fazer isso usando o seu serial e o netread!:

https://www.dropbox.com/s/iq10zg52rgblpl1/letextoexterno%28moisesbr%29.rar
avatar
Ranking : Sem avaliações
Data de inscrição : 14/04/2011
Número de Mensagens : 691
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 162

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

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

em Sex 14 Jun 2013, 09:44
@moisesBR escreveu:
Gonzo escreveu: escreveu:fredcobain da pra vc fazer uma engine que le um numero online, exemplo  435345345323 e se bater como o do exe ir pra room 2 ? e se nao bater aparecer uma janelinha mostrando senha invalida, vc poderia fazer isso pra nos ?
vlw


dê uma olhada eu consegui fazer isso usando o seu serial e o netread!:

https://www.dropbox.com/s/iq10zg52rgblpl1/letextoexterno%28moisesbr%29.rar


Moisés, o problema de usar DLL é que vc fica restrito ao windows... não consegue exportar para as outras plataformas...

Mais tarde eu vou fazer o exemplo usando os comandos nativos do gms.

=)


------------------------------------------------------------------------------------------------

Pronto.

Gonzo, ta aqui o que vc queria. Enjoy.

Checar Serial Online - Gonzo
Data de inscrição : 29/05/2012
Número de Mensagens : 929
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 33
Ver perfil do usuário

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

em Dom 16 Jun 2013, 15:56
blz agora funfo ki legal..  vlw moises e fredcobain duas engines que eu tinha curiosidade de saber vlw .

off :  gente pq nao tem + e - de reputacao no meu perfil pra eu agradece a galera q me da uma força ? 
vlw
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum