[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:
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.
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:
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:
Vamos analizar o que foi feito ali em cima:
Agora, vamos exibir as mensagens que chegarem.
Adicione um evento Draw, nele um execute Code e adicione o Código:
Adicione um Evento Press, Nele um Execute code e coloque o seguinte código:
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:
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á.
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 = "";
- Código:
for(i=0; i<28; i+=1) {
texto[i]="";
}
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))));
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.");
- 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.");
[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;
}
}
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);
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 = "";
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();
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á.