Curso GM Online - 4º Lição - Que Pong que nada, Movimento de Players !!

    Compartilhe
    avatar
    jiraya
    Administrador
    Administrador

    Mensagens : 1299
    Credibilidade : 54

    Curso GM Online - 4º Lição - Que Pong que nada, Movimento de Players !!

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

    [Autor: João Neto]
    Na aula passada eu prometi que aprenderíamos a fazer um Pong. Como eu acho que Pong é do tempo que eu era criança(a uns 25 anos atrás) então não acho que a galera de hoje queria fazer esse tipo de jogo.
    Então, eu resolvi dar um passo um pouco maior, e fazermos logo um exemplo com movimento tipo RPG, com clique de mouse e tudo mais. Não serão necessários muitos eventos, nem código. As coisas começarão a complicar mais para frente, quando trabalharmos com banco de dados. Vamos começar.
    Vamos começar um projeto novo. Para deixar o projeto com o “básico” para iniciar, siga as instruções da segunda lição.
    Estando com o projeto iniciado, você com certeza já sabe que devemos iniciar por um objeto Controlador. No exemplo do Chat criamos um ObjStart. Agora, criaremos um ObjControle. É interessante seguir uma nomenclatura para não se perder na hora que o seu projeto estiver enorme.Vou explicar qual será nosso procedimento:
    Criaremos 3 Objetos. O ObjControle ficará responsável por logar no Listener, avisar a todos que entramos, controlar nossos movimentos, avisar a todos aonde estamos e por fim, avisar a todos que saímos.
    Os outros dois objetos serão idênticos, diferenciados apenas pelo nome. Um deles será o nosso player, o outro será o “Clone” do(s) player(s) que estiver(em) logado(s) no Listener também.
    Vamos começar então. Crie um objeto com o nome de ObjControle. Adicione a ele os seguintes eventos:

      Create
      Step
      Global Left released
      Press

    Em todos eles, Adicione um Execute Code. Agora, Coloque os códigos conforme abaixo:
    Create:
    Código:
    //Iniciamos a SOC
    soc_init();
    //Tentamos Conectar
    if(!player_connect(8040, "LocalHost")) {
    show_message("A conexão Falhou.");
    game_end();
    exit;
    }
    //Enviamos a Mensagem de que entramos, e qual é a nossa posição atual
    message_send(1, 0, pack((objPlayer).x, 2)+pack((objPlayer).y, 2));
    Step:
    Código:
    // checamos se chegou alguma mensagem
    if(message_receive()) {
    switch(message_id())
    {
    case 1:
    // Se for um novo player, dizemos a ele que existimos
    message_send(2, message_player(), pack((objPlayer).x, 2)+pack((objPlayer).y, 2));
    case 2:
    // Se for um novo player, ou algum já existente dizendo que existe
    // temos que criar um novo objPlayerClone
    o=instance_create(xstart, ystart, objPlayerClone);
    (o).player=message_player();
    (o).target_x=unpack(message_value(), 1, 2);
    (o).target_y=unpack(message_value(), 3, 2);
    break;
    case 3:
    // Atualizando a posição dos Players existentes
    with(objPlayerClone) {
    if(player==message_player()) {
    target_x=unpack(message_value(), 1, 2);
    target_y=unpack(message_value(), 3, 2);
    }
    }
    break;
    case 4:
    // Quando algum sair, destruir seu clone
    with(objPlayerClone) {
    if(player==message_player()) {
    instance_destroy();
    }
    }
    break;
    }
    }
    Global Left released:
    Código:
    //Achamos a posição do mouse
    posX = mouse_x;
    posY = mouse_y;
    // Setamos nosso Player na posição do clique
    (objPlayer).target_x=posX;
    (objPlayer).target_y=posY;
    // depois avisamos a todos os players que mudamos de posição
    message_send(3, 0, pack(posX, 2)+pack(posY, 2));
    Press
    Código:
    // Avisamos a todos que saimos
    message_send(4, 0, "");
    // Desconectamos...
    player_disconnect();
    // ... Finalizamos a SOC...
    soc_free();
    // ... E finalizamos o Jogo.
    game_end();
    Vamos a algumas explicações:
    Você deve ter notado dois novos comandos, pack e unpack.
    pack(numero, tamanho);
    retorna o numero compactado no tamanho especificado.
    unpack(valor, posição, tamanho);
    O inverso do pack. Retorna o numero real descompactado no tamanho a partir da posição. Lembrar que a posição inicial é 1.
    O uso do pack é exatamente para diminuir o tamanho do objeto que será passado para o Listener, aumentando assim sua performance de leitura e conseqüente resposta. Como os códigos estão bem comentados, e com certeza você já se familiarizou com eles, não há necessidade de explica-los.
    2º passo: Vamos criar agora nossos Objetos Player. Eu aconselho a usar sprites diferentes, para que fique fácil identificar quem é player e quem é clone. O GM possui alguns sprites de modelo, mas use os que você quiser, a seu gosto.
    Crie um objeto com o nome de objPlayer. Adicione a ele dois Eventos:

      [li]Create[/li]
      [li]Step[/li]

    Adicione em cada um um Execute code e neles os códigos abaixo:
    Create:
    Código:
    //Iniciando as Variáveis usadas por ele
    player=-1;
    target_x=x;
    target_y=y;
    Step:
    Código:
    // Calculamos se onde o objeto está em relação aos pontos passados
    dist=point_distance(x, y, target_x, target_y);
    //Se for maior..
    if(dist>0) {
    // Movemos o objeto até ele
    direction=point_direction(x, y, target_x, target_y);
    speed=min(dist, 4);
    } else {
    // Caso contrário paramos.
    speed=0;
    }
    Ao finalizar, replique o objeto e renomeie a réplica para objPlayerClone.
    Eu sei, você está louco pra ver o char andando pela tela, e vários chars andando junto com ele. Após tudo que fizemos aí em cima, se tudo estiver correto, faça como na aula passada. Crie uma room, e coloque nela os objetos ObjControle e o ObjPlayer. Compile o projeto, execute e configure o DirectServer, e execute duas ou mais instancias do Client.exe.
    A imagem abaixo foi o meu teste, olha só:

    Finalmente começamos a fazer “jogos”. Não é mesmo?? Mesmo ainda havendo bugs e mais bugs, pense em como fazer um game Online com o GM está cada vez mais parecendo simples. E olha que eu nem comecei ainda...
    Vou dar uma dica: quer fazer o teste com algum amigo?? Simples demais. Se você não sabe como configurar o no-ip, acesse o link abaixo:

    Após configurar o no-ip, mude o script que está no Create, do objeto ObjControle, trocando "LocalHost" pelo endereço do seu no-ip. Abra e configure o DirectServer, e mande o pacote(exe + dll) para o seu amigo. Bugs a parte, é apenas para que você entenda como funciona a criação de um game Online no GM, e em qualquer outro maker, pois a idéia acima(do clone) é exatamente o que acontece em todo jogo Online.
    Que tal começarmos a dificultar as coisas? Próxima aula eu começarei a falar de banco de dados. Seus players podem ter contas, e acessar o jogo de qualquer lugar !!
    Até a próxima.

      Data/hora atual: Sab Jul 21, 2018 11:02 pm