Tutorial - Como fazer um jogo multiplayer online - Parte II

Página 1 de 2 1, 2  Seguinte

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Qualidade Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Ter 25 Jan 2011, 14:22

Tutorial – Como fazer um jogo multiplayer online
Por Janx
Parte II: Fazendo um Jogo

Antes de iniciar:
Na primeira parte já aprendemos bem como é o conceito para fazer um jogo online, agora iremos ver a parte pratica. Usaremos a 39Dll e o Game Maker 7 PRO.
É necessário saber GML em nível intermediário ou superior para completar o tutorial sem grandes dificuldades. Todo o código é explicado em maior parte direto nos comentários, apenas alguns detalhes são explicados fora do código.

Um novo projeto:
Para fazer o jogo, vamos precisar importar alguns scrips, mas como são vários e o Game Maker não importa eles separando por pastas vou disponibilizar um projeto com os scripts já prontos.

Primeiramente precisaremos desse pacote: Download [Contem: Projeto.gmk e 39Dll.dll]
Depois de baixá-lo, extraia para uma pasta qualquer. Serão extraídos dois arquivos:

Projeto.gmk
: Projeto já iniciado contendo apenas as funções da 39Dll.

39Dll.dll: A DLL deve estar sempre acompanhada do executável do jogo, é nela que o jogo encontra as funções a serem executadas.

Abra o Projeto e de uma olhada nos scripts, são vários não é mesmo? A maioria nós nem iremos usar, mas não iremos apagar nenhum porque não sabemos se vamos precisar deles no futuro.

O menu:
Antes de qualquer coisa, vamos fazer um menu bem simples só para testar mesmo. Faça 2 objetos: obj_btmHost e obj_btmClient e crie uma sprite para cada um. Para isso você talvez queira saber o que eles farão então aqui vai uma pequena explicação:

obj_btmHost: Esse botão será usado para criar um Servidor, fazer um Host. Lembra da primeira aula? O Servidor é onde os jogadores conectam.

obj_btmClient: Agora ficou fácil, esse é o Client, ao clicar nesse botão será possível conectar em algum servidor.

Esses são apenas botões, não terão funções muito complexas. Antes de começarmos a adicionar código, crie mais 2 objetos (Esses não precisam de sprites) e marque-os como Persistent:
obj_Host
obj_Client



Vamos começar pelo botão de host:
Faça um evento “Mouse Left Released” e nele adicione um “Execute a piece of Code”.
Escreva o seguinte:

//Botão para fazer um Servidor
global.ServerName = get_string("Digite o nome do Servidor","");
instance_create(0,0,obj_Host);

Não tem muito segredo, é um código bem simples. Não vou explicar, pois se você não entendeu o que foi feito aqui você deve estudar mais GML antes de querer fazer um jogo online.
O botão do Client é praticamente a mesma coisa, só mude o código dele para o seguinte:

//Botão para conectar em um Servidor
global.connectIP = get_string("Digite o IP do Servidor","127.0.0.1");
instance_create(0,0,obj_Client);

Simples também.
Agora crie um outro objeto “Controlador” de sua preferência, eu gosto de chamá-lo de GAME (Deixe ele como Persistent). Nesse novo objeto, adicione um evento Create e coloque o seguinte código:

global.Nick = get_string("Digite seu Nick: ",""); //Pegar o nick do jogador
global.Server = 0; //Guarda o Socket do Servidor.
global.MyID = -1; //ID online do jogador
global.MaxPlayers = 0;

dllinit("39dll.dll",1); //Inicializar funções de Sockets da DLL.

O código junto dos comentários já está explicado, não vou entrar em mais detalhes aqui.
Feito isso coloque esse objeto na PRIMEIRA room do jogo, se você ainda não criou nenhuma, faça-o agora, vou usar ela como menu então a minha vai ter nome rm_Menu. O GAME deve ser o primeiro objeto a ser criado. Aproveite e monte o seu menu como quiser o meu ficou assim:



Já estamos prontos para iniciar a programar o Servidor.

Iniciando o Servidor:
Vamos para o objeto obj_Host. No evento Create adicione o seguinte:

//Criar servidor
global.Server = tcplisten(5068,5,1); //Inicializa o Servidor, fica em espera por conexões na porta 5068.
//Você pode mudar os argumentos dessa função como preferir.
//tcplisten(PORTA,CONEXÕES SIMUNTANEAS, MODO);
//PORTA -> Porta para conectar
//CONEXÕES SIMUNTANEAS -> Antes do jogador entrar mesmo no jogo, sua conexão deve ser aceita, enquanto isso ele ficara na "espera".
//Isso é para quantos você quer deixar na espera. Não é preciso um valor muito alto.
//MODO -> deixe o valor em 1, senão seu servidor ficará travado até alguem conectar

if (!global.Server) //Caso não tenha inicializado corretamente passar uma mensagem de erro.
{instance_destroy();
show_message("Erro ao criar o servidor");
exit;}

global.MaxPlayers = 10; //Limite de jogadores

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}

//Adicionar informações do servidor na lista [Servidor sempre é o 0]
players[0,PL_SOCK] = global.Server;
players[0,PL_NICK] = global.Nick;
global.MyID = 0;

room_goto(rm_WaitingRoom); //Depois de inicializar tudo corretamente ir para a tela de espera.
//Esse objeto é "Persistent", pois isso não será destruido na troca de rooms.

Comentei bastante o código para ficar fácil de entender. Mas temos que adicionar algumas Constantes ao nosso jogo, repare que ao criar a lista de jogadores foram usados os seguintes valores: PL_SOCK e PL_NICK, esses são Constantes e devem ser declarados para o Game Maker.
Vá em Global Game Settings, aba Constants. Insira os 3 valores da seguinte forma:
Name (Nome) Value (Valor)
PL_NICK 1
PL_SOCK 0

Muito bem, o evento Create está completo.


Conectando no Servidor:
Vamos para o obj_Client para iniciar a conexão, no Create coloque o código:
global.Server = tcpconnect(global.connectIP,5068,1);

if (!global.Server) //Se não conectarmos sair e exibir mensagem de erro
{instance_destroy();
show_message("Erro ao conectar");
exit;}

room_goto(rm_WaitingRoom);

Esse é bem curto, apenas conectamos no servidor e verificamos se foi possível a conexão. Se conectar vamos para a próxima tela, senão ficamos por aqui e exibimos uma mensagem de erro.


A estrutura de uma mensagem:
Antes de seguirmos para o próximo item, é preciso saber como é a estrutura das mensagens trocadas entre Client e Servidor. Na verdade é muito simples, mas sempre varia de mensagem para mensagem. A estrutura básica é assim:

Primeiros dois bytes = Tamanho da mensagem em bytes.
Terceiro byte = ID da mensagem. Serve para identificar qual o tipo de mensagem é essa, para que possamos manipulá-la corretamente.
Restantes = “Mensagem”.

Vamos ver um exemplo em que eu envio uma String “Testando” que tem ID de mensagem 5:

clearbuffer(); //Limpa o buffer interno, aqui é como uma Carta que vamos enviar, primeiro precisamos de um papel em branco, não é?
writebyte(5); //ID
writestring(“Testando”); //Mensagem
sendmessage(SOCKET); //Envia a mensagem para o Socket


Ué, mas cade os dois primeiros bytes de tamanho?
Esses são adicionados automaticamente pela DLL. Você não precisa se preocupar com eles.

Mas eles não são inúteis? Vou usar eles só para deixar a mensagem maior?
2 Bytes é pouca coisa, eles não vão te atrapalhar, eles também são lidos automaticamente. Se você acha que esses 2 bytes vão causar lags, está enganado. Esses bytes são necessários, é com eles que a DLL pode saber qual é o tamanho da mensagem para poder escrevê-la no buffer (Para podermos manipular depois). Imagine a mensagem recebida:

[Tamanho Total = 11 bytes]
Byte1 Valor: 9 (11 bytes contando esses 2, mas para o buffer eles não são contados)
Byte2

Os seguintes são carregados no buffer:
Byte3 ---- Valor: 5
Byte4 até Byte 11 ---- Valor: “Testando”

Nosso buffer ficaria assim:
Byte1 = 5
Byte2 = T
Byte3 = e
Byte4 = s
Byte5 = t
Byte6 = a
Byte7 = n
Byte8 = d
Byte9 = o

A leitura do buffer seria dessa forma:
IDdaMensagem = readbyte(); //Le o primeiro byte
Mensagem = readstring(); //Le todo o resto

No final teríamos os valores:
IDdaMensagem = 5
Mensagem = “Testando”

Ao usar o readbyte, readshort ou qualquer outra função de leitura os bytes são lidos e RETIRADOS do buffer (As funções retornam esses bytes removidos do buffer).
Então em muitos casos é preciso guardar esses bytes em alguma variável, mesmo que temporária.


Aceitando novas conexões:
Para aceitar novas conexões não é muito difícil, o código é bem curto. Vamos para o evento Step do objeto obj_Host e adicione o seguinte código:
//Aceitar novas conexões
var i, sock, newPL;
sock = tcpaccept(global.Server, 1);
if (!sock) //Se não existirem novas conexões
{exit;} //sair do script

for (i = 0; i < global.MaxPlayers; i+=1)
{
if (!players[i,PL_SOCK])
{
newPL = i;
break;
}
}

if newPL //Tem vagas no servidor
{
players[newPL,PL_SOCK] = sock;

//Enviar uma mensagem para o jogador, falando que ele foi aceito
clearbuffer(); //Limpar o buffer
writebyte(MSG_CONEXAO_ACEITA); //Byte identificador da mensagem
writebyte(newPL); //Enviar o ID do jogador
writebyte(global.MaxPlayers); //Enviar quantidade maxima de jogadores
sendmessage(sock); //Enviar mensagem
}
else //Servidor cheio
{
//Enviar uma mensagem para o jogador, falando que o servidor já está cheio e ele não pode se conectar.
clearbuffer(); //Limpar o buffer
writebyte(MSG_SERVIDOR_CHEIO); //Byte identificador da mensagem
sendmessage(sock); //Enviar mensagem

closesocket(sock);
}

Esse código é um pouquinho mais complicado. Agora nós recebemos a conexão do jogador e se houver espaço no servidor permitimos que ele entre, caso contrário enviamos uma mensagem falando que o servidor está cheio e terminamos a conexão com ele.
Note que aqui temos mais duas constantes:
MSG_CONEXAO_ACEITA
MSG_SERVIDOR_CHEIO


Crie elas também, os valores você que escolhe, mas eles NÃO podem ser maiores que 255 nem menores do que 0! Ou seja, são valores entre 0 e 255. Perceba que essas constantes tem um prefixo diferente das outras duas, elas começam com um “MSG_”, fizemos isso para identificar o tipo de uso para ela. Então para identificar as mensagens vamos usar constantes com prefixo MSG_. Logo não faz diferença se elas possuem o mesmo valor de outra constante, contando que não seja uma constante do tipo MSG_. Criei as minhas assim:
Nome Valor
MSG_CONEXAO_ACEITA 0
MSG_SERVIDOR_CHEIO 255

Recebendo as mensagens iniciais:
Ok, agora precisamos programar para o Client receber as mensagens do servidor, no evento Step do obj_Client coloque o seguinte:
//Receber mensagens do servidor
var size, msgID;
size = 1;

while (size)
{
size = receivemessage(global.Server); //Retorna a quantidade de bytes recebidos

if (!size) //Se não recebermos nada, sair desse script.
{exit;}

msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja o ID da mensagem.

switch (msgID)
{
case MSG_CONEXAO_ACEITA: //Fui aceito no servidor
global.MyID = readbyte(); //Pegamos o meu ID
global.MaxPlayers = readbyte(); //Lemos a quantidade de jogadores maxima no servidor

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
//players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}
players[global.MyID,PL_NICK] = global.Nick;

//Para dar continuidade agora vamos enviar o meu nick para o servidor
//e ele retornara com o nick de todos os jogadores
clearbuffer();
writebyte(MSG_PLDATA);
writestring(global.Nick);
sendmessage(global.Server);
break;

case MSG_SERVIDOR_CHEIO:
closesocket(global.Servidor); //Fechamos a conexão
show_message("Servidor lotado"); //Exibimos o erro
instance_destroy();
room_goto(rm_Menu); //Voltamos para o menu
exit;
break;
}
}

Lembre-se de adicionar a constante: MSG_PLDATA.
Agora já temos o sistema inicial pronto, agora é só troca de mensagens. Ainda precisamos fazer para o Servidor receber as mensagens, mas é bem parecido com o sistema do Client, possui apenas algumas mudanças.

Recebendo as mensagem do Client:
Para receber as mensagens do client vamos usar o obj_Host, no step adicione outro execute a piece of code, para não deixar o primeiro muito comprido e facilitar a procura de partes especificas no código depois se for necessário.
Assim como o do client, adicionando apenas um loop for e editando a mensagem recebida como necessário:
//Receber mensagens do Client
var size, msgID;

for (iPL = 1; iPL < global.MaxPlayers; iPL += 1) //Precisamos receber a mensagem de cada jogador
{ //Usamos "iPL" pois depois serão feitos outros loops e usar a variavel "i" pode gerar conflitos
size = 1;
while (size)
{
size = receivemessage(players[iPL,PL_SOCK]); //Receber a mensagem do socket de cada player

if (!size) //Se não recebermos nada, sair desse script e passar para o próximo player
{break;}

msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja o ID da mensagem.

switch (msgID)
{
case MSG_PLDATA: //Pegar dados do jogador
var nick;
nick = readstring(); //Ler o nick do jogador.

//Agora guardamos o nick na variavel do jogador:
players[iPL, PL_NICK] = nick;
//Não precisamos guardar o ID porque isso já foi feito quando ele se conectou!

//Agora vamos repassar para os outros jogadores:
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(iPL); //Os outros jogadores só recebem dados do servidor, então precisam saber o ID de qual player são esses dados
writestring(nick);
for (i=1; i < global.MaxPlayers; i+=1) //Como são varios jogadores, precisamos enviar para todos eles
{ //Usando um loop for isso fica bem facil! Repare que começamos do 1, porque o 0 é sempre o servidor.
if (i != iPL) //Não precisamos repassar a mensagem para quem a enviou
{sendmessage(players[i,PL_SOCK]);}
}

//O Hoster possui os dados de todos os jogadores então ele mesmo pode repassar os nicks dos demais players
for (i = 0; i < global.MaxPlayers; i += 1)
{
if (i != iPL) //Não enviar o nick do proprio jogador para ele mesmo
{
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(i);
writestring(players[i,PL_NICK]);
sendmessage(players[iPL,PL_SOCK]);
}
}
break;
}
}
}

Agora precisamos fazer os Clients receberem essa mensagem, vamos voltar para o obj_Client e adicionar uma outra mensagem a ser recebida, dessa vez vou passar apenas a parte que será adicionada:

case MSG_PLDATA:
players[readbyte(), PL_NICK] = readstring();
break;

Esse é bem curto, não é? Acho que nem precisamos de explicação. Apenas pegamos o ID de quem enviou a mensagem e usamos o valor na posição da array, depois lemos o Nick enviado par atribuir o valor na array.

A partir desse momento já são recebidos todos os dados de cada jogador e a base está pronta. Vamos adicionar um evento Draw no objeto GAME apenas para visualizar a lista e testarmos o código:

if room = rm_WaitingRoom
{
draw_text(200,16,"Tela de Espera");
}

if instance_exists(obj_Client)
{
for (i=0; i < global.MaxPlayers; i += 1)
{
draw_text(5,32+i*16, string(i)+" "+obj_Client.players[i,PL_NICK]);
}
}
else if instance_exists(obj_Host)
{
for (i=0; i < global.MaxPlayers; i += 1)
{
draw_text(5,32+i*16, string(i)+" Sock: "+string(obj_Host.players[i,PL_SOCK])+" Nick: "+obj_Host.players[i,PL_NICK]);
}
}


Para testar, crie o executável do jogo, copie ele e a DLL para outra pasta, de forma que você tenha duas cópias do jogo. Abra as 2, em cada uma você coloca um Nick diferente, em uma das telas você Cria um servidor, na outra Conecta com o IP 127.0.0.1.
Se tudo correr bem você verá uma lista nas duas telas, na do servidor contendo o valor do socket e Nick de cada jogador, na do client uma lista contendo apenas os Nicks. Se você recebeu algum erro, volte o tutorial e confira todos os códigos novamente.


Vou terminar essa aula por aqui. Na próxima colocaremos um chat e um botão na sala para começarmos o “jogo”, que será apenas um circulo de cada jogador se movendo pela tela. Finalizando o tutorial por completo.

Recomendo que você leia as descrições das funções dos scripts Buffer -> Writing e Reading. Para entender melhor como funciona cada um dos tipos de dados.

Você não vai postar uma engine do tutorial?
Não! Se eu postar uma engine a grande maioria irá apenas baixá-la e editar como quiser. Postando apenas o tutorial vocês terão que ler para fazer a engine! Assim sei que meu tempo para escrever o tutorial não foi desperdiçado e vocês aprenderão muito mais.
Se você seguir o tutorial a risca, não terá problemas para fazer a mesma engine que eu fui fazendo conforme escrevia o tutorial. Está tudo explicado passo a passo, exatamente da forma que eu fiz.


Última edição por Janx em Seg 07 Fev 2011, 18:10, editado 3 vez(es)

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por F. Nizzio em Ter 25 Jan 2011, 14:41

Eu não entendi o que ele falou.
Tem que explicar melhor, nem sempre as pessoas entendem todas essas coisas dificeis. Explicar melhor é a chave pra fazer coisas decentes.

Minha nota ao tutorial é acima da média: 5.5, porque pode ter gente que entende melhor.

Tenha um bom dia.
Nizzio

F. Nizzio

Número de Mensagens : 758
Idade : 21
Data de inscrição : 19/07/2008
Reputação : -6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por PedroX em Ter 25 Jan 2011, 15:18

Muito bom seu tutorial, esclareceu algumas duvidas minhas, eu nao sabia que uma string escrevia bytes para cada letra... muito bom mesmo!
Vai ter mais alguma parte?

Obs: Boa iniciativa de nao colocar a engine.

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por vinians em Ter 25 Jan 2011, 15:59

F. Nizzio escreveu:Eu não entendi o que ele falou.
Tem que explicar melhor, nem sempre as pessoas entendem todas essas coisas dificeis. Explicar melhor é a chave pra fazer coisas decentes.

Minha nota ao tutorial é acima da média: 5.5, porque pode ter gente que entende melhor.

Tenha um bom dia.
Nizzio
Amigo, este é um assunto avançado e requer que a pessoa não tenha dúvidas em nenhuma parte da engine do Game Maker para entende-lo. Tente ler novamente que você vai entender.

Ae JanX! Eu já vinha esperando esse tutorial a um bom tempo! Ficou muito fácil de ser entendido e muito bem explicado. E o fato de você não ter postado uma engine pronta é ótimo pois força a pessoa a realmente entender o funcionamento para criar sua própria engine. Excelente!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por itallo em Ter 25 Jan 2011, 18:45

cara, parabéns.
ótimo tutorial!!!!
não sei se foi de propósito, mas acho que achei uma "pegadinha" no meio dos scripts, um espaço em branco, se o cara não ler a engine, ele vai postar o erro.
algo que só quem usar o switch, ou sabe como funciona, ou é inteligente vai perceber.

tutorial ficou muito bom, Janx estou esperando pelo tuto III!!!
finalmente um tutorial para dll 39 em português.

itallo

Ranking : Sem avaliações
Número de Mensagens : 969
Idade : 24
Data de inscrição : 26/08/2009
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   :
   :

http://www.zuluhotel.com.br

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Super Games em Ter 25 Jan 2011, 19:14

Semple que eu baixo uma DLL ela não roda, fala que o PC está no modo de segurança Sad

Super Games

Ranking : Nota D
Número de Mensagens : 2704
Idade : 18
Data de inscrição : 10/06/2010
Notas recebidas : D
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por kevin sousa em Qua 26 Jan 2011, 16:02

otima minha engine ficou otima adorei seus tutorial agora vou fazer meu jogo online com mais facilidade

kevin sousa

Número de Mensagens : 119
Idade : 20
Data de inscrição : 21/02/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por carotmaker em Qua 26 Jan 2011, 17:52

como eu crio uma constante no gm 8 pro?
EDIT
ja descobri


Última edição por carotmaker em Qua 26 Jan 2011, 18:25, editado 1 vez(es)

carotmaker

Ranking : Nota D
Número de Mensagens : 149
Idade : 18
Data de inscrição : 11/07/2010
Notas recebidas : D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 26 Jan 2011, 18:09

Para fazer constantes do GM8 vá em Resources -> Define Constants
Ou simplesmente pressione shift+ctrl+N

Obrigado pelos comentários!

@CogumeloDoRock
Não fiz nada proposital assim... Mas sabe que não é má ideia?

@F. Nizzio
Esse é um tutorial avançado, como eu já disse. Leia o comentário do primeiro código desse tutorial Happy.

@Super Games
Você está tentando abrir a DLL como um arquivo qualquer? Porque não é isso que você deve fazer... Uma dll não funciona assim.

--
A parte III vai, infelizmente, demorar um pouco para sair. Só no próximo mês. Mas a partir dessa aula vocês já tem uma base para fazer algo sozinhos! Tentem fuçar um pouco! Happy

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Super Games em Qua 26 Jan 2011, 18:10

Estou abrindo conforme a Dll do fUzEnRaD.

Super Games

Ranking : Nota D
Número de Mensagens : 2704
Idade : 18
Data de inscrição : 10/06/2010
Notas recebidas : D
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por PedroX em Qua 26 Jan 2011, 18:21

Voce nao tem que abrir a DLL.
Somente o jogo.

E nao precisa criar um exe, basta selecionar em File - Preferencias - E desmarcar a opcao Hidden designer (algo assim).

Ai voce clica em testar para abrir o jogo e depois testar para abrir outro.

O jogo que abrira a Dll, nem precisa mecher no arquivo.

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por carotmaker em Qua 26 Jan 2011, 18:25

1-você fala para adicionar a constante MSG_PLDATA, mas não fala o valor...

2-você manda por o seguinte código no obj_Client:
Código:
case MSG_PLDATA:
    players[readbyte(), PL_NICK] = readstring();
break;
mas não fala em que evento

carotmaker

Ranking : Nota D
Número de Mensagens : 149
Idade : 18
Data de inscrição : 11/07/2010
Notas recebidas : D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por allanjau em Qua 26 Jan 2011, 19:20

Ola Janx, eu segui seu tuto e esta dando os seguintes erros, se nao for pedir muito tem como me ajudar?
Um Abraço e excelente tutorial
__________________________________________
ERROR in
action number 2
of Create Event
for object obj_Client:

Error in code at line 1:
case MSG_PLDATA:
^
at position 6: Case statement only allowed inside switch statement.

___________________________________________
ERROR in
action number 1
of Create Event
for object obj_Host:

Error in code at line 20:
players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
^
at position 12: Unknown variable PL_SOCK

allanjau

Número de Mensagens : 4
Idade : 25
Data de inscrição : 25/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por itallo em Qua 26 Jan 2011, 19:32

allanjau, leia o tutorial, ele está explicando o que fazer com a PL_SOCK.

carot:
isso vc deve adicionar no switch abaixo.

switch (msgID)
{
case MSG_CONEXAO_ACEITA: //Fui aceito no servidor
global.MyID = readbyte(); //Pegamos o meu ID
global.MaxPlayers = readbyte(); //Lemos a quantidade de jogadores maxima no servidor

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
//players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}
players[global.MyID,PL_NICK] = global.Nick;

//Para dar continuidade agora vamos enviar o meu nick para o servidor
//e ele retornara com o nick de todos os jogadores
clearbuffer();
writebyte(MSG_PLDATA);
writestring(global.Nick);
sendmessage(global.Server);
break;

case MSG_SERVIDOR_CHEIO:
closesocket(global.Servidor); //Fechamos a conexão
show_message("Servidor lotado"); //Exibimos o erro
instance_destroy();
room_goto(rm_Menu); //Voltamos para o menu
exit;
break;
}

itallo

Ranking : Sem avaliações
Número de Mensagens : 969
Idade : 24
Data de inscrição : 26/08/2009
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   :
   :

http://www.zuluhotel.com.br

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Markituh em Qua 26 Jan 2011, 19:44

allanjau escreveu:__________________________________________
ERROR in
action number 2
of Create Event
for object obj_Client:

Error in code at line 1:
case MSG_PLDATA:
^
at position 6: Case statement only allowed inside switch statement.
Uma instrução case tem que estar dentro de uma instrução switch.
allanjau escreveu:___________________________________________
ERROR in
action number 1
of Create Event
for object obj_Host:

Error in code at line 20:
players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
^
at position 12: Unknown variable PL_SOCK
Você pode não ter criado a variável ou colocou ela com o nome errado.

Tipo Janx, seu tutorial é muito, mas muito avançado Happy" Mas isso aí é sobre criar um jogo online avançado obviamente. Não li por que não pretendo criar um jogo online, pois isso exige uma enorme paciência e gasto de tempo, que muitos iniciantes ficam dizendo
"pow veio, eu axei que era mais facil! eu nao entendo nada desses codigos!"
Vá estudar, meu amigo, leia o tutorial com calma que tu aprendes Very Happy Não é que eu seja impaciente, mas eu realmente não pretendo criar um jogo online.

Abraços! flw

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 26 Jan 2011, 19:50

carotmaker escreveu:1-você fala para adicionar a constante MSG_PLDATA, mas não fala o valor...

2-você manda por o seguinte código no obj_Client:
Código:
case MSG_PLDATA:
    players[readbyte(), PL_NICK] = readstring();
break;
mas não fala em que evento

1-
Crie elas também, os valores você que escolhe, mas eles NÃO podem ser maiores que 255 nem menores do que 0! Ou seja, são valores entre 0 e 255. Perceba que essas constantes tem um prefixo diferente das outras duas, elas começam com um “MSG_”, fizemos isso para identificar o tipo de uso para ela. Então para identificar as mensagens vamos usar constantes com prefixo MSG_. Logo não faz diferença se elas possuem o mesmo valor de outra constante, contando que não seja uma constante do tipo MSG_. Criei as minhas assim:
...
O valor das constantes não é muito importante (ele só não pode ser igual a outra constante usada para a mesma finalidade [no caso, identificar as mensagens]). Só usamos constantes para ficar mais fácil LER e ENTENDER o código. Imagine se só fossem usados valores como 0 e 255 no lugar das constantes "MSG_CONEXAO_ACEITA" e "MSG_SERVIDOR_CHEIO". Usando apenas essas duas até fica facil lembrar o que cada valor significa, mas quando o seu jogo/programa/projeto ficar maior provavelmente vai ter mais de 30 tipos diferentes de mensagens, quem sabe muito mais. Decorar tudo não é tão fácil. Errar o valor = BUGS. Usando constantes fica fácil lembrar o nome e a função do valor (apesar que não precisamos saber o valor, apenas o nome da constante).

2-
No unico lugar onde o client recebe as mensagens!
Agora precisamos fazer os Clients receberem essa mensagem, vamos voltar para o obj_Client e adicionar uma outra mensagem a ser recebida:
Recebendo as mensagens iniciais:
Ok, agora precisamos programar para o Client receber as mensagens do servidor, no evento Step do obj_Client coloque o seguinte:


@allanjau
Você criou as constantes?

Você está colocando o código
case MSG_PLDATA:
players[readbyte(), PL_NICK] = readstring();
break;

NO CREATE? Não é ai que ele fica...
"case" é usado em SWITCH. Basta ler o erro.

@Super Games
Você não tem que fazer nada com a DLL, só deixar ela na pasta do jogo. A dll é carregada pelo script "dllinit".


Acho que vocês precisam estudar um pouco mais sobre GML / Lógica de programação antes de seguirem o tutorial! Estão cometendo alguns erros básicos.

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por allanjau em Qua 26 Jan 2011, 19:59

vlwww Janx sabia que estava esquecendo algo muito obrigado, vlw cogumelo pela help.

allanjau

Número de Mensagens : 4
Idade : 25
Data de inscrição : 25/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Tedi Ripper em Qua 26 Jan 2011, 20:49

Kra, eu amo tutoriais de Gm online, sempre quis fazer um jogo que tivesse tantos assesos quanto um Tibia.

pena q eu tenho gm8 Lite Sad

mas tudo bem,
quando eu comprar o pró, eu vou usar esse tuto, sempre quis um tuto com 39Dll

Tedi Ripper

Ranking : Nota C
Número de Mensagens : 765
Idade : 19
Data de inscrição : 21/11/2010
Notas recebidas : C
Reputação : 24
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por carotmaker em Qua 26 Jan 2011, 20:51

Janx escreveu:
carotmaker escreveu:1-você fala para adicionar a constante MSG_PLDATA, mas não fala o valor...

2-você manda por o seguinte código no obj_Client:
Código:
case MSG_PLDATA:
    players[readbyte(), PL_NICK] = readstring();
break;
mas não fala em que evento

1-
Crie elas também, os valores você que escolhe, mas eles NÃO podem ser maiores que 255 nem menores do que 0! Ou seja, são valores entre 0 e 255. Perceba que essas constantes tem um prefixo diferente das outras duas, elas começam com um “MSG_”, fizemos isso para identificar o tipo de uso para ela. Então para identificar as mensagens vamos usar constantes com prefixo MSG_. Logo não faz diferença se elas possuem o mesmo valor de outra constante, contando que não seja uma constante do tipo MSG_. Criei as minhas assim:
...
O valor das constantes não é muito importante (ele só não pode ser igual a outra constante usada para a mesma finalidade [no caso, identificar as mensagens]). Só usamos constantes para ficar mais fácil LER e ENTENDER o código. Imagine se só fossem usados valores como 0 e 255 no lugar das constantes "MSG_CONEXAO_ACEITA" e "MSG_SERVIDOR_CHEIO". Usando apenas essas duas até fica facil lembrar o que cada valor significa, mas quando o seu jogo/programa/projeto ficar maior provavelmente vai ter mais de 30 tipos diferentes de mensagens, quem sabe muito mais. Decorar tudo não é tão fácil. Errar o valor = BUGS. Usando constantes fica fácil lembrar o nome e a função do valor (apesar que não precisamos saber o valor, apenas o nome da constante).

2-
No unico lugar onde o client recebe as mensagens!
Agora precisamos fazer os Clients receberem essa mensagem, vamos voltar para o obj_Client e adicionar uma outra mensagem a ser recebida:
Recebendo as mensagens iniciais:
Ok, agora precisamos programar para o Client receber as mensagens do servidor, no evento Step do obj_Client coloque o seguinte:


@allanjau
Você criou as constantes?

Você está colocando o código
case MSG_PLDATA:
players[readbyte(), PL_NICK] = readstring();
break;

NO CREATE? Não é ai que ele fica...
"case" é usado em SWITCH. Basta ler o erro.

@Super Games
Você não tem que fazer nada com a DLL, só deixar ela na pasta do jogo. A dll é carregada pelo script "dllinit".


Acho que vocês precisam estudar um pouco mais sobre GML / Lógica de programação antes de seguirem o tutorial! Estão cometendo alguns erros básicos.
Deu este error:

___________________________________________
ERROR in
action number 2
of Step Event
for object obj_Client:

Error in code at line 1:
case MSG_PLDATA:
^
at position 6: Case statement only allowed inside switch statement.

carotmaker

Ranking : Nota D
Número de Mensagens : 149
Idade : 18
Data de inscrição : 11/07/2010
Notas recebidas : D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Markituh em Qua 26 Jan 2011, 21:00

Uma instrução case tem que estar dentro de uma instrução switch.
Janx escreveu:"case" é usado em SWITCH. Basta ler o erro.
Duh! Happy

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Tedi Ripper em Qua 26 Jan 2011, 21:08

krak, essas citacoes, n da pra indende nada, lol

Ai Markituh, eu n consigo intende como vc tem1168 mensagens, e se registrou em 2009, eu nunca tinha visto vc no forum

Tedi Ripper

Ranking : Nota C
Número de Mensagens : 765
Idade : 19
Data de inscrição : 21/11/2010
Notas recebidas : C
Reputação : 24
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por williamsp em Dom 30 Jan 2011, 12:59

vc deveria ser mais especifico com seu tutorial
como saber onde colocar alguns codigos se vc nao especifica onde colocalos
exemplo


A estrutura de uma mensagem:
Antes de seguirmos para o próximo item, é preciso saber como é a estrutura das mensagens trocadas entre Client e Servidor. Na verdade é muito simples, mas sempre varia de mensagem para mensagem. A estrutura básica é assim:

Primeiros dois bytes = Tamanho da mensagem em bytes.
Terceiro byte = ID da mensagem. Serve para identificar qual o tipo de mensagem é essa, para que possamos manipulá-la corretamente.
Restantes = “Mensagem”.

Vamos ver um exemplo em que eu envio uma String “Testando” que tem ID de mensagem 5:
view source
print?
1 clearbuffer(); //Limpa o buffer interno, aqui é como uma Carta que vamos enviar, primeiro precisamos de um papel em branco, não é?
2 writebyte(5); //ID
3 writestring(“Testando”); //Mensagem
4 sendmessage(SOCKET); //Envia a mensagem para o Socket


Ué, mas cade os dois primeiros bytes de tamanho?
Esses são adicionados automaticamente pela DLL. Você não precisa se preocupar com eles.


isso vai onde coloca isso em q lugar ou ele fica flutuando nos scriptis

williamsp

Número de Mensagens : 5
Idade : 30
Data de inscrição : 26/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.receitasegostosuras.com

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por PedroX em Dom 30 Jan 2011, 13:58

Isso nao coloca em lugar algum. Esse é so pra voce entender como faz.
Nao é necessario por em lugar nenhum.

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por .:Allison:. em Ter 01 Fev 2011, 23:15

Nesse Tutorial se eu não mim engano, você usou HTML certo ? Como funciona esse tipo de mixagem ?

.:Allison:.

Ranking : Nota B
Número de Mensagens : 630
Idade : 19
Data de inscrição : 25/07/2010
Notas recebidas : B
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://clubmaker.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Markituh em Ter 01 Fev 2011, 23:25

HTML? O tutorial não fala nada a respeito de HTML. Ele usa sockets para fazer a conexão, usando a 39dll. E um sistema de bytes para enviar dados entre os computadores.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por itarodrigo em Qua 02 Fev 2011, 00:12

F. Nizzio escreveu:Eu não entendi o que ele falou.
Tem que explicar melhor, nem sempre as pessoas entendem todas essas coisas dificeis. Explicar melhor é a chave pra fazer coisas decentes.

Minha nota ao tutorial é acima da média: 5.5, porque pode ter gente que entende melhor.

Tenha um bom dia.
Nizzio

A melhor forma de entender alguma coisa é perguntando a quem sabe, e para isso existe o fórum, para perguntar.

Comece estudando cada parte separadamente, e só passe para o próximo código quando entender o anterior, e sempre que tiver dúvida pergunte.

Acredito que isso é a melhor dica para quem está aprendendo.

Quando entrei aqui eu nao sabia nada de GML, e hoje já consigo fazer meus proprios codigos, porem, quando tenho duvida corro pra cá, pois sei que tem muita gente competente aqui para ajudar.

Se achou dificil de entender esse tutorial, comece tentando entender outros mais fáceis.

Abraço.

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Natch em Qua 02 Fev 2011, 13:51

optimo tutorial
funcionou perfeitamente, só que quando adicono um 3º jogador, a lista de jogadores não actualiza nesse 3º jogador

mas estas de Parabens, assim já posso fazer um joguinho online Smile

Natch

Número de Mensagens : 501
Idade : 27
Data de inscrição : 05/06/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://studionatch.com.sapo.pt/

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 02 Fev 2011, 14:29

Natch escreveu:optimo tutorial
funcionou perfeitamente, só que quando adicono um 3º jogador, a lista de jogadores não actualiza nesse 3º jogador

mas estas de Parabens, assim já posso fazer um joguinho online Smile

Realmente, havia um pequeno errinho no código. Mas já esta consertado.
Obrigado por ter percebido o bug!

ATENÇÃO!
Se você seguiu o tutorial antes do dia 02/02/2011 você deve corrigir um pequeno pedaço do código:


STEP - SEGUNDO SCRIPT - OBJETO obj_Host
01 //Receber mensagens do Client
02 var size, msgID;
03
04 for (iPL = 1; iPL < global.MaxPlayers; iPL += 1) //Precisamos receber a mensagem de cada jogador
05 { //Usamos "iPL" pois depois serão feitos outros loops e usar a variavel "i" pode gerar conflitos
06 size = 1;
07 while (size)
08 {

Adicione logo depois do loop FOR a linha:
size = 1;

E remova a linha "size = 1;" anterior. Ela não é necessária.

Porque o bug ocorreu:
Depois de não receber mais mensagens no primeiro player, a variável size recebia valor 0 e então era passado para o próximo jogador. Como a variável não era resetada o jogador era pulado e assim sucessivamente. Sendo lida apenas a mensagem do primeiro jogador.

Como eu disse... um pequeno errinho pode gerar grandes problemas...

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por itarodrigo em Qua 02 Fev 2011, 14:35

tenho uma duvida quanto a jogos assim.

que tipo de programa se usa para criar o servidor e deixar o programa server rodando nele?

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 02 Fev 2011, 17:03

itarodrigo escreveu:tenho uma duvida quanto a jogos assim.

que tipo de programa se usa para criar o servidor e deixar o programa server rodando nele?

"que tipo de programa se usa para criar o servidor e deixar o programa server rodando nele?"
Não intendi o que você quis dizer...

Você quer dizer, um jogo online tipo um "mmo"? Como funcionar o servidor "global" do jogo?
O servidor não necessariamente precisa participar do jogo como estamos fazendo nesse tutorial. Ele pode ser apenas a ligação entre um jogador e outro. O que ele faria seria receber, repassar e guardar informações dos jogadores.
Esse servidor pode ser feito no Game Maker mesmo. Embora eu não acho que seja uma boa ideia pra um jogo grande, já que seriam inúmeras mensagens para serem manipuladas. Como sabemos o GM não é muito rápido se comparado a uma linguagem "pura". Não é que o GM não possa fazer, o problema é a quantidade de mensagens que ele vai conseguir manipular o mais rápido possível, atrasar as mensagens significa LAG e não queremos isso no jogo, certo?

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por itarodrigo em Qua 02 Fev 2011, 17:38

entao, caso eu hospede um jogo servidor, em meu pc, por exemplo, outros usuarios conseguiriam acessar, mesmo sem estar em minha rede?

itarodrigo

Número de Mensagens : 599
Idade : 33
Data de inscrição : 28/08/2010
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por PedroX em Qua 02 Fev 2011, 18:01

Cara se voce colocar um jogo servidor no seu PC, ele estiver rodando e conectado, da sim.
Exemplo:
Voce poe o servidor rodando ai e deixa conectado. Voce pode ir aonde quiser que o jogo repassara as mensagens para os clientes. Desde que sua conexao nao caia, pq se cair tera que voltar e so depois enviara as mensagens, dando problemas etc.

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 02 Fev 2011, 18:18

itarodrigo escreveu:entao, caso eu hospede um jogo servidor, em meu pc, por exemplo, outros usuarios conseguiriam acessar, mesmo sem estar em minha rede?

mesmo sem estar em minha rede, você quer dizer, sem estarem em LAN? Sim.
Mas claro que eles vão estar conectados a você.

Todo jogo online se conecta em um servidor. Se você tem algum firewall, dependendo das suas configurações, quando algum programa ou JOGO tenta acessar a internet (conectar no servidor?) você pode ver até mesmo o IP dele.
Você quer hospedar um servidor no seu computador? Sem problemas, mas saiba que você vai precisar de uma internet muito boa. Igualmente na taxa de upload e download dela! Tomar algumas medidas de segurança para evitar a invasão também é fundamental. Você tem que ter muita coisa em mente, não vá simplesmente abrindo o seu computador para a internet! Pode ser perigoso!

Lembrando que o que eu falo não é 100% correto, podem existir muitas variantes ai no meio. Mas pela minha experiencia, pesquisas, testes e conhecimento sobre o assunto, o que eu te digo é o que eu acredito ser o conceito certo! Você pode pesquisar por conta própria também, provavelmente você deve achar o que eu encontrei.

Enfim, estamos fugindo do assunto do tópico. Se quiser continuar a conversa, mande MPs ou abre um tópico para discutirmos isso, ok? Se quiser, pode criar na seção:
IA, Física, Banco de dados, 3D e Online

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Mannoroth em Seg 07 Fev 2011, 23:40

Eu acho q fiz tudo direito, mas na hora de testar, na tela de espera nao aprece os dados (nem na tela do servidor, nem dna do cliente).
Eu reli tudo e nao sei o que tá faltando, criei o executavel com a DLL numa pasta e copia desse executavel junto com copia da DLL noutra pasta...
... abri os dois: em um eu fui no servidor e digitei um nome pra uma sala; nem outro eu fui no icone do cliente, 127.0.0.1 e dei ok. Nas duas so aparece a mensagem 'tela de espera' direto.
Ajudae Janx.

Mannoroth

Ranking : Nota D
Número de Mensagens : 836
Idade : 26
Data de inscrição : 05/10/2010
Notas recebidas : D+D
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Super Games em Ter 08 Fev 2011, 09:32

Aqui no meu não tem a aba Constants.

Super Games

Ranking : Nota D
Número de Mensagens : 2704
Idade : 18
Data de inscrição : 10/06/2010
Notas recebidas : D
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Ter 08 Fev 2011, 17:26

Mannoroth escreveu:Eu acho q fiz tudo direito, mas na hora de testar, na tela de espera nao aprece os dados (nem na tela do servidor, nem dna do cliente).
Eu reli tudo e nao sei o que tá faltando, criei o executavel com a DLL numa pasta e copia desse executavel junto com copia da DLL noutra pasta...
... abri os dois: em um eu fui no servidor e digitei um nome pra uma sala; nem outro eu fui no icone do cliente, 127.0.0.1 e dei ok. Nas duas so aparece a mensagem 'tela de espera' direto.
Ajudae Janx.

Nas duas so aparece a mensagem 'tela de espera' direto
Você quer dizer como um "show_message", ou é a unica coisa que aparece escrita na tela?

Código:
01   if room = rm_WaitingRoom
02   {
03       draw_text(200,16,"Tela de Espera");
04   }
05   
06   if instance_exists(obj_Client)
07   {
08       for (i=0; i < global.MaxPlayers; i += 1)
09       {
10           draw_text(5,32+i*16, string(i)+" "+obj_Client.players[i,PL_NICK]);
11       }
12   }
13   else if instance_exists(obj_Host)
14   {
15       for (i=0; i < global.MaxPlayers; i += 1)
16       {
17           draw_text(5,32+i*16, string(i)+" Sock: "+string(obj_Host.players[i,PL_SOCK])+" Nick: "+obj_Host.players[i,PL_NICK]);
18       }
19   }

Você percebeu que nas linhas 06 e 13 é checado se o objeto X existe? Se você usou outro nome para os objetos você deve trocar nessas linhas, senão o jogo não vai desenhar nada. Se não deu erro nenhum, provavelmente o problema está nesse DRAW, as informações só não estão sendo mostradas.

@Super Games
No GM 8 vá na aba RESOURCES -> DEFINE CONSTANTS
Ou pressione ctrl + shift + N

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Super Games em Ter 08 Fev 2011, 18:03

Aqui tambem não tem...

Super Games

Ranking : Nota D
Número de Mensagens : 2704
Idade : 18
Data de inscrição : 10/06/2010
Notas recebidas : D
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Mannoroth em Qua 09 Fev 2011, 01:38

Janx escreveu:Você quer dizer como um "show_message", ou é a unica coisa que aparece escrita na tela?

É isso aqui q aparece tanto no cliente quanto no server:


Janx escreveu:Você percebeu que nas linhas 06 e 13 é checado se o objeto X existe? Se você usou outro nome para os objetos você deve trocar nessas linhas, senão o jogo não vai desenhar nada.
Eu não mudei os nomes dos objetos, são obj_Host e obj_Client mesmo. Eu revisei tudo mais uma vez e nao entendi o q falta. Q tal se eu te mandar o meu .gmk como ficou e vc ver se tem algo errado (meu interesse é aprender mesmo, mas realmente nao identifiquei o q tá faltando).

Sobre alocar os objetos nas rooms: na room_WaitingRoom não botei objeto nenhum incialmente, e na room rm_menu botei o obj_btmhost e obj_btmclient e tambem o GAME, só esses três ae, já q o obj_Client e obj_Host serão criados posteriormente atraves de eventos.

Mannoroth

Ranking : Nota D
Número de Mensagens : 836
Idade : 26
Data de inscrição : 05/10/2010
Notas recebidas : D+D
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 09 Fev 2011, 12:54

Aparentemente é algum erro no DRAW, mas se quiser mandar o projeto para eu dar uma olhada pode mandar.
obj_Client e obj_Host são criados por eventos mesmo.

De uma olhada na variável global.MaxPlayers, talvez você tenha atribuído valor 0 a ela. Coloque 10.

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Mannoroth em Qua 09 Fev 2011, 20:56

[quote="Janx"]
Agora crie um outro objeto “Controlador” de sua preferência, eu gosto de chamá-lo de GAME (Deixe ele como Persistent). Nesse novo objeto, adicione um evento Create e coloque o seguinte código:

global.Nick = get_string("Digite seu Nick: ",""); //Pegar o nick do jogador
global.Server = 0; //Guarda o Socket do Servidor.
global.MyID = -1; //ID online do jogador
global.MaxPlayers = 0;

dllinit("39dll.dll",1); //Inicializar funções de Sockets da DLL.




Iniciando o Servidor:
Vamos para o objeto obj_Host. No evento Create adicione o seguinte:

//Criar servidor
global.Server = tcplisten(5068,5,1); //Inicializa o Servidor, fica em espera por conexões na porta 5068.
//Você pode mudar os argumentos dessa função como preferir.
//tcplisten(PORTA,CONEXÕES SIMUNTANEAS, MODO);
//PORTA -> Porta para conectar
//CONEXÕES SIMUNTANEAS -> Antes do jogador entrar mesmo no jogo, sua conexão deve ser aceita, enquanto isso ele ficara na "espera".
//Isso é para quantos você quer deixar na espera. Não é preciso um valor muito alto.
//MODO -> deixe o valor em 1, senão seu servidor ficará travado até alguem conectar

if (!global.Server) //Caso não tenha inicializado corretamente passar uma mensagem de erro.
{instance_destroy();
show_message("Erro ao criar o servidor");
exit;}

global.MaxPlayers = 10; //Limite de jogadores

//Criar lista de Jogadores.
for (i = 0; i < global.MaxPlayers; i += 1)
{
players[i,PL_SOCK] = -3; //Socket do player [Só usado no Host]
players[i,PL_NICK] = ""; //Nick do player
}

//Adicionar informações do servidor na lista [Servidor sempre é o 0]
players[0,PL_SOCK] = global.Server;
players[0,PL_NICK] = global.Nick;
global.MyID = 0;

room_goto(rm_WaitingRoom); //Depois de inicializar tudo corretamente ir para a tela de espera.
//Esse objeto é "Persistent", pois isso não será destruido na troca de rooms.

clearbuffer();
writebyte(MSG_PLDATA);
writebyte(iPL); //Os outros jogadores só recebem dados do servidor, então precisam saber o ID de qual player são esses dados
writestring(nick);
for (i=1; i < global.MaxPlayers; i+=1) //Como são varios jogadores, precisamos enviar para todos eles
{ //Usando um loop for isso fica bem facil! Repare que começamos do 1, porque o 0 é sempre o servidor.
if (i != iPL) //Não precisamos repassar a mensagem para quem a enviou
{sendmessage(players[i,PL_SOCK]);}
}

//O Hoster possui os dados de todos os jogadores então ele mesmo pode repassar os nicks dos demais players
for (i = 0; i < global.MaxPlayers; i += 1)
{
if (i != iPL) //Não enviar o nick do proprio jogador para ele mesmo
{
clearbuffer();
writebyte(MSG_PLDATA);
writebyte(i);
writestring(players[i,PL_NICK]);
sendmessage(players[iPL,PL_SOCK]);
}
}
break;
}
}
}


No seu tutorial existem duas variaveis global.MaxPlayers sendo criadas, uma no obj_Host e outra no objeto GAME, em uma o valor é 0, na outra o valor é 10.

De qualquer jeito eu acabei de alterar as duas pra 10 e mesmo assim o problema continua, vou te mandar o .gmk por MP.

Mannoroth

Ranking : Nota D
Número de Mensagens : 836
Idade : 26
Data de inscrição : 05/10/2010
Notas recebidas : D+D
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Qua 09 Fev 2011, 23:10

Não é que "cria" duas vezes. Ela é criada no GAME a primeira vez com valor 0, depois se o cara faz um servidor ela é setada para 10. O client continua com o valor 0 até receber a quantidade de jogadores para ele criar o Array.

Manda o GMK que eu vejo aqui.

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por irlansn em Qua 09 Fev 2011, 23:15

este tutorial é feito totalmente no Game Maker?

irlansn

Ranking : Nota C
Número de Mensagens : 482
Idade : 18
Data de inscrição : 18/01/2011
Notas recebidas : B+D
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Furious God em Qui 17 Fev 2011, 15:38

eu fiz e deu certo '-'
obrigadão, espero pelo prox tuto, dai que vai ficar bom \o/

Furious God

Número de Mensagens : 62
Idade : 18
Data de inscrição : 10/05/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Gabreel em Dom 27 Fev 2011, 23:24

Janx, esse tutorial funcionaria sem nenhum problema em roteadores? Ou teria que usar o Hamachi (Jamais abrir portas!)?

Gabreel

Número de Mensagens : 2227
Idade : 20
Data de inscrição : 02/10/2009
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por MatheusReis em Dom 27 Fev 2011, 23:45

@Biel
Se usar o 39dll, não é necessário hamachi.

MatheusReis

Ranking : Nota A
Número de Mensagens : 1087
Idade : 23
Data de inscrição : 13/01/2010
Notas recebidas : B-A-A
Reputação : 30
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 0

http://www.mathaeuz.deviantart.com

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Seg 28 Fev 2011, 14:58

·ßieL escreveu:Janx, esse tutorial funcionaria sem nenhum problema em roteadores? Ou teria que usar o Hamachi (Jamais abrir portas!)?

Problemas com o roteador não tem como escapar. Isso não é erro do jogo. O que acontece é que a partir do momento que você usa um roteador, seu computador e os outros da rede recebem um IP, normalmente 192.168.0.X. Quando você faz um servidor, você deve receber as outras conexões, certo? O problema é que o roteador não sabe para qual dos IPs da rede redirecionar a conexão. Então o jogo não recebe as conexões...

Então você poderia "abrir a porta" no roteador. Quando você faz isso você precisa colocar lá para qual IP da rede ele deve redirecionar a conexão que entra na porta X (Você deve o IP de rede do seu PC [192.168.0.???] ).
O hamachi faz uma rede virtual então ele contorna esses problemas. É como se todo mundo estivesse jogando em "LAN". O problema é que todos devem estar conectados na "rede" -> Hamachi. Existem outros programas que fazem isso, o hamachi é o mais popular, mas com outros também funciona!

Pelo menos, depois de tudo o que eu li sobre, é isso o que eu entendi... =P

@irlansn
Não, fiz no word! Hehehe
O tutorial é para o Game Maker versão PRO.

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Gabreel em Seg 28 Fev 2011, 20:19

Hm, entendi, se conhece algum programa portable para que eu pudesse fazer de acompanhamento com algum jogo?

Gabreel

Número de Mensagens : 2227
Idade : 20
Data de inscrição : 02/10/2009
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Janx em Seg 28 Fev 2011, 21:44

Um programa como o hamachi? Não, não conheço nenhum... E acho que pode ser dificil encontrar visto que o Hamachi cria uma rede virtual que é vista como outro "hardware" do computador. Não sei se vai ter algum modo de isso ser "portatil"...
Mas também não garanto que não exista =P

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Gabreel em Seg 28 Fev 2011, 22:00

Não precisa ser portátil, mas minimamente decente.

O Hamachi começa com umas configurações padrões que podem incomodar muito, e podem fazer o o usuário desistir de jogar. ~;)

Se alguem saber fala. ;P

No google por Hamachi portable havia um projeto em desenvolvimento, não sei se foi acabado.

Gabreel

Número de Mensagens : 2227
Idade : 20
Data de inscrição : 02/10/2009
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Mart10carado em Ter 31 Maio 2011, 20:44

a paciencia dava um erro corrigia dava outro e outro e outro Evil or Very Mad
pirei lol!

perdi tempo vou baixa uma engine o google e editar Twisted Evil

Mart10carado

Número de Mensagens : 134
Data de inscrição : 27/05/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Tutorial - Como fazer um jogo multiplayer online - Parte II

Mensagem por Conteúdo patrocinado Hoje à(s) 04:02


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Página 1 de 2 1, 2  Seguinte

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum