[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:
Em todos eles, Adicione um Execute Code. Agora, Coloque os códigos conforme abaixo:
Create:
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:
Adicione em cada um um Execute code e neles os códigos abaixo:
Create:
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.
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));
- 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;
}
}
- 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));
- 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();
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;
- 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;
}
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.