Conectar-se
Quem está conectado
35 usuários online :: 5 usuários cadastrados, Nenhum Invisível e 30 Visitantes

CRP-Max, gart30, Ismaelgames7, MrRafael, Willy

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Nota A
Notas recebidas : A
Data de inscrição : 25/02/2012
Número de Mensagens : 359
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

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

Servidor enviar dados ao cliente GM:S Online

em Dom 01 Set 2013, 00:59
To tendo dificuldades (realmente nao sei como fazer) para com que o servidor envie dados para os clientes.

Consigo enviar os dados dos clientes para o sevidor mas nao consigo enviar os dados do servidor para os clientes.

To usando o online interno do GM:S

Me basiei neste tutorial: http://gmbr.forumeiros.com/t27638-tutorial-de-multiplayer-networking-nativo-gms

OBS: Não consegui fazer nem com que o servidor ativasse o evento network do cliente.

Please ja faz 12 horas que estou empacado em tentar resolver isso para proseguir com miha intenções e nada de conseguir :'(
Ranking : Nota C
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6036
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

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

Re: Servidor enviar dados ao cliente GM:S Online

em Dom 01 Set 2013, 10:01
Código:
Mensagem="Teste";
ServerBuff = buffer_create( 256, buffer_grow, 1)
buffer_seek(ServerBuff,buffer_seek_start,0);
buffer_write(ServerBuff,buffer_string,Mensagem);
network_send_packet(AS_ID,ServerBuff,buffer_tell(ServerBuff));
Esse seria o modelo básico.

Se você reparou, no tutorial o Fred pega o AS_ID assim:
Código:
AS_ID=ds_map_find_value(async_load,"id");
No caso, você só pode enviar mensagens ao recebê-las. Ou seja, você tem que expandir seu jogo. O tutorial mostra o básico. Talvez deva criar uma ds_list (como no tutorial em inglês) e guardar os ids de quem se conecta. Assim você pode fazer um loop pela lista e enviar mensagens para todos os clients. Um ds_map seria até melhor, pois você poderia associar um nome a um id.

Obs: Ainda estou aprendendo sobre o assunto. Talvez possa ser feito de um modo melhor.
avatar
Ranking : Nota B
Notas recebidas : B-C-A-C
Data de inscrição : 18/09/2008
Número de Mensagens : 2490
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 1 Insignia 3x 0

Prêmios
   : 0
   : 2
   : 1
Ver perfil do usuáriohttp://xcreatorgames.weebly.com/

Re: Servidor enviar dados ao cliente GM:S Online

em Dom 01 Set 2013, 11:57
Reputação da mensagem: 100% (1 votos)
Funciona assim, quando você recebe o evento Networking você tem três tipo de eventos que podem acontecer:

1) Conexao
2) Dados
3) Desconexão

Para se comunicar com o "cliente" você deve armazenar o sockete dele, porém este soquete vem de forma diferente dependendo do evento em questão.
Nos Eventos de Conexão e Desconexão eles estão na chave "socket" no mapa "async_load". Já no evento de "dados"  o soquete esta na chave "id" do mapa "async_load". Está é a grande confusão. Então, BASICAMENTE para responder os eventos você precisa de algo como descrito abaixo:

SERVIDOR BASICO

Evento  CREATE
Código:

server_sock  = network_create_server(network_socket_tcp, 6666, 10); // Armazena o soquete do Servidor.
if (server_sock < 0)
{
    show_message("Erro conectando!");
    game_end();
    exit;
}

// Conexao ok vamos criar o buffer
buffer = buffer_create(256, buffer_grow, 1);
Evento NETWORKING
Código:


type = ds_map_find_value(async_load, "type"); // Tipo de evento

if (type == network_type_connect)
{
    sock_cliente = ds_map_find_value(async_load, "socket"); // Aqui o soquete vem nesta chave

    // Envia um OI pro cliente
    buffer_seek(buffer, buffer_seek_start, 0);            
    buffer_write(buffer, buffer_string, "Oi Cliente!");
    network_send_packet(sock, buffer, buffer_tell(buffer));
}


if (type == network_type_data)
{
    sock = ds_map_find_value(async_load, "id"); // Agora o danado vem no ID...
    if (sock == sock_cliente) // nem precisava pois temos somente um cliente neste teste, mas so pra constar
    {
       buf  = ds_map_find_value(async_load, "buffer"); // Pega o buffer de dados que o CLIENTE enviou
       msg  = buffer_read(buf, buffer_string); // le a mensagem do cliente
       show_message(msg); // mostra a mensagem na tela
    }
}

  
if (type == network_type_disconnect)
{
   show_message("Cliente disconectou!");
}
Evento DESTROY
Código:

// Aqui precisamos liberar os recursos alocados em CREATE
buffer_delete(buffer); // libera o buffer
network_destroy(server_sock); // libera o soquete do server
Não vou fazer a parte do cliente já que sua dúvida é sobre como o servidor envia os dados. Se for de interesse do pessoal, posso fazer um exemplo de chat bem simples pra que todos possam entender, não sei se já tem isso no fórum, mas o legal do chat é que temos vários clientes conectando ao servidor de chats.
Flws!
avatar
Ranking : Nota A
Notas recebidas : A
Data de inscrição : 25/02/2012
Número de Mensagens : 359
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

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

Re: Servidor enviar dados ao cliente GM:S Online

em Ter 04 Mar 2014, 21:47
Valeew cara suas explicações sanaram minhas duvidas.!
Vlw tbm PedroX!
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

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

Re: Servidor enviar dados ao cliente GM:S Online

em Qua 05 Mar 2014, 13:25
Reputação da mensagem: 100% (2 votos)
Vinians, vc foi exatamente no ponto. Perfeito. Essa diferença é sutil mas gera bastante dúvidas mesmo. Vou até complementar meu tuto com essa observação.

Pra ficar claro:
A comunicação do server com os clients é um pouco diferente pois vc tem que especificar qual client (através do socket).

Existem 2 formas de vc identificar quem é o socket de destino:
1) Quando um client se conecta ao server, é disparado no server o evento ASYNCRONOUS NETWORKING.
Sempre que isso ocorre, o mapa async_load é carregado com informações.
A informação que vc precisa (ID do SOCKET) estará na variável SOCKET desse mapa.

Toda vez que esse evento de conexão ocorrer, vc vai salvar o ID desse client num vetor ou lista... assim vc tem o "endereço" (ou caixa postal, segundo minha fábula) desse client.

2) Sempre que um cliente (já conectado) manda alguma mensagem para o server, o  mapa async_load novamente é carregado com informações.
A informação que vc precisa (ID do SOCKET) estará na variável ID desse mapa. Então vc sabe quem mandou a mensagem.

Ah sim... é claro, existe também uma terceira forma. Que vc pode falar com todo mundo via um comando de broadcast (coisa que não abordei no tuto):



Código:
    buffer_seek(broadcast_buffer, buffer_seek_start, 0);
    buffer_write(broadcast_buffer, buffer_string, global.ServerName);
    network_send_broadcast(server, 6511, broadcast_buffer, buffer_tell(broadcast_buffer));

Mas penso eu que o broadcast só funciona para UDP.
avatar
Data de inscrição : 05/10/2012
Número de Mensagens : 47
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Ver perfil do usuário

Re: Servidor enviar dados ao cliente GM:S Online

em Seg 13 Out 2014, 11:13
Este serviço de broadcast funcionaria bem pra eu informar aos clientes que há um servidor ou vários ativos, atribuindo um nome para cada servidor e dando opção ao cliente de conectar-se no servidor selecionado. confere essa informação ?
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

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

Re: Servidor enviar dados ao cliente GM:S Online

em Seg 13 Out 2014, 11:19
Confere sim. Inclusive na engine de networking da própria Yoyogames (demos) ela faz uso dessa feature pra notificar os servidores disponíveis.
avatar
Data de inscrição : 05/10/2012
Número de Mensagens : 47
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Ver perfil do usuário

Re: Servidor enviar dados ao cliente GM:S Online

em Seg 13 Out 2014, 13:24
Você tem o engine do exemplo da yoyo? to procurando aqui e não encontro, quero olhar essa questão com calma pois a minha ideia é que um mobile execute o server e libere para outras conexões através do hotspot.
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

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

Re: Servidor enviar dados ao cliente GM:S Online

em Seg 13 Out 2014, 13:51
Reputação da mensagem: 100% (1 votos)
No final dessa página, tem um link para o NetworkDemo.GMZ

http://help.yoyogames.com/entries/25891363-Networking-Overview

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