Massive multiplayer online - parte 2

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

Devo continuar com os tutoriais?

100% 100% 
[ 6 ]
0% 0% 
[ 0 ]
 
Total dos votos : 6

100% Massive multiplayer online - parte 2

Mensagem por Pit Bull em Dom 24 Mar 2013, 22:19

Massive multiplayer online
parte 2


Caso não tenha lido a parte 1 este é o LINK.

Nível: iniciante.
Descrição:Este tutorial irá abortar todos os conceitos sobre MMO, desde mensagens simultâneas, banco de dados até o projeto final: jogo MMORPG.
Todos os comandos da 39dll estão neste LINK.

Nesta segunda parte, vou criar um chat e dar como inicio ao projeto final que é um jogo de rpg.

Primeiro precisamos criar 2 projetos no game maker: o cliente e o servidor.
Cliente
Inclua todos os comandos da 39dll dentro do projeto do cliente.

Vamos organizar nosso projeto da seguinte forma:

O primeiro objeto vai se chamar obj_conexao, ele ficará responsável por todas as mensagens que o cliente vai receber, crie outro chamado obj_chat, que será nosso chat na tela.

obj_conexao:
Quando o jogador iniciar o jogo, ele será questionado sobre seu nome.
Código:
nome=get_string("digite seu nome","")
Apenas precisamos do nome de cada jogador para diferencia-los no chat.
Vamos nos conectar ao servidor.
Código:
dllinit(0,1,1);
ip_do_servidor='127.0.0.1'
porta_de_conexao=5050
server = tcpconnect(ip_do_servidor,porta_de_conexao,1);
Conectamos a dll ao cliente, isso fará todos os comandos dentro do game maker funcionarem.
Criamos 2 variáveis que armazenarão os dados do servidor, como ip e porta, respectivamente.
Criamos outra variável que armazenará a identificação do servidor, que será util para enviar e receber mensagens dele.

No final seu codigo dentro do Create Event será:
Código:
nome=get_string("digite seu nome","")
dllinit(0,1,1);
ip_do_servidor='127.0.0.1'
porta_de_conexao=5050
server = tcpconnect(ip_do_servidor,porta_de_conexao,1);
if (server<0)
    {
        show_message("servidor desligado")
        game_end()
    }
//se chegou nessa linha e porque conectou ao server
instance_create(0,0,obj_chat)
Essas ultimas linhas verificam se conectou ou não ao servidor, caso não tenha conectado ele vai mostrar uma mensagem na tela dizendo servidor desligado e fechará automaticamente o jogo.
O código tcpconnect geralmente retorna 0 ou -1 caso não tenha conectado.
Caso tenha conectado, o chat será criado.

obj_chat:

Você precisa criar uma lista para armazenar toda a conversa no chat, vamos usar arrays.
Código:
for(i=1;i<=10;i+=1)
{
    chat[i]=""
}
Caso não conheça o for, não continue o tutorial enquanto não souber usar o for, pois e de extrema importância seu uso.
Foram criados 10 linhas para o chat, começando de chat[1] à chat[10].
No final seu codigo dentro do Create Event será:
Código:
for(i=1;i<=10;i+=1)
{
    chat[i]=""
}
Precisamos que o cliente mostre o chat na tela.
Código:
for(i=1;i<=10;i+=1)
{
    draw_text(0,0+(25*(i-1)),chat[i])
}
A expressão 0+(25*(i-1)) foi usada para desenhar na tela cada linha do chat.
Vou demostrar passo a passo como funciona com o i valendo 1:

>>>>draw_text(0,0+(25*(1-1)),chat[1])
>>>draw_text(0,0+(25*(0)),chat[1])
>>draw_text(0,0+(25*0),chat[1])
>draw_text(0,0+0,chat[1])
draw_text(0,0,chat[1])

Agora para i valendo 2:

>>>>draw_text(0,0+(25*(2-1)),chat[2])
>>>draw_text(0,0+(25*(1)),chat[2])
>>draw_text(0,0+(25*1),chat[2])
>draw_text(0,0+25,chat[2])
draw_text(0,25,chat[2])

Cada linha terá um espaço de 25 pixels em baixo da anterior.
No final seu codigo dentro do Draw Event será:
Código:
for(i=1;i<=10;i+=1)
{
    draw_text(0,0+(25*(i-1)),chat[i])
    draw_text(0,450,nome+">>"+keyboard_string)//tudo que você escrever vai aparecer aqui
}

Servidor
Inclua todos os comandos da 39dll dentro do projeto do servidor.
Crie um objeto chamado obj_server, ele enviará e receberá todas as mensagens para os clientes.

Vamos ligar a dll no servidor, mandar o servidor escutar todas as conexões na porta 5050 que foi usada no cliente.
Código:
dllinit(0,1,1);
porta_de_conexao=5050
quantidade_maxima_de_jogadores=100
porta=tcplisten(porta_de_conexao,quantidade_maxima_de_jogadores,1)

A variável porta será usada para aceitar a conexão do jogador.
Precisamos criar nossa lista de jogadores.
Código:
for(i=1;i<=quantidade_maxima_de_jogadores;i+=1)
{
    jogador[i]=0  //identificação
}
Essa parte foi explicada na parte 1 do tutorial MMO.
No final seu codigo dentro do Create Event será:
Código:
dllinit(0,1,1);
porta_de_conexao=5050
quantidade_maxima_de_jogadores=100
porta=tcplisten(porta_de_conexao,quantidade_maxima_de_jogadores,1)

for(i=1;i<=quantidade_maxima_de_jogadores;i+=1)
{
    jogador[i]=0  //identificação
}
A partir de agora, o servidor está "ouvindo" todas as conexões na porta 5050, precisamos fazer ele aceitar essas conexões.
Como todos sabem, o Step Event e acionado 30 vezes por segundo, nele vai ser colocado o codigo para aceitar, pois atualiza constantemente.
Código:
identificacao=tcpaccept(porta,1)

if (identificacao>0) //caso alguem se conecte
{
    vaga=verificar_vaga()
    if (vaga>0)
    {
        jogador[vaga]=identificacao  //armazenar a identificação
    }else
    {
        closesocket(identificacao)//desconectar o cliente
    }
}
Coloque tudo isso no Step Event
Como você deve ter reparado, existe um verificar_vaga(), um script que vai verificar se existe vaga e vai retornar o numero da vaga.
Crie o script verificar_vaga() e coloque:
Código:
for(i=1;i<=quantidade_maxima_de_jogadores;i+=1)
{
    if jogador[i]=0 //se tiver vaga
    {
        return i;
    }
}
    return -1;//caso contrario retorna -1, ou seja, não ha vagas.
A partir de agora, o servidor vai aceitar todas as conexões até um certo limite, que está na variável quantidade_maxima_de_jogadores.

Cliente
Voltando ao objeto obj_chat precisamos enviar o que digitamos.
Código:
if (keyboard_check_pressed(vk_enter))
{
    texto_digitado=keyboard_string
    clearbuffer()
    writebyte(1)
    writestring(obj_conexao.nome+" : "+texto_digitado)//enviar nome e texto digitado
    sendmessage(obj_conexao.server)
    keyboard_string=""
}
Coloque esse código acima no Step Event.
Ele está enviando uma mensagem com a identificação=1, o conteúdo e o texto_digitado e o destinatário e o server.
Precisamos voltar ao projeto do servidor para que ele receba a mensagem e repasse para todos que estão online.
Servidor
Código:
for(w=1;w<=quantidade_maxima_de_jogadores;w+=1)//receber mensagem de todos online
    {
    size = 1; //size armazenará o conteudo da mensagem
    while (size)//enguanto essa mensagem for diferente
    {
        size = receivemessage(jogador[w]); //Receber a mensagem de cada player, por isso usamos a identificação de cada um.
        if (!size) //Se não recebermos nada, sair desse loop e passar para o próximo player
            {break;}
        msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja a identificação da mensagem.
        switch (msgID)
        {
            case 1://caso seja o chat
                texto=readstring()//armazenamos o texto na variavel texto
                //repassamos a mensagem para todos
                clearbuffer()//sempre limpar para nao mandar "lixo"
                writebyte(1)//identificação da mensagem
                writestring(texto)
                for(ww=1;ww<=quantidade_maxima_de_jogadores;ww+=1)//lembre-se, um loop dentro do outro, você deve mudar a variavel que estiver sendo usada
                {
                    sendmessage(jogador[ww])
                }
            break;//fim
        }
    }
    }
Todas as linhas foram comentadas.
Crie outro action para adicionar este codigo acima no Step Event.
Agora fazer o cliente receber o texto do servidor.
Cliente
Dentro do obj_conexao, crie um Step Event e adicione este codigo:
Código:
size = 1;
while (size)
{
    size = receivemessage(server); //Receber a mensagem do servidor

    if (!size) //Se não recebermos nada, paramos por aqui
    {break;}

    msgID = readbyte(); //Lemos o primeiro byte da mensagem, ou seja a identificação da mensagem.

    switch (msgID)
    {
        case 1://caso seja 1, ou seja, o chat, ele irá adicionar ao seu chat
            texto=readstring()
            add_chat(texto)
        break;
    }
}
Tudo comentado.
Novamente outro script que precisamos criar, o add_chat().
O código dele será:
Código:
texto=argument0
for(i=1;i<=9;i+=1)
{
    obj_chat.chat[i]=obj_chat.chat[i+1]
}
obj_chat.chat[10]=texto
Ele irá passar tudo que estiver na linha de baixo para a linha de cima, e a ultima linha(chat[10]) irá receber o novo texto.

Por fim, caso o jogador desconecte, temos que tira-lo da lista.
Servidor
Código:
for(i=1;i<=quantidade_maxima_de_jogadores;i+=1)//verificar todos os jogadores
{
    if (tcpconnected(jogador[i])=0)//caso esse jogador não esteja online
    {
        jogador[i]=0 //retiramos ele da lista mudando sua identificação para 0.
    }
}
Crie outro Action para o evento Step e adicione o código acima.
Você acaba de criar um chat online para 100 pessoas!
Se você acompanhou todo o tutorial, não encontrará nenhum erro e todo mundo vai poder usar seu chat, não esqueça de enviar também a 39dll junto com o cliente, sem ela o cliente não irá funcionar.

No próximo tutorial, iremos aprender a criar um sistema de login e cadastro simples, usando arquivos INI.

Para ver qual porta usar e só acessar os links LINK1
LINK2

Vou deixar o link do cliente e servidor, caso você tenha esquecido alguma parte, por favor confira.

CLIENTE.GMK
SERVIDOR.GMK

PARTE 3

Obrigado por ler.
- Bull,Pit


Última edição por Pit Bull em Sex 29 Mar 2013, 20:56, editado 1 vez(es)

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Crovux em Seg 25 Mar 2013, 13:30

legal....gostei.. mas não precisava usar variáveis tao grandes!

Crovux

Número de Mensagens : 169
Idade : 20
Data de inscrição : 07/01/2012
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Pit Bull em Seg 25 Mar 2013, 14:30

Foi proposital para quem ninguém se perdesse dentro dos códigos.

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por !!Game Play!! em Seg 25 Mar 2013, 18:25

haha , tutorial foda de mais este aqui também , parabéns man , continue assim ! quando sai part III ? e sabe me dizer quantas partes deste tutoriais vão ser ?

!!Game Play!!

Número de Mensagens : 159
Idade : 19
Data de inscrição : 24/12/2011
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.blackcubestudio.tkk/

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Pit Bull em Ter 26 Mar 2013, 13:12

Parte 1: Introdução e conceitos;
Parte 2: Chat;
Parte 3: Sistema de login e cadastro;
Parte 4:Movimentação de personagens;
Parte 5: Shopping, se não for muito grande vou adicionar sistema de trocas entre jogadores;
Parte 6(ainda em discussão): Banco de dados MySQL e servidor em c++;

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por !!Game Play!! em Qui 28 Mar 2013, 10:23

para com os tutoriais não man , tipo acho que o macho supremo ta ensinando o basico , vc deveria apenas fazer um tutorial sobre a

Parte 3: Sistema de login e cadastro;

Parte 5: Shopping, se não for muito grande vou adicionar sistema de trocas entre jogadores;
Parte 6(ainda em discussão): Banco de dados MySQL e servidor em c++;

me ajudaria bastante , acho que tambem ajudaria muito o pessoal do forum , principalmente a parte 6

emfim , tomara que não pare com o tutorial man , falow

!!Game Play!!

Número de Mensagens : 159
Idade : 19
Data de inscrição : 24/12/2011
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.blackcubestudio.tkk/

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Pit Bull em Qui 28 Mar 2013, 13:04

Uma pequena correção:

Parte 1: Introdução e conceitos;
Parte 2: Chat;
Parte 3: Sistema de login e cadastro;
Parte 4:Movimentação de personagens;
parte 5: Mobs(monstros e npcs);
Parte 6: Shopping, se não for muito grande vou adicionar sistema de trocas entre jogadores;
Parte 7:(ainda em discussão): Banco de dados MySQL e servidor em c++;

Vou fazer tudo para que a serie fique completa, estou quase terminando a parte 3(que ficou gigante).

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Crovux em Sex 29 Mar 2013, 11:44

To esperando a parte 4... E nisto que tenho mais dificuldade na ora de criar um jogo( me complico porque faço personagens editáveis e tals... E não entendo certo como funciona esta parte de o pc identificar qual personagem se movimeto)...

Crovux

Número de Mensagens : 169
Idade : 20
Data de inscrição : 07/01/2012
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Rodrigo Santiago em Sex 29 Mar 2013, 15:08

Ótimo tutorial, mais, continue aprimorando cada vez mais.

Votação pra continuar....CLARO....no que você tava pensando vai ser 100% de sim lol!

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por andrewsnycollas em Ter 23 Abr 2013, 14:43

Como eu faço pra importar as paradas da 38dll pro meu projeto do GMStudio O_O'

andrewsnycollas

Número de Mensagens : 25
Idade : 26
Data de inscrição : 27/07/2012
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://andrewsnycollas.blogspot.com.br/

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por brepasil em Ter 16 Jul 2013, 17:31

Muito bom, parabens pela inciativa, sucesso ai. tdo mundo impolgadasso com isso

brepasil

Número de Mensagens : 3
Data de inscrição : 13/07/2013
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

Mensagem por Crovux em Ter 16 Jul 2013, 17:46

andrewsnycollas escreveu:Como eu faço pra importar as paradas da 38dll pro meu projeto do GMStudio O_O'
Depois de determinada verção(não quero especifica) o game Maker Studio tem suas proprias funções de multiplayer.. e que rodam em todas as plataformas que o Game Maker Studio tem suporte... Dai não tem necessidade.. Tem tudo aqui no fórum e só vê! E alem do mais a essencia dos comandos do hms é a mesma do 39dll...

Crovux

Número de Mensagens : 169
Idade : 20
Data de inscrição : 07/01/2012
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

100% Re: Massive multiplayer online - parte 2

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


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

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