sábado, 14 de janeiro de 2012

[Jiraya] Conecçao simples com 39DLL

Qualidade
Nome: Conecçao simples com 39DLL
Blogueiro: Jiraya
Descrissao: Criando uma conecçao online usando a 39DLL
Versao: Pro
Foto(s): [Nao precisa]

Tutorial:
Olá a todos!
a 39Dll é conhecida pelo seu poderoso sistema de connecção!
mas algumas pessoas reclamam, por algo ser algo difícil de usar.
eu adicionei a 39dll ao gmLIBRARY simplificando as funções.

ok vamos começar
baixe o gmLibrary e instale no seu game maker

crie um objeto e nomeie como "Controle"
deixe esse objeto como persistent
e no create event desse objeto use o seguinte
Código:

using("39dll.h|gui.h");//isso fara o game maker usar as funçoes da 39dll e da GUI[Graphical User Interface]
global.host=false;//vai definir se o jogador é host ou server


e agora no draw_event do objeto Controle use o seguinte
Código:

if (room==room_menu)//checa se estiver na room_menu
{
//isso cria um botão e checa se ele foi pressionado
if (gui_button("host",10,10,128,32,"entrar no jogo como server")==gui_left_pressed)
{
//vamos usar a porta 8210, você pode usar qualquer porta, que não esteja sendo usada.
global.LISTEN=tcp_listen(8210,2);//isso faz o seu computador "ouvir" esperar qualquer ip que se conecte à porta 8210
//2 sera o numero maximo de jogadores
room_goto(room_server);//ir para a room_server, que iremos criar em breve
global.host=true;//então sera o host
};

if (gui_button("jogador",10,48,128,32,"entrar no jogo como jogador")==gui_left_pressed)
{
//essa função tentara se conectar com o servidor
//o primeiro argumento é o ip do servidor
//o segundo argumento é a porta que o servidor estara escutando
global.SERVIDOR=tcp_connect(get_string("digite o ip do servidor:","127.0.0.1"),8210);
    if (!global.SERVIDOR)//checa se ñ conseguiu se conectar
    show_message("erro ao tentar se conectar com o servidor!");else
    {//então ira para room do jogo
    room_caption="Server";
    room_goto(room_game);
    }
};

}else
if (room==room_server)//checa se estiver na room onde o servidor ira esperar o jogador
{
draw_text(10,10,"esperando o jogador!");
jogador=tcp_accept(global.LISTEN);//prepara para aceitar o jogador
  if ( jogador)//se  o jogador "bater na porta" x3
  {
  global.JOGADOR=jogador;//guarda a id do jogador para trocar mensagens
  room_caption="Jogador";
  room_goto(room_game);
  }
};


pronto o básico importante ja foi feito
agora vem a troca de mensagem Happy

agora crie uma room e nomeie como "room_menu", coloque o objeto controle nessa room
então crie outra room e nomeie como "room_server"
então crie a ultima room "room_game".
deve ficar assim a ordem no seu projeto
room_menu
room_server
room_game

agora a troca de mensagens
crie um objeto e nomeie como "Comunicador".
e no draw event desse objeto use isso
Código:


if (global.host)//checa se o jogador é o host
{
    msg=receive_message(global.JOGADOR);//recebe mensagens do jogador
    //você pode usar a função server_receive(); tbm, que recebe mensagens de todos os jogadores simultaneamente
   
    if (msg)//se recebeu a mensagem
    {
        switch (read_id())//lê a id da mensagem
        {
        //aqui o servidor ira interpretar as mensagens recebidas
              case 0:
              BOOT.x=read_value();//aplica a posição x do outro jogador no BOOT
              BOOT.y=read_value();//aplica a posição y do outro jogador no BOOT;
              break;
        };
    };
}else//se for o jogador
{
    msg=receive_message(global.SERVIDOR);
    if (msg)
    {
        switch (read_id())//lê a id da mensagem
        {
        //aqui o jogador ira interpretar as mensagens recebidas do servidor
              case 0:
              BOOT.x=read_value();//aplica a posição x do outro jogador no BOOT
              BOOT.y=read_value();//aplica a posição y do outro jogador no BOOT;
              break;
        }
    }
};


coloque o objeto Comunicador na room_game

pronto, agora é só trocar as mensagens Happy

agora vamos fazer os personagens andar no mapa
crie uma sprite que será o jogador
crie um objeto e nomeie de "Jogador"
coloque a sprite que você fez no object Jogador
crie mais um objeto e nomeie de "BOOT"
e aplica uma sprite qualquer no objeto BOOT, ele recebera as mensagens dos outros jogadores
no step event do objeto Jogador, use isso
Código:

//movimento simples
if (keyboard_check(vk_right))
x+=4;else
if (keyboard_check(vk_left))
x-=4;
if (keyboard_check(vk_up))
y-=4;else
if (keyboard_check(vk_down))
y+=4;

buff_clear(0);//limpa o buff para n haver congestionamento e lentidão nas transferências de mensagens
set_id(0);//define a id da mensagem para 0
write_value(x);//escreve o valor de x na mensagem
write_value(y);//escreve o valor de y na mensagem

if (global.host)//Servidor
{
send_message(global.JOGADOR);//envia a mensagem para o jogador
//você pode usar a função server_send(); que envia a mensagem para todos os jogadores simultaneamente
}else//Jogador
{
send_message(global.SERVIDOR);//envia a mensagem para o servidor
};


[nota]deixa a room_game com um fps de 90

Pronto a troca de mensagem entre o jogador e servidor está completa
agora coloque o objeto Comunicador,Jogador e o objeto BOOT na room_game
e teste para ver se esta funcionando!

quem quiser baixar o exemplo
aqui esta o link
Download[.gmk]Creditos: Jiraya

Nenhum comentário:

Postar um comentário