Curso GM Online - 3º Lição - Comunicação entre Clients -> Chat

    Compartilhe
    avatar
    jiraya
    Administrador
    Administrador

    Mensagens : 1299
    Credibilidade : 54

    Curso GM Online - 3º Lição - Comunicação entre Clients -> Chat

    Mensagem por jiraya em Sab Jan 08, 2011 12:27 pm

    [Autor:João Neto]
    Na aula passada iniciamos nosso aprendizado sobre o uso da SOC – Simple Online Communication, uma das melhores Dlls de TCP já feitas para o GM.
    Hoje iremos fazer um sistema simples de comunicação, um Chat. Com poucas linhas de código, e usando o DirectServer (usado na aula passada como servidor) poderemos fazer um chat simples.
    Vamos usar o exemplo que foi construído na aula passada. Ele já possui a soc.dll, os scripts, e um objeto de inicialização. Nesta aula, para poder “escrever” na tela, estaremos trabalhando com o Evento Draw. Vamos lá.
    Abra o projeto Client, aquele que foi construído na aula passada. No objeto objStart, no evento Create, abra o Execute Code. Adicionaremos a ele algum código.Antes do código existente, adicione as variáveis nome e texto, Assim:
    Código:
    nome = "";
    texto = "";
    Logo após, preencheremos a variável texto com um array de objetos vazios. Esta variável será nossa “caixa de texto” que armazenará e exibirá os textos que os usuários conectados escreverão e enviarão.
    Código:
    for(i=0; i<28; i+=1) {
    texto[i]="";
    }
    Estou colocando 27 itens visíveis, mas este valor pode ser mudado. Não entrarei em muitos detalhes de como embelezar o chat, pois a nossa intenção aqui é aprender a usar a soc.
    Para que pelo menos os usuários possam se “identificar” no chat, vamos colocar um get_string, que recuperará o nome do usuário para ser usado depois nas mensagens.
    Código:
    nome=get_string("Qual o seu nome?", "Maker "+string(floor(random(1000))));
    A partir de agora, sempre me referirei ao usuário conectado como player.
    Vamos falar sobre comunicação. Para se comunicar, usamos os seguintes comandos da SOC:
    message_send( id, player, valor);
    Envia uma mensagem a um player específico, com ID e valor. Se player for 0(zero) a mensagem é enviada a todos os que estiverem conectados(pensou na possibilidade de uma sala privada??)
    message_receive();
    Checa se chegou alguma mensagem.
    message_id();
    retorna o ID da ultima mensagem recebida.
    message_player();
    retorna o ID do player que enviou a ultima mensagem.
    message_value();
    retorna o valor da ultima mensagem recebida.
    Usando os comandos acima, é que vamos fazer toda a comunicação entre o Listener e o Client, e de Client para Client.
    Não pense que, usando 0 no player, você não precisa do Listener, muito pelo contrário, é ele que, ao receber uma mensagem com player = 0 é que redireciona a mensagem para todos os players online.
    Voltemos ao Código. A primeira coisa a fazer é “avisar” a todos os players online que você entrou. Para isso, coloque o seguinte código logo após o código já existente:
    Código:
    message_send(1, 0, nome+" entrou na sala.");
    A esta altura, o código do seu Evento Create deve estar assim:
    Código:
    nome = "";
    texto = "";
    for(i=0; i<28; i+=1) {
    texto[i]="";
    }
    nome=get_string("Qual o seu nome?", "Maker "+string(floor(random(1000))));
    //Iniciando o Socket
    soc_init();
    //Conectando ao servidor
    if (!player_connect(8040, "localhost")) {
    show_message("Falha ao Conectar no servidor.")
    soc_free();
    game_end();
    }
    message_send(1, 0, nome+" entrou na sala.");
    Então vejamos, passo a passo o código acima:

      [li]Ao iniciar, declaramos as variáveis que serão usadas nos textos.[/li]
      [li]Recuperamos o nome do player.[/li]
      [li]Iniciamos a Dll.[/li]
      [li]Tentamos conectar(o qual se não conseguir encerra a aplicação).[/li]
      [li]Enviamos uma mensagem que entramos na sala.[/li]

    Agora a parte importante. Não basta apenas dizer que chegamos, precisamos averiguar a todo momento se chegou alguma mensagem, e poder digitar textos e envia-los. Vamos então.
    Adicione um Evento Step e nele um Execute Code. Agora adicione este código:
    Código:
    // Checamos se alguma mensagem chegou
    if(message_receive()) {
    switch(message_id())
    {
    case 1:
    // Se sim, colocaremos ela no array de strings
    // Primeiro movemos todos para cima
    for(i=0; i<27; i+=1) {
    texto[i]=texto[i+1];
    }
    // Finalmente adicionamos a string que chegou
    texto[27]=message_value();
    break;
    }
    }
    Foi fácil. Agora, toda mensagem que chegar, será colocada na “fila” de mensagens.
    Vamos analizar o que foi feito ali em cima:

      [li]Validamos se chegou alguma mensagem. Se sim:[/li]
      [li]Usamos um case para saber se é o ID de mensagem que esperávamos. Da forma como foi feito no case, podemos enviar mensagens diferentes, com propósitos diferentes.[/li]
      [li]Subimos os textos na fila do array.[/li]
      [li]Colocamos o texto que chegou no Array.[/li]

    Agora, vamos exibir as mensagens que chegarem.
    Adicione um evento Draw, nele um execute Code e adicione o Código:
    Código:
    // Desenharemos todas as linhas do array
    for(i=0; i<28; i+=1) {
    draw_text(10, 10+i*16, texto[i]);
    }
    // finalmente desenhamos o que se está digitando
    draw_text(10, 454, ">> "+keyboard_string);
    Estamos indo bem, configuramos a inicialização, a validação e a execução do nosso Chat. Mas ainda falta algo principal... Como vamos escrever?? Essa vem agora:
    Adicione um Evento Press, Nele um Execute code e coloque o seguinte código:
    Código:
    //Primeiro subimos as strings
    for(i=0; i<27; i+=1) {
    texto[i]=texto[i+1];
    }
    // finalmente colocamos a string escrita, mais o nome.
    texto[27]=nome+": "+keyboard_string;
    // agora a enviamos
    message_send(1, 0, nome+": "+keyboard_string);
    keyboard_string = "";
    Observe que fizemos o mesmo passo de subir a string e adicioná-la ao final do array, como no evento Step.
    Fizemos isso por uma simples razão:
    “A string enviada para o Listener, mesmo estando com player = 0, não retorna para quem a enviou”.
    Ou seja, devemos fazer do Lado Client aquilo que será feito do Lado Listener, para que vejamos o que aconteceu. Se o passo acima não for feito, todos os outros players verão a sua mensagem, menos você. Ao final, usamos o message_send, para enviar o que digitamos.
    A esta altura, podemos testar nosso Chat. Mas antes, para evitar erros, objetos instanciados na memória entre outras coisas, vamos adicionar um evento de saída.
    Adicione um Evento Press, coloque um Execute code e nele o código:
    Código:
    // Dizemos aos outros players que estamos saindo.
    message_send(1, 0, nome+" saiu.");
    // Desconectamos do Server.
    player_disconnect();
    // desalocamos a DLL.
    soc_free();
    // e finalizamos o jogo.
    game_end();
    Examinando o código acima, é bem fácil ver o que acontece. Enviamos uma mensagem, dizendo que estamos saindo, desconectamos do Listener, liberamos a dll e finalizamos o jogo.
    Para podermos testar, precisamos compilar o executável, pois vamos abrir duas instancias do Client.
    Para compilar, vá no menu File -> Create Executable, como na figura abaixo:


    Após compilar, execute o Directserver(os passos de execução foram explicados na aula anterior) e execute duas instancias do Client.exe. Ao clicar em OK em uma delas, na outra aparecerá o texto que “o fulano entrou na sala.”. experimente digitar textos nas duas janelas, apertar enter e, para sair, não feche no X da janela, aperte ESC(nosso comando de saída, lembra??)

    Acabamos de entrar no que eu chamo de “esqueleto” de um jogo Online. Pense, você consegue se conectar a um servidor (Listener), dizer quem você é, enviar uma mensagem para que todos os que estiverem conectados possam ler, e ler as mensagens que todos enviarem.
    Nosso chat ficou meia-boca, dava pra fazer bem melhor. Mas a intenção da aula foi concluída, dar os primeiros passos na comunicação entre Clients, através do Listener, enviando e recebendo informações.
    Isto que foi mostrado aqui é a ponta da ponta do Iceberg. O GM é capaz de muito mais, mas muito mesmo, bastando saber como desenvolver. Alguns dirão:
    “Mas pra quê que eu vou perder tempo com isso, se o Netplay me dá isso pronto??”
    Eu sou um profissional. Me tornei profissional por querer sempre mais, aprender mais, inovar mais, e melhorar mais. Usar GM pra fazer jogo é coisa de quem já sabe o que quer, não apenas tenta. E eu estou aqui por estes, que sabem o que querem, e conseguirão.
    Por hoje é só. Na próxima aula, veremos como é simples fazer um “Pong” usando o SOC.
    Até lá.

      Data/hora atual: Sab Jul 21, 2018 10:58 pm