Anda di halaman 1dari 41

Curso GM Online - 1 lio - Saiba como funciona um jogo Online

Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 1 Compartilhe Mais!

Curso GM Online - 1 lio - Saiba como funciona um jogo Online


por joaoneto em Seg Fev 02, 2009 1:04 pm A maioria dos makers quer fazer um jogo online. Procuram engines e mais engines para no perderem tempo com desenvolvimento, para que seu jogo possa ser lanado o mais rpido possvel. Porm, a maioria deles no tem a mnima idia de como funciona a comunicao via TCP/IP e porque o jogo precisa de um servidor, entre outras coisas. Ento vamos comear do incio. Toda vez que voc, no seu computador, abre o Client(aplicao EXE do seu jogo) do seu Ragnarok, e tenta "Logar" no servidor, o que acontece... Seu PC, estando conectado internet por qualquer meio (Modem, ADSL, Cable, 3G, Etc...) faz com que o mesmo possua um IP. Quando fazemos qualquer coisa na Internet, abrimos uma pgina, conversamos no MSN, ou qualquer outra coisa, seu computador e os computadores espalhados pela nuvem que a internet trocam informaes, e para isso serve o IP. O IP uma chave, que torna sua conexo com a internet nica para que no haja conflito durante a "conversa" entre o seu computador e a Net. Quando voc tenta logar no seu jogo favorito, voc est enviando informaes pela rede e aguardando respostas da mesma. Por esse motivo chamado de Comunicao, pois sua mquina fala e ouve, e todas as mquinas na rede ouvem e respondem. Mas o que fazer jogos online e isso dae de cima tem a ver?? TUDO !! Quando voc tenta se logar, voc envia uma pergunta ao servidor do jogo, que por padro j possui um IP/porta que ele deve acessar na rede e, quando ele acessa o mesmo, dentro daquela mquina h um aplicativo que todos chamam de server, o Listener.

Mas que raios um Listener?? Listener a aplicao que, atravs de uma configurao TCP/IP de IP e Porta, est "Ouvindo" aquela porta. Ouvindo sim, ela est aguardando chegar alguma coisa ali, para que ela possa interpretar e, se interpretado, devolver uma resposta a quem perguntou. Ao tentar logar, o seu Client envia uma pergunta para aquele IP/Porta, aguardando que, do lado de l, haja um Listener, que vai ouvir a pergunta, interpretar, e responder para o seu Client "Seja bem vindo Fulano !!" se ele te reconhecer ou "Voc no possui usurio e senha aqui seu atoa" se ele no te reconhecer. Ento pense neste Fluxo: O que a sua aplicao Client deve fazer??

Efetuar conexo com o Listener Enviar dados para ele Receber dados dele Trabalhar os dados recebidos

O que o seu server(Listener) deve fazer??


Aguardar conexes de Clients Ouvir o que foi perguntado responder para os N clients conectados as perguntas feitas Compartilhar dados entre os Clients

Tudo bem, no entendi nada do que voc disse, e agora?? Se voc entendeu os dois ultimos itens, j um comeo. Ser a partir deles que vamos comear o desenvolvimento de um jogo Online simples, para ser jogado por duas pessoas(um Pong) e iremos evoluindo at o incio de um MMO bsico. Vrias pessoas podem dizer que existem milhares de milhoes de exemplos disso na net, e realmente tem, porm eu estarei dando as MELHORES DICAS, mostrando as MELHORES ENGINES e principalmente respondendo s MAIORES DVIDAS. Para comear, Usaremos um GM que funciona, a verso 6.1. Para quem ainda no tem baixe aqui. Eu no estarei ensinando GM aqui. Nossas lies estaro focadas no desenvolvimento Online. Ento, se voc ainda no sabe como coloc-lo no modo avanado, criar sprites, Objects, Rooms, e principalmente Scripts, acho melhor comear seu aprendizado em outros tutoriais. Para os mais curiosos, saibam que irei ensinar:

Criando Clients e Servers Enviando/Recebendo Dados Criando um Chat Criando o primeiro game com movimento Banco de dados - Bsico DB - Criando um sistema de Login DB - Iniciando um game com Conta DB - Criando um MMO bsico

Eu pretendo que os itens acima sejam s o comeo. Como todos sabem, meu tempo meio curto, e estou tentando me decidar ao mximo para que todos possam, como eu, se maravilhar com o GM. At a prxima Lio.

ltima edio por joaoneto em Qua Fev 04, 2009 1:14 pm, editado 1 vez(es)

Curso GM Online - 2 Lio - Primeiro teste Client/Listener


por joaoneto em Seg Fev 02, 2009 1:06 pm Na Aula anterior eu falei sobre Listeners e Clients, Objetos que so a base de todo Game On-line. O GM por padro possui uma Engine de Comunicao TCP, porm no iremos us-la, por ser muito bsica, pesada demais e no funcionar Behind Router. Todos os termos desconhecidos sero explicados no decorrer do curso. Usaremos como base para nossos testes e exemplos de comunicao TCP a SOC Simple Online Communication. De todas as Dlls de comunicao TPC ela a mais simples de usar, a mais rpida em comunicao e o principal, funciona tanto UDP (intranet) quanto TCP Behind Router. A primeira coisa a fazer baixar os scripts Fonte, a dll e o Directserver, Aqui. Ao terminar o Download, crie um novo projeto no GM. Crie uma pasta para ele, e chame-o de Client. Dentro da pasta onde salvou o projeto, coloque a soc.dll. Volte ao projeto. Clique no menu Scripts -> Import Scripts como mostra a figura abaixo: Selecione o arquivo socAll.gml

Ao finalizar, seu diretrio de scripts estar assim: Usaremos este primeiro teste como exemplo para todas as prximas lies ento, lembre-se, os passos acima so os iniciais SEMPRE que comear um novo projeto Online no GM. Para efetuarmos um primeiro teste, no criaremos o Listener. Usaremos o Directserver, um Listener Bsico que vem com o soc.dll para testes de comunicao. A primeira coisa a fazer iniciar o Directserver. Ao inici-lo, ele pergunta qual porta ele deve escutar. Digite 8040 e pressione Enter. Ele perguntar se ele deve mostrar as mensagens recebidas, aperte Y e pressione Enter. Ao fazer isso a primeira vez, o Firewall do Windows pedir permisso para desbloquear a porta para o aplicativo. Desbloqueie. Observe a figura abaixo: Pronto. Qualquer comunicao TCP que chegar porta 8040 agora ser escutada pelo Directserver. Vamos fazer um teste?? Crie um Objeto, Chame-o de objStart. Adicione um Evento Create, e nele um Execute a Piece of Code. Neste Execute, adicione as seguintes linhas: Cdigo:
//Iniciando o Socket soc_init(); //Conectando ao servidor if (!player_connect(8040, "localhost")) { show_message("Falha ao Conectar no servidor.") soc_free(); game_end(); }

Mas o que fizemos aqui?? Antes de mais nada iniciamos a dll. Na verificao abaixo, aguardamos um retorno verdadeiro da funo de conexo, onde passamos como parmetro a porta selecionada no directserver e o nome LocalHost. Se voc j fez algum jogo Online, sabe que LocalHost significa sua mquina Local, ou seja, no h necessidade de se colocar um IP. Agora sim. Crie uma room, coloque o objStart nela e execute o jogo. Se foi tudo feito como foi falado aqui, seu DirectServer deve mostrar a seguinte mensagem: Observe que ele est mostrando o IP como 127.0.0.1. Este o IP interno padro de todo computador, Podemos usar tanto ele, quanto LocalHost quanto o nome da mquina. Ao fechar o jogo, o DirectServer mostrar a seguinte mensagem: Bom. De ncio, vimos que no to complexo iniciar a Dll e os scripts do SOC. No criamos o servidor pois usamos um padro e, de cara, no fizemos nada alm de ver o servidor dizer que estvamos conectados(e como Player 2 ainda... Mas onde est o Player 1??) mas demos um grande passo. Eu configurei os scripts para facilitar a sua vida inicialmente, o script padro que vem bem mais complexo, usando a dll fora da pasta do jogo, usando constantes e outras chatices.

Bem, comeamos... Vamos tentar no parar no meio do caminho agora. Na prxima lio, vamos construir um Client de chat Simples, ainda usando o DirectServer como Servidor. At l.

Curso GM Online - 3 Lio Comunicao entre Clients -> Chat


Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 2 Compartilhe Mais! Pgina 1 de 2 12

Curso GM Online - 3 Lio - Comunicao entre Clients -> Chat


por joaoneto em Seg Fev 02, 2009 1:12 pm Na aula passada iniciamos nosso aprendizado sobre o uso da SOC Simple Online Communication, uma das melhores Dlls de TCP j feitas para o GM. Hoje iremos fazer um sistema simples de comunicao, um Chat. Com poucas linhas de cdigo, e usando o DirectServer (usado na aula passada como servidor) poderemos fazer um chat simples. Vamos usar o exemplo que foi construdo na aula passada. Ele j possui a soc.dll, os scripts, e um objeto de inicializao. Nesta aula, para poder escrever na tela, estaremos trabalhando com o Evento Draw. Vamos l. Abra o projeto Client, aquele que foi construdo na aula passada. No objeto objStart, no evento Create, abra o Execute Code. Adicionaremos a ele algum cdigo.Antes do cdigo existente, adicione as variveis nome e texto, Assim: Cdigo:

nome = ""; texto = "";

Logo aps, preencheremos a varivel texto com um array de objetos vazios. Esta varivel ser nossa caixa de texto que armazenar e exibir os textos que os usurios conectados escrevero e enviaro. Cdigo:
for(i=0; i<28; i+=1) { texto[i]=""; }

Estou colocando 27 itens visveis, mas este valor pode ser mudado. No entrarei em muitos detalhes de como embelezar o chat, pois a nossa inteno aqui aprender a usar a soc. Para que pelo menos os usurios possam se identificar no chat, vamos colocar um get_string, que recuperar o nome do usurio para ser usado depois nas mensagens. Cdigo:
nome=get_string("Qual o seu nome?", "Maker "+string(floor(random(1000))));

A partir de agora, sempre me referirei ao usurio conectado como player. Vamos falar sobre comunicao. Para se comunicar, usamos os seguintes comandos da SOC: message_send( id, player, valor); Envia uma mensagem a um player especfico, com ID e valor. Se player for 0(zero) a mensagem enviada a todos os que estiverem conectados(pensou na possibilidade de uma sala privada??) message_receive(); Checa se chegou alguma mensagem. message_id(); retorna o ID da ultima mensagem recebida. message_player(); retorna o ID do player que enviou a ultima mensagem. message_value(); retorna o valor da ultima mensagem recebida. Usando os comandos acima, que vamos fazer toda a comunicao entre o Listener e o Client, e de Client para Client. No pense que, usando 0 no player, voc no precisa do Listener, muito pelo contrrio, ele que, ao receber uma mensagem com player = 0 que redireciona a mensagem para todos os players online. Voltemos ao Cdigo. A primeira coisa a fazer avisar a todos os players online que voc entrou. Para isso, coloque o seguinte cdigo logo aps o cdigo j existente: Cdigo:
message_send(1, 0, nome+" entrou na sala.");

A esta altura, o cdigo do seu Evento Create deve estar assim: Cdigo:

nome = ""; texto = ""; for(i=0; i<28; i+=1) { texto[i]=""; } nome=get_string("Qual o seu nome?", "Maker "+string(floor(random(1000)))); //Iniciando o Socket soc_init(); //Conectando ao servidor if (!player_connect(8040, "localhost")) { show_message("Falha ao Conectar no servidor.") soc_free(); game_end(); } message_send(1, 0, nome+" entrou na sala.");

Ento vejamos, passo a passo o cdigo acima:


Ao iniciar, declaramos as variveis que sero usadas nos textos. Recuperamos o nome do player. Iniciamos a Dll. Tentamos conectar(o qual se no conseguir encerra a aplicao). Enviamos uma mensagem que entramos na sala.

Agora a parte importante. No basta apenas dizer que chegamos, precisamos averiguar a todo momento se chegou alguma mensagem, e poder digitar textos e envia-los. Vamos ento. Adicione um Evento Step e nele um Execute Code. Agora adicione este cdigo: Cdigo:
// Checamos se alguma mensagem chegou if(message_receive()) { switch(message_id()) { case 1: // Se sim, colocaremos ela no array de strings // Primeiro movemos todos para cima for(i=0; i<27; i+=1) { texto[i]=texto[i+1]; } // Finalmente adicionamos a string que chegou texto[27]=message_value(); break; } }

Foi fcil. Agora, toda mensagem que chegar, ser colocada na fila de mensagens. Vamos analizar o que foi feito ali em cima:

Validamos se chegou alguma mensagem. Se sim: Usamos um case para saber se o ID de mensagem que espervamos. Da forma como foi feito no case, podemos enviar mensagens diferentes, com propsitos diferentes. Subimos os textos na fila do array. Colocamos o texto que chegou no Array.

Agora, vamos exibir as mensagens que chegarem. Adicione um evento Draw, nele um execute Code e adicione o Cdigo: Cdigo:
// Desenharemos todas as linhas do array for(i=0; i<28; i+=1) { draw_text(10, 10+i*16, texto[i]); } // finalmente desenhamos o que se est digitando draw_text(10, 454, ">> "+keyboard_string);

Estamos indo bem, configuramos a inicializao, a validao e a execuo do nosso Chat. Mas ainda falta algo principal... Como vamos escrever?? Essa vem agora: Adicione um Evento Press, Nele um Execute code e coloque o seguinte cdigo: Cdigo:
//Primeiro subimos as strings for(i=0; i<27; i+=1) { texto[i]=texto[i+1]; } // finalmente colocamos a string escrita, mais o nome. texto[27]=nome+": "+keyboard_string; // agora a enviamos message_send(1, 0, nome+": "+keyboard_string); keyboard_string = "";

Observe que fizemos o mesmo passo de subir a string e adicion-la ao final do array, como no evento Step. Fizemos isso por uma simples razo: A string enviada para o Listener, mesmo estando com player = 0, no retorna para quem a enviou. Ou seja, devemos fazer do Lado Client aquilo que ser feito do Lado Listener, para que vejamos o que aconteceu. Se o passo acima no for feito, todos os outros players vero a sua mensagem, menos voc. Ao final, usamos o message_send, para enviar o que digitamos. A esta altura, podemos testar nosso Chat. Mas antes, para evitar erros, objetos instanciados na memria entre outras coisas, vamos adicionar um evento de sada. Adicione um Evento Press, coloque um Execute code e nele o cdigo: Cdigo:

// Dizemos aos outros players que estamos saindo. message_send(1, 0, nome+" saiu."); // Desconectamos do Server. player_disconnect(); // desalocamos a DLL. soc_free(); // e finalizamos o jogo. game_end();

Examinando o cdigo acima, bem fcil ver o que acontece. Enviamos uma mensagem, dizendo que estamos saindo, desconectamos do Listener, liberamos a dll e finalizamos o jogo. Para podermos testar, precisamos compilar o executvel, pois vamos abrir duas instancias do Client. Para compilar, v no menu File -> Create Executable, como na figura abaixo:

Aps compilar, execute o Directserver(os passos de execuo foram explicados na aula anterior) e execute duas instancias do Client.exe. Ao clicar em OK em uma delas, na outra aparecer o texto que o fulano entrou na sala.. experimente digitar textos nas duas janelas, apertar enter e, para sair, no feche no X da janela, aperte ESC(nosso comando de sada, lembra??) Acabamos de entrar no que eu chamo de esqueleto de um jogo Online. Pense, voc consegue se conectar a um servidor (Listener), dizer quem voc , enviar uma mensagem para que todos os que estiverem conectados possam ler, e ler as mensagens que todos enviarem. Nosso chat ficou meia-boca, dava pra fazer bem melhor. Mas a inteno da aula foi concluda, dar os primeiros passos na comunicao entre Clients, atravs do Listener, enviando e recebendo informaes. Isto que foi mostrado aqui a ponta da ponta do Iceberg. O GM capaz de muito mais, mas muito mesmo, bastando saber como desenvolver. Alguns diro: Mas pra qu que eu vou perder tempo com isso, se o Netplay me d isso pronto?? Eu sou um profissional. Me tornei profissional por querer sempre mais, aprender mais, inovar mais, e melhorar mais. Usar GM pra fazer jogo coisa de quem j sabe o que quer, no apenas tenta. E eu estou aqui por estes, que sabem o que querem, e conseguiro. Por hoje s. Na prxima aula, veremos como simples fazer um Pong usando o SOC. At l.

ltima edio por joaoneto em Qua Fev 04, 2009 1:14 pm, editado 1 vez(es)

Curso GM Online - 4 Lio - Que Pong que nada, Movimento de Players !!


Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 1 Compartilhe Mais!

Curso GM Online - 4 Lio - Que Pong que nada, Movimento de Players !!


por joaoneto em Seg Fev 02, 2009 1:15 pm Na aula passada eu prometi que aprenderamos a fazer um Pong. Como eu acho que Pong do tempo que eu era criana(a uns 25 anos atrs) ento no acho que a galera de hoje queria fazer esse tipo de jogo. Ento, eu resolvi dar um passo um pouco maior, e fazermos logo um exemplo com movimento tipo RPG, com clique de mouse e tudo mais. No sero necessrios muitos eventos, nem cdigo. As coisas comearo a complicar mais para frente, quando trabalharmos com banco de dados. Vamos comear. Vamos comear um projeto novo. Para deixar o projeto com o bsico para iniciar, siga as instrues da segunda lio, aqui. 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 no se perder na hora que o seu projeto estiver enorme.Vou explicar qual ser nosso procedimento: Criaremos 3 Objetos. O ObjControle ficar responsvel por logar no Listener, avisar a todos que entramos, controlar nossos movimentos, avisar a todos aonde estamos e por fim, avisar a todos que samos. Os outros dois objetos sero idnticos, 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 tambm. Vamos comear ento. Crie um objeto com o nome de ObjControle. Adicione a ele os seguintes eventos:

Create Step Global Left released Press<Escape>

Em todos eles, Adicione um Execute Code. Agora, Coloque os cdigos conforme abaixo: Create: Cdigo:
//Iniciamos a SOC soc_init(); //Tentamos Conectar if(!player_connect(8040, "LocalHost")) { show_message("A conexo Falhou."); game_end(); exit; } //Enviamos a Mensagem de que entramos, e qual a nossa posio atual message_send(1, 0, pack((objPlayer).x, 2)+pack((objPlayer).y, 2));

Step: Cdigo:
// 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 posio 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: Cdigo:


//Achamos a posio do mouse posX = mouse_x; posY = mouse_y; // Setamos nosso Player na posio do clique (objPlayer).target_x=posX; (objPlayer).target_y=posY; // depois avisamos a todos os players que mudamos de posio message_send(3, 0, pack(posX, 2)+pack(posY, 2));

Press<Escape> Cdigo:
// 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 explicaes: Voc deve ter notado dois novos comandos, pack e unpack. pack(numero, tamanho); retorna o numero compactado no tamanho especificado. unpack(valor, posio, tamanho); O inverso do pack. Retorna o numero real descompactado no tamanho a partir da posio. Lembrar que a posio 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 conseqente resposta. Como os cdigos esto bem comentados, e com certeza voc j se familiarizou com eles, no h necessidade de explica-los. 2 passo: Vamos criar agora nossos Objetos Player. Eu aconselho a usar sprites diferentes, para que fique fcil 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:

Create Step

Adicione em cada um um Execute code e neles os cdigos abaixo:

Create: Cdigo:
//Iniciando as Variveis usadas por ele player=-1; target_x=x; target_y=y;

Step: Cdigo:
// Calculamos se onde o objeto est em relao 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 contrrio paramos. speed=0; }

Ao finalizar, replique o objeto e renomeie a rplica para objPlayerClone. Eu sei, voc est louco pra ver o char andando pela tela, e vrios chars andando junto com ele. Aps tudo que fizemos a em cima, se tudo estiver correto, faa 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 comeamos a fazer jogos. No 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 no sabe como configurar o no-ip, acesse o link abaixo: http://www.jogosrpg.com.br/forum/index.php/topic,219.0.html Aps configurar o no-ip, mude o script que est no Create, do objeto ObjControle, trocando "LocalHost" pelo endereo 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 criao de um game Online no GM, e em qualquer outro maker, pois a idia acima(do clone) exatamente o que acontece em todo jogo Online. Que tal comearmos a dificultar as coisas? Prxima aula eu comearei a falar de banco de dados. Seus players podem ter contas, e acessar o jogo de qualquer lugar !! At a prxima.

Curso GM Online - 5 Lio - 1 parte Banco de dados


Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 1 Compartilhe Mais!

Curso GM Online - 5 Lio - 1 parte - Banco de dados


por joaoneto em Seg Fev 02, 2009 1:17 pm Se voc no do ramo do desenvolvimento do Software, com certeza no sabe de uma verdade latente: No existe NADA que se compare a arquivar dados, de forma organizada, consistente e de fcil recuperao, do que os Bancos de Dados. No mercado hoje, existem milhares, desde os mais simples, baseados em arquivos texto criptografados, como o SQLite, intermedirios com criao de interface como o Access e o DataFlex, at grandes engines servidoras, como o SQL Server, Oracle e Sybase. A maioria delas, como so pagas, alm de ser extremamente caro, dispendioso, pois h Servidores de dados gratuitos(os chamados OpenSource) como o PostgreSQL e com permisses restritas, como o MySQL. Das engines de banco citadas acima, trabalharemos com o MySQL. Porque? Porque foi a nica engine de banco para GM que foi extremamente bem construda, estvel e de uso com mediana dificuldade. H o seguintes casos a se pensar:

Podemos usar a conexo TCP para carregar e enviar dados ao banco. Com isso, o mesmo poderia ser local, no havendo ainda necessidade de se usar aplicaes pesadas, como o servidor de dados do MySQL. Usando um Servidor de dados voc pode fazer acesso direto a ele, sem usar a conexo TCP do jogo.

Uma verdade precisa ser dita: Com o GM, no importa se voc usar MySQL, SQLite

ou um arquivo INI para guardar dados, pois vai depender de como voc pretende recuperar estes dados. Uma das vantagens do uso do MySQL seria a de que os dados poderiam ficar em um servidor web, onde haveria um site para criao de Contas, mas isso com certeza faria seu jogo se tornar uma carroa j que o acesso Banco -> Listener -> Client seria todo via TCP e de locais completamente distintos, o que com certeza comprometeria a performance. Eu iniciarei nosso estudo de banco de Dados com o MySQL. Com o passar das aulas, talvez eu ensine a usar o SQLite, para aqueles que pretender ter pequenos jogos sem criao de contas e outras coisas. Antes de mais nada, Baixe o MySQL 5.*, aqui. http://dev.mysql.com/downloads/mysql/5.1.html Baixe tambm o MySQL Yog, aqui. http://superdownloads.uol.com.br/download/48/sqlyog/ Para aprender a Instalar o MySQL, clique aqui http://www.juliobattisti.com.br/tutoriais/almirrivas/php002.asp DICA: na hora de configurar a senha do administrador(Root) marque o item Enable Root Access from Remote Machines. Este site tambm possui muitos tutoriais de PHP, para quem quiser fazer seus sites nessa linguagem. Aps todas as instalaes, a Primeira coisa a fazer criar uma tabela de Login. Saiba que, se voc no tem conhecimento nenhum de banco de dados, pode ser meio complicado fazer um jogo usando o mesmo. Procure aprender sobre tabelas, tipos de dados, modelagem, etc. para que voc possa usufruir melhor desta arma. Abra o SQLYog. A primeira tela ser a de configurao da conexo ao banco. Coloque a senha que voc cadastrou na configurao do Servidor, a porta(se no foi mudada) a 3306 e no escreva nada em database, como na figura. Ao configurar, clique em Connect. Agora, na rvore da esquerda, aonde apareceu root@localhost, clique com o boto direito -> Create Database. Agora de o nome de db_game, selecione as configuraes como da figura e clique em Create. Agora criaremos nossa tabela de login. Clique com o boto direito sobre o database -> Create table. Agora, crie uma tabela como a da figura, e nomeie-a como tb_user. [img width=684 height=119]http://img159.imageshack.us/img159/7683/28050153is7.gif[/img] Tendo nossa tabela criada, podemos fazer o primeiro teste. Na janela escrito Query, Digite a linha abaixo: Cdigo:
Select * from tb_user;

Agora clique na Seta verde(Execute Current Query). DICA: Verifique se o database

db_game est selecionado antes de rodar a query. Na janela abaixo da janela query, voc ver que retornaro os campos criados na tb_user. O problema que vieram vazios. Isso porque nossa tabela ainda est vazia. Vamos alimentar nossa tabela com um registro, para que nossos testes iniciais funcionem. Para isso, usaremos o SQLYog para colocar um registro na tabela. Para isso, mude o combo logo acima do retorno da query para o nome da tabela, e clique no boto ao lado, Insert New Row. No coloque nada no primeiro campo, coloque apenas nos outros, e clique em Save changes, como na figura. Agora, se rodarmos a query novamente, ela retornar nosso registro inserido. Para quem nunca viu banco de dados voc at que est indo bem no ?? A primeira parte de nosso Login est completa. Na segunda e terceira parte desta aula, eu darei os primeiros passos de como se construir um formurio de login no GM, como configurar o GMSQL e como fazer uma validao de login diretamente no banco. At l.

Curso GM Online - 5 Lio - 2 parte Banco de dados


Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 1 Compartilhe Mais!

Curso GM Online - 5 Lio - 2 parte - Banco de dados


por joaoneto em Seg Fev 02, 2009 1:19 pm Na lio passada eu mostrei um pedacinho de como ser o uso de banco de dados em nosso projeto de jogo online. Muito ainda est por vir e, para aqueles que se interessarem, eu tentarei responder a todas as dvidas. Nesta lio eu vou mostrar como construir uma tela bsica de Login, usando alguns

scripts e Objetos e validando se o usurio digitou mesmo o usurio e a senha. Vamos l. Se quiser montar este exemplo a parte, faa isso, ou agregue ao projeto da Aula 4. Tanto faz j que ainda no haver comunicao com o banco. Antes de mais nada baixe Este Script. Aps import-lo para seu projeto, ele deve mostrar os seguintes Scripts:

Vou Explicar: O GM por padro no possui controles de formulrio, como campos de texto e botes. H vrias engines, Dlls e outros complementos que adicionam estes controles ao GM. Eu optei pelos scripts, que j possuem uma modificao feita por mim, por serem mais leves e no dispensar mais Dlls para o projeto Online. Como metade do que precisa ser feito j foi, vamos agora construir os Objetos. Crie 3 objetos com os nomes abaixo:

No objLogin e no ObjSenha, Adicione um evento Draw, um Execute Code e nele coloque os scripts abaixo: objLogin: Cdigo:
draw_text(x,y+5,"Login:"); global.login=input_box(x+60,y,256,"",true,false);

ObjSenha: Cdigo:
draw_text(x,y+5,"Senha:"); global.senha=input_box(x+60,y,256,"",false,true);

Observe que estamos usando variveis globais. Essas Globais sero instanciadas na criao do prximo objeto. No ObjButton, adicione um evento Create e um Draw. Nos Dois um Execute Code e em cada um os scripts Abaixo: ObjButton - Evento Create: Cdigo:
global.login = ""; global.senha = "";

ObjButton - Evento Draw: Cdigo:


if(button(x,y,"Login")){ if global.login == "" { show_message("Preencha seu Login."); exit;

} if global.senha == "" { show_message("Preencha sua Senha."); exit; } show_message("Logou !"); }

Observando os cdigo acima, fica bem fcil entender o que ele faz. Nos objetos de Login e senha, declaramos o script de inputBox(Caixa de texto) e passamos o valor retornado para as variveis globais. No objeto Boto, declaramos o boto e validamos se ele foi clicado. Se sim, validamos se as variveis globais possuem valor e caso no, abortamos o processo e devolvemos uma mensagem, caso sim apenas devolvemos uma mensagem de "Logou.". De incio, apenas a construo dos campos e uma forma de validao do preenchimento dos mesmos. Bem simples. Agora, crie uma room, e adicione os objetos, como na imagem abaixo:

E sua tela ao rodar o projeto ficar assim: Expandir esta imagem

A construo da tela de Login foi bem simples. Agora teste. Tente Clicar em login sem escrever nada em algum dos campos. foi bem fcil. Na prxima lio, faremos a incluso do GMSQL, conectaremos ao banco e validaremos o usurio. At l.

Curso GM Online - 5 Lio - 3 Parte Banco de Dados


Game Maker Brasil :: Tutoriais da equipe GMBR :: Game Maker Pgina 1 de 2 Compartilhe Mais! Pgina 1 de 2 12

Curso GM Online - 5 Lio - 3 Parte - Banco de Dados


por joaoneto em Ter Fev 03, 2009 12:09 am Comeo esta terceira Parte com uma boa notcia. Encontrei uma verso de patch estvel para o Game Maker 7. Com isso, poderei dar continuidade ao curso online usando ele, para aqueles que o tem, com certeza ser maravilhoso, para aqueles que usam o 6, no se desanimem, pois a programao ser a mesma para os dois. Na lio passada, fizemos uma tela de login, usando scripts e uma validao se os campos foram preenchidos. Hoje, faremos a parte mais interessante e com certeza a mais esperada por todos. Usando a GMSQL, conectaremos na base MySQL, ensinada como configurar e criar a tabela de login na primeira parte desta quinta aula, Validaremos a existncia do Login e senha. De incio, baixe a DLL e o pacote de scripts Aqui. Vamos aproveitar o exemplo feito na aula passada. Se voc no o construiu, pare, volte na aula e o faa, pois ele ser necessrio aqui. 1 passo importe o script GMSQL.gml para o projeto. Eu aconselho a criar uma pasta para os mesmos(no GM7 esse passo da pasta automtico). Depois, Copie as 3 Dlls que o acompanham para o mesmo diretrio do projeto. Segue como ficar dentro do seu projeto e na pasta dele:

O que faremos agora ser executar os seguintes passos:


Ao Clicar no boto de login validar se Login e senha foram preenchidos Se sim, Instaciaremos a GMSQL. Faremos conexo com a mesma. Passaremos a Query(Linha SQL) para o banco executaremos. Se o retorno for verdadeiro Daremos uma mensagem de seja bem vindo ao usurio Se o retorno for falso Daremos uma mensagem de Login ou senha invlidos Se no, Daremos uma mensagem de Falha de Conexo.

Vamos comear. Crie um script de nome scr_login. Nele, adicione o seguinte Cdigo: Cdigo:
//capturamos os valores passados login = argument0; senha = argument1;

//montamos a Query Query = "SELECT cod_user FROM tb_user WHERE nom_user = '"+login+"' AND cod_nivel = "+senha; //Tentamos instanciar a DLL if gmsql_init(){ //Efetuamos a Conexo com o Banco de dados if gmsql_connect('Localhost:3306','root','root','db_game'){ //Validamos se a Query foi executada if gmsql_query(Query)=1{ //Guardamos o resultado gmsql_storeresult(); //Validamos se houve retorno do valor pedido if (gmsql_getvaluexy(0,0)) != ""{ //Fechamos a Conexo e Desinstanciamos a DLL. gmsql_close(); return true; } gmsql_close(); return false; } gmsql_close(); return false; } }

MAS O QUE FOI FEITO AQUI?? Lembra-se da 1 parte desta Aula, onde fizemos uma query diretamente no SQL Yog? Nela fizemos uma query simples, usando * que indica ALL, todos os campos da tabela. Agora, nossa query possui duas peculiaridades:

Pedimos no Select apenas o campo Cod_user

Passamos como parmetro(Clausula WHERE) o nome de usurio e a senha. Estaremos usando o Cod_nivel para isso, mas nada impede a criao de um campo senha que seja alfa-numrico.

Aps isso, observe que se o script de inicializao da GMSQL retornar true entramos na conexo. No script de conexo, passamos IP:Porta, usurio,Senha,Base. Se este tambm retornar true, passamos para o script de Query, onde passamos como parmetro nosso SQL montado l em cima. Este por sua vez, deve retornar 1. Retornando, validamos se houve retorno de dados. Se sim, devolvemos true na funo, caso contrrio devolvemos false. Agora, iremos aplicar o script. Abra o objButton, construdo na lio passada. Se voc se lembra bem, ele possui o seguinte script no evento Draw: Cdigo:
if(button(x,y,"Login")){ if global.login == "" { show_message("Preencha seu Login.") exit; }

if global.senha == "" { show_message("Preencha sua Senha.") exit; } }

Iremos complement-lo, de forma a executar nosso scr_login. Com certeza, voc j sabem como fazer o mesmo. Aqui vai o script completo: Cdigo:
if(button(x,y,"Login")){ if global.login == "" { show_message("Preencha seu Login.") exit; } if global.senha == "" { show_message("Preencha sua Senha.") exit; } if scr_login(global.login,global.senha){ show_message("Seja bem vindo.") } else{ show_message("Usurio ou senha invlidos.") } }

Observe que ficou bem simples. Uma das grandes vantagens de usarmos scripts da pasta de Scripts que nosso cdigo dentro dos objetos vai ficando limpo, alm de reaproveitarmos o mesmo se necessrio. Uma outra peculiaridade so os parmetros na funo gmsql_connect. Observe que passamos para ele Localhost:3306. Esta configurao de IP:Porta pode levar qualquer endereo e qualquer porta, fazendo com que seu banco MySQL esteja em qualquer lugar, e mesmo assim voc ter acesso a ele, seja diretamente como fizemos aqui, ou atravs do Server do jogo. Se tudo estiver OK na sua mquina (MySQL Instalado, Configuraes feitas, Tabela Criada, Registro Inserido) Basta executar o jogo e tentar logar. Se voc digitar corretamente os dados( Lembrando que nome, Nome e NOME d na mesma para o banco) dever mostrar a mensagem de sucesso e, caso digitar errado, mostrar a mensagem de falha. Para quem achou que seria algo completamente impossvel, a est. Um Login que valida se digitou, conecta-se a uma base MySQL e valida se o login existe na base. Eu tenho certeza que voc est pensando: E agora?? Bem, agora tudo comea. Veja o que j estudamos: O uso da SOC, a criao de Clients de movimento, o uso da GMSQL, uma criao de Login. Veja como se encaixarmos as peas, estamos indo em direo a um game Online. Na Prxima lio: Comearemos a construir nosso Prprio Server e aprenderemos mais

sobre o uso da GMSQL. At l.


GM RPG - 1 Lio - Criando um char com movimento isomtrico de RPG


por joaoneto em Sab Fev 07, 2009 8:56 am Comeo este novo tipo de lio com uma idia em mente: para se construir um MMORPG, so necessrios mais itens do que banco de dados, conexes TCP/IP, Clients e Listeners. Para que eu possa oferecer material de qualidade, a construo de um MMO com outros elementos se faz necessria. com isso, estarei postando neste novo tipo de lio, a GM RPG. A vantagem que o que ser ensinado aqui pode ser usado a parte, sem a necessidade de se contruir um jogo Online. Vamos l. Talvez uma das maiores dificuldades de se construir um RPG no GM vem exatamente do movimento dos chars. Se quisermos fazer jogos no Estilo Final Fantasy antigos, at no, mas jogos mais complexos, com chars isometricos, movimento de mouse, entre outros elementos sempre parece complicado demais. Seria, se no houvesse o GML para nos auxiliar !! Antes de mais nada o char. Eu estarei usando como exemplo este char: Qual a peculiaridade dessa imagem? a menina possui 8 direes. Sim, basta replicar as tres ultimas linhas e inverter. trabalhoso, por isso eu vou dar o char dela j na forma como ser usado na lio, para que voc tenha idia de como fazer os seus depois . Para facilitar a minha vida eu constru um aplicativo em .Net para montar as posies na ordem que eu preciso. Com certeza se eu terminar o aplicativo eu posto ele tambm: e no final nossa imagem ficar assim: Voc pode tentar montar esta mesma sequncia usando o Sprite Editor do GM. um pouco mais trabalhoso mas d. Agora, crie um projeto novo no GM(6 ou 7), Adicione um Sprite. na tela do sprite Criado, chame-o de menina. Clique no boto Edit Sprite. Na nova tela, v no menu, Clique em File e em Create From Strip, Como na imagem:

Selecione nossa imagem da menina. Coloque as dimenses de 64x64(o tamanho de cada quadro) e divida por 33, como na imagem: Voc deve estar se perguntando porque 33. Sim, o ultimo quadro deve ficar em branco, para que a nossa contagem no cdigo d certo. feito isso, sua tela deve estar assim: No final, centralize o char, e coloque a posio Y quase nos ps do char, como na figura: Este passo acima muito importante, ou o char no ir andar como se deve e nem parar aonde se clicou. A parte fcil j foi. Agora vem a um pouco mais fcil. Crie um Objeto, e o chame de chrMenina. Adicione dois eventos, um Create e um Step. No evento Create, Coloque este cdigo: Cdigo:
facing=0; direcao=8; velocidade=0.2; moving=0; target_x = x target_y = y image_speed = 0; image_index = direcao;

Estas sero as variveis usadas pelo movimento, e j setamos alguns parmetros do nosso objeto. O pulo do gato vem agora. Como fazer para, ao clicar com o mouse, o char ande, at aonde se clicou, olhando na direo que ele est andando, e ao no se clicar em nada, ele fique parado?? Usaremos alguns comandos do GML, combinado com nossas variveis, algo bem simples. Primeiro, verificamos se houve o clique e logo aps o release: if mouse_check_button_released(mb_right) Se sim, setamos as variveis de posio: target_x = round(mouse_x) target_y = round(mouse_y) Estaremos usando Round pois o GML acaba pegando valores decimais quando se recupera a posio do mouse, e precisaremos de uma posio mais precisa. Aps isso, fazemos uso do comando point_direction para descobrirmos a direo relativa do clique em relao ao nosso objeto: facing = round(point_direction(target_x,target_y,x,y)/45) Com isso, encontraremos um numero entre 0 e 8, apontando para a direo. Porm o 8 sai fora da nossa matriz de imagens, a fazemos uma correo: if ( facing = 8 ){facing = 0} Agora eu defino a direo: direcao = (facing * 4). Porque estou multiplicando por 4? simples, a quantidade de quadros de animao do nosso char. Definimos a direo ento e iniciamos o movimento: image_index = direcao; moving = 1;}

Aps tudo isso nosso cdigo ficar assim: Cdigo:


if mouse_check_button_released(mb_right) { //Recupero X e Y do Clique do mouse target_x = round(mouse_x) target_y = round(mouse_y) /* Fao um calculo arredondado da posio do mouse em relao ao objeto, e defino o lado que o char vai "olhar" */ facing = round(point_direction(target_x,target_y,x,y)/45) //Acerto os valores, para ficar entre 0 e 7 if (facing = 8){facing = 0} /* Defino a direo. Ex: olhando para baixo 8, e neste caso o facing retornar 2 Ento: 2 * 4 = 8 -> char olhando para baixo */ direcao = (facing * 4) //Defino a direo inicial image_index = direcao; //E inicio o movimento moving = 1 }

Agora a parte de cdigo que realmente movimenta: Cdigo:


if moving = 1 { image_speed = velocidade; if (distance_to_point(target_x,target_y) > 5) { move_towards_point(target_x,target_y,4); /* Este IF verifica se a animao est dentro da quantidade de quadros certa. Para que a contagem fique certa, os Strips de sprites possuem um quadro em branco a mais. */ if (image_index >= direcao + 4) {image_index = direcao;} } else{ //Ao verificar que chegou onde se clicou, para-se o movimento. speed = 0; moving = 0; image_speed = 0; image_index = direcao; } } // Parado else { image_speed = 0; image_index = direcao; }

Observe que usamos o comando distance_to_point para saber se ainda no chegou na posio passada nos parametros. Como a distancia ainda maior que 5(este numero pode ser aumentado, no diminuido, ou o char no vai parar), usamos move_towards_point, que faz com que o objeto se mova na direo X e Y passadas. o Macete da animao vem logo abaixo: if ( image_index >= direcao + 4 ) {image_index = direcao;} Com o Comando acima, eu evito que se mostre outro tipo de quadro a no ser os que esto dentro do limite da animao, para aquela direo claro.

Ao se verificar que se chegou ao ponto, apenas zeramos velocidade de animao e o index do sprite, para mostrar a posio parada do char. Feito isso tudo, adicione uma room, coloque o chrMenina nela e teste. Lembrando que o Clique direito do mouse, e s quando voc solta o boto. Eu sei que devem haver milhares de formas de se fazer isso, e o movimento pode ser bem mais estilizado, colocando mais parametros para se mover apenas em determinadas situaes e tal, mas veja que com algumas linhas de cdigo e a imagem feita da forma certa, foi extremamente simples. Lembrando que para mudar a direo inicial do char, apenas mude a varivel direo no evento Create para o Indice da imagem. As principais paradas so estas:

Left: 0 Down-Left: 4 Down: 8 Down-Right: 12 Right: 16 Top-Right: 20 Top: 24 Top-Left: 28 Prxima lio: Movimento de Inimigos. At l.

por igorfelipe em Sex Fev 20, 2009 1:44 pm po cara tuto muito maneiro mesmo mais como fao com esse spriter tipo sem os movimentos cima baixo tras e frente porque esse spriter so tem diagonal como fao para ela mover vlw tuto muito show......... essa menina que apostei abaixo como fao ela mover isometrico

caso a image no aparecer click no link abaixo e baixe em png http://img22.imageshack.us/my.php?image=111ba7.png


GM RPG - 2 Lio - Movimento de Mobs(Inimigos) isomtrico de RPG


por joaoneto em Sab Fev 14, 2009 9:17 am Na 1 lio de GM RPG aprendemos a criar um movimento com Clique de mouse, no estilo dos jogos atuais, porm usando um char Isomtrico. Muitas pessoas no tem muita noo e acham que um jogo Isomtrico um jogo na diagonal. Isto verdade em relao aos grficos, mas o que realmente muda a proporo do movimento. Num jogo isomtrico, o movimento na horizontal sempre 2 vezes proporcional ao movimento na vertical, formando assim a idia de um losango. Todo e qualquer movimento ou cenrio nesse tipo de jogo deve seguir este padro. Na aula passada eu disse que aprenderamos sobre movimento de Mobs(Inimigos). A sigla Mob muito usada hoje nos jogos Online, talvez pelo tamanho da palavra. Voc j usou Paths no GM? se no, hoje ser uma boa chance de ver como funciona e como criar e modificar paths usando GML. O que faremos ser criar um Path, com GML, e fazer nosso Mob seguir o mesmo. Pra quem j fez jogos em RPGMaker sabe que rafemos o mesmo tipo de movimento quando se cria um evento e coloca-se nele uma rota-pr-definida. O uso de Paths nesse caso no precisa se limitar aos Mobs, ele pode ser usado para NPCs e objetos de cenrio. Vamos comear. Antes de mais nada um detalhe: estaremos usando a mesma idia de Sprites da aula passada. Eu ainda estou desenvolvendo a ferramenta de criao, assim que ela estiver pronta eu disponibilizarei. Enquanto isso, use a imagem abaixo para nosso exemplo de Mob: Crie um sprite, chame-o de Zumbi. Repita os passos de criao do Strip, como na aula passada, lembrando de deixar o ultimo quadro branco. Vamos exercitar a criao de um Path? Crie um novo Path na pasta, e v clicando na tela e movendo os pontos at ficarem assim: Observe que fizemos uma elpse. na verdade esse exerccio de Paths apenas para que voc saiba depois criar seus prprios paths. No iremos usar este que criamos. Porque? Simples: O Path funciona na tela exatamente aonde voc o criou. Se tentarmos mudar as coordenadas dele em tempo de execuo, TODOS os objetos que compartilharem o path iro para aquela posio. Crie um script, chame-o de elipse_path, e adione nele o seguinte cdigo: Cdigo:
X = argument0; Y = argument1; ind = path_add();

path_set_kind(ind,argument2) //0 - Reta, 1 = Curva path_add_point(ind,X,Y, 32,100); path_add_point(ind,X,Y, 96,100); path_add_point(ind,X 80,Y, 128,100); path_add_point(ind,X 144,Y, 128,100); path_add_point(ind,X 224,Y, 96,100); path_add_point(ind,X 224,Y, 32,100); path_add_point(ind,X 144,Y,100); path_add_point(ind,X 80,Y,100); return ind;

Observe que nos comandos path_add_point estamos colocando as posies X e Y passadas como parmetro mais o posicionamento baseado naquele path oval que desenhamos. A idia que, para cada Tipo de Path que voc crie, haja um script de criao para o mesmo, de forma que vrios objetos podero compartinhar do tipo de movimento, sem compartilhar o mesmo Path e consequentemente havendo falhas no seu jogo. Para j vermos a bagaa funcionando de vrias formas, crie outro script, nomeie-o de circulo_path e adicione o seguinte cdigo: Cdigo:
X = argument0; Y = argument1; ind = path_add(); path_set_kind(ind,argument2)//0 - Reta, 1 = Curva path_add_point(ind,X,Y, 64,100); path_add_point(ind,X,Y, 128,100); path_add_point(ind,X 64,Y, 192,100); path_add_point(ind,X 128,Y, 192,100); path_add_point(ind,X 192,Y, 128,100); path_add_point(ind,X 192,Y, 64,100); path_add_point(ind,X 128,Y,100); path_add_point(ind,X 64,Y,100); return ind;

Agora temos dois tipos de movimento para testar. Crie um objeto, chame-o de MOB, coloque o Sprite do Zumbi. Adicione os Eventos Create e Draw. Agora em cada um coloque assim: Evento Create: Cdigo:
ind = circulo_path(x,y,1); path_start(ind,2,1,true); speed = 1.0; image_speed=0.3; image_index=6; old_dir = 1;

Evento Draw: Cdigo:


facing = round(direction / 45); if facing == 8 then facing = 0; direcao = (facing * 4); if old_dir == 1 { old_dir = direcao; image_index = direcao; } if (old_dir != direcao){ old_dir = direcao;

image_index = direcao; } if (round(image_index) >= direcao 4) {image_index = direcao;} draw_sprite(sprite_index,image_index,x,y);

Mas o que foi feito aqui?? Bem, vou explicar: No evento Create, declaramos uma varivel ind, que recebe o path criado pelo script circulo_path. Setamosas variveis de movimento e de imagem, e criamos uma old_dir. Esta varivel nos ajudar a saber se o mob mudou de direo, para podermos mudar tambm o seu sprite. No evento Draw, encontramos a direo do objeto e usamos uma diviso por 45 para obtermos 8 direes. Fazemos uma correo nos clculos, pois precisamos do valor entre 1 e 7, Setamos a direo. Validamos se a direo mudou e se sim, mudamos novamente o seu valor, e no final fazemos a mesma jogada que foi feita com o personagem na aula passada. Por fim desenhamos o Sprite. Para testar, crie uma Room, adicione vrios Zumbis em lugares diferentes e rode. Se todos os passos foram seguidos, seu mob vai andar lindo num movimento circular excelente. Para mudar o movimento, teste o script elipse_path no lugar do circulo. Agora como execcio, crie seus prprios Paths. Para ter certeza do desenho que eles descrevero, crie primeiro um path atoa e desenhe nele. Anote os valores dos pontos e use-os como nos scripts que criamos. Algumas pessoas sempre pem dificuldade em criar, por ser mais fcil pegar pronto na
Net. Eu discordo, e provo que com o Game Maker possvel fazer qualquer tipo de jogo, basta que voc seja criativo e esforado. Ningum precisa saber tudo, at eu mesmo pesquiso as vezes para encontrar modelos de engines e adapt-los minha necessidade. Na Prxima lio: Menus Flutuantes estilo Ragnarok. At l.

GM RPG - 3 Lio - Janelas Flutuantes estilo Ragnarok - 1 parte


por joaoneto em Ter Fev 17, 2009 12:43 am
L venho eu com mais uma lio de GM RPG. Sei que muitos tem lido, mas no sei estou agradando, afinal todos sabemos que fazer um jogo em GM complexo, demorado, e na maioria das vezes apanhamos pra cacete pra fazer algo parecido com o que queremos. Eu peo aos leitores que testem, tentem, achem erros, jeitos mais fceis de fazer. Estou na ponta do Iceberg sobre o assunto, ainda h muito o que escrever e falar e, seria fcil postar aqui uma "engine" de jogo RPG, mas dessa forma se acaba copiando muito e aprendendo nada. Chega de enrolao e vamos comear. Uma das coisas que voc deve saber e, se ainda no sabe, que o evento Draw com certeza e sempre ser o evento mais usado quando falamos de mostrar informaes na tela. Hoje, voc aprender a fazer uma janela, onde poder mostrar o que quiser, criar vrias delas com informaes diferentes, etc. A vantagem que, usando scripts, basta mudar alguns parmetros e temos janelas completamente distintas em contedo, mas no mesmo padro de

desenho, como devem ser. Para que voc se familiarize com o evento Draw, no iremos usar imagens para desenhar nossa janela, usaremos apenas GML, e o resultado final ser esse: Com o cdigo que voc aprender aqui, voc far uma janela que, alm de flutuante, podendo ser movida com o arrastar/soltar do mouse, ela ser retrtil(palavra difcil), ou seja, ao se dar um duplo clque ela se abre e se fecha. Mos obra. Antes de mais nada precisamos de 2 resources do GM: um sprite e uma Fonte. Nosso sprite ser a mscara que o objeto janela usar para ser arrastado, e a fonte para ser desenhada na janela. A sprite deve seguir as configuraes da figura abaixo: e a fonte assim: Agora, criaremos uma pancada de scripts, que sero explicados passo a passo depois. Crie os scripts abaixo usando o nome em negrito. mouseover Cdigo:
x1 = argument0 //posio x inicial x2 = argument1 //posio x final x3 = argument2 //posio y inicial x4 = argument3 //posio y final if mouse_x >= x1 && mouse_x <= x2 && mouse_y >= x3 && mouse_y <= x4{return true;} else{return false;}

janela Cdigo:
x1 = argument0; x2 = argument1; x3 = argument2; x4 = argument3; cor = argument4; aberta = argument5; txtAberta = argument6; txtFechada = argument7; tela(x1,x2,x3,17,cor); if aberta { textoJanela(x1,x2,txtAberta); tela(x1,x2+16,x3,x4+16,cor); } else { textoJanela(x1,x2,txtFechada);

tela(x1,x2+16,x3,17,cor); }

tela Cdigo:
x1 = argument0 x2 = argument1 x3 = argument2 x4 = argument3 cor = argument4 if cor == 0 then cor = c_white; //Desenha o fundo draw_set_color(make_color_rgb(74,74,132)) draw_set_alpha(0.7) draw_rectangle(x1,x2,x1 + x3,x2 + x4,false) draw_set_color(cor) draw_set_alpha(1) //desenha as bordas draw_rectangle(x1,x2,x1 + x3,x2 + x4,true) draw_rectangle(x1 + 1,x2 + 1,x1 + (x3 - 1),x2 + (x4 - 1),true) return true;

LPress Cdigo:
if move == false{ move = true; d_x = x - mouse_x; d_y = y - mouse_y; } timer += 1 alarm[0] = 20 if timer > 1{ if opened == true{ opened = false; timer = 0; break; } else{ opened = true; timer = 0; break; } }

textoJanela

Cdigo:
draw_set_color(c_white); draw_set_font(menubarra); draw_text(argument0+5,argument1+1,argument2);

janelaDraw Cdigo:
if mouseover(x,x+largura,y,y+15){ if mouse_check_button_pressed(mb_left){ LPress();} } if mouse_check_button_released(mb_left){ move = false;} if move = true{ valor_x = abs(view_xview - (mouse_x + d_x)); valor_y = abs(view_yview - (mouse_y + d_y)); } x = view_xview + valor_x; y = view_yview + valor_y; janela(x,y,largura,altura,cor,opened,argument0,argument1);

Se voc observar, praticamente o que necessrio para se fazer a janela j foi escrito nos scripts. Agora s organizar algumas variveis e fazer algumas chamadas em um evento draw e pronto. E ainda tem gente que reclama... Agora a parte mais difcil. Crie um objeto, chame-o de objJanela. Adicione 3 eventos, um Create, um Alarm0 e um Draw. Abaixo segue o cdigo de cada um: Create Cdigo:
opened = false; timer = 0; cor = c_white; move = false d_x = 0; d_y = 0; valor_x = 0; valor_y = 0; largura = 220; altura = 180; image_xscale = 6;

Alarm0 Cdigo:
timer = 0;

Draw Cdigo:
janelaDraw("Menu","HP - 100");

Para evitarmos um erro, adicione no Sprite do objeto nosso sprite de nome mask. Crie uma room, adicione o objJanela na mesma e rode. Ao clicar na barra superior e arrastar, a janela se move. Ao clicar duas vezes, a janela se expande, mudando o texto na barra. Para que se aparea um texto na parte de baixo da janela, inclua este cdigo no Draw do objJanela: Cdigo:
if opened { textoJanela(x,y+20,"HP - 100"); }

Agora ao se clicar duas vezes, o texto da barra mostrado na parte inferior. Caso queria ver a coisa realmente legal, crie uma room grande, adicione uma view e um objeto que se move e... a janela acompanha a tela !! J deu pra sacar que parece difcil demais, mas foi muito fcil. O tpico j est de um tamanho bom e eu muito cansado. Na prxima parte desta lio eu explicarei item por item dos scripts, e mudaremos o layout de nossa janela para usar imagens, dando mais vida mesma.

GM RPG - 3 Lio - Janelas Flutuantes estilo Ragnarok - 2 parte


por joaoneto em Dom Fev 22, 2009 10:38 pm Como dito na aula anterior, estarei explicando como funcionam os scripts usados e agora usaremos imagens ao invs de desenhar a janela com cdigo, para dar um ar mais profissional a mesma. Vamos por Script: mouseover Cdigo:
x1 = argument0 //posio x inicial x2 = argument1 //posio x final x3 = argument2 //posio y inicial x4 = argument3 //posio y final if mouse_x >= x1 && mouse_x <= x2 && mouse_y >= x3 && mouse_y <= x4{return true;} else{return false;}

Observe que fazemos a verificao se a posio X e Y do mouse se encontra dentro dos valores passados. Como so quatro valores, se forma um retangulo de validao. janela Cdigo:
x1 = argument0; x2 = argument1; x3 = argument2; x4 = argument3; cor = argument4; aberta = argument5; txtAberta = argument6; txtFechada = argument7; tela(x1,x2,x3,17,cor); if aberta { textoJanela(x1,x2,txtAberta); tela(x1,x2+16,x3,x4+16,cor); } else { textoJanela(x1,x2,txtFechada); tela(x1,x2+16,x3,17,cor); }

Este bem simples. Ele faz chamada no Script Tela, passando os parametros que ele recebeu. Observe a validao no aberta, que indica que devemos desenhar uma janela menor quando fechada, e o texto que ser mostrado nos dois casos. tela Cdigo:
x1 = argument0 x2 = argument1 x3 = argument2 x4 = argument3 cor = argument4

if cor == 0 then cor = c_white; //Desenha o fundo draw_set_color(make_color_rgb(74,74,132)) draw_set_alpha(0.7) draw_rectangle(x1,x2,x1 + x3,x2 + x4,false) draw_set_color(cor) draw_set_alpha(1) //desenha as bordas draw_rectangle(x1,x2,x1 + x3,x2 + x4,true) draw_rectangle(x1 + 1,x2 + 1,x1 + (x3 - 1),x2 + (x4 - 1),true) return true;

Este o script que desenha a janela, azul com borda branca. Observe que apenas uma combinao de Funes de Draw, cores, parametros e alpha. LPress Cdigo:
if move == false{ move = true; d_x = x - mouse_x; d_y = y - mouse_y; } timer += 1 alarm[0] = 20 if timer > 1{ if opened == true{ opened = false; timer = 0; break; } else{ opened = true; timer = 0; break; } }

Este o script responsvel por duas coisas importantes:


O Duplo Clique Saber se a janela est se movendo e gravar os valores X e Y da posio do mouse.

textoJanela Cdigo:
draw_set_color(c_white); draw_set_font(menubarra); draw_text(argument0+5,argument1+1,argument2);

Este simplesmente desenha o texto, como falado no script tela, ele possui j algumas definies prontas apenas para evitar se reescrever toda vez que se for escrever um texto na tela. janelaDraw

Cdigo:
if mouseover(x,x+largura,y,y+15){ if mouse_check_button_pressed(mb_left){ LPress();} } if mouse_check_button_released(mb_left){ move = false;} if move = true{ valor_x = abs(view_xview - (mouse_x + d_x)); valor_y = abs(view_yview - (mouse_y + d_y)); } x = view_xview + valor_x; y = view_yview + valor_y; janela(x,y,largura,altura,cor,opened,argument0,argument1);

Este o Script que faz a mgica. Ele valida se o mouse est sobre a borda superior usando o script mouseover, valida se o boto esquerdo do mouse est pressionado. Se sim, ele invoca o Script LPress, que responsvel por mudar a posio da janela e do duplo Clique. Aqui um detalhe importante: a funo deve ser a mouse_check_button_pressed, ou o duplo Clique no funcionar. Caso o boto seja solto, no evento mouse_check_button_released, cancelamos o movimento da janela. Na prxima validao, se a varivel move est true significa que h movimento, e fazemos os clculos como acima. Um detalhe aqui no qual eu j recebi crticas foi a redundncia de se remover os valores X e Y da view durante o movimento e depois acrescent-los novamente ao se desenhar a janela. O motivo disso muito simples. Ao se mudar a posio da view, durante o movimento do heri ou outro objeto ao qual ela esteja associada, O MENU DEVE DAR A IMPRESSO DE PARADO, OU SEJA, SUA POSIO X E Y IR MUDAR DE ACORDO COM A X E Y DA VIEW. E por final, chamamos o script janela, passando todos os parametros necessrios que foram colhidos no nosso objeto. Eu sei, parece bem complexo. Mas estude o cdigo, voc ver que bem simples. Agora vem a m notcia pra quem adorou esta aula: Para se usar as Imagens das Skins do ragnarok, ns s usaremos dois( 2 ) dos seis( 6 ) scripts acima. Porque? por um motivo bem simples: Como as imagens da Skin do ragnarok vem pr-montada, s criaremos dois sprites, um do menu fechado e outro aberto, e faremos a mudana entre eles. A desvantagem desse tipo de Menu que para cada menu criado, voc ter que ter 2 Sprites da janela. Para o teste eu estarei usando esta Skin:

Vai ser bem simples. Antes de mais nada crie dois Sprites, adicione os sprites ae de cima e os chame de status_aberta e status_fechada. Agora crie um objeto e chame-o de objJanelaRag. Adicione nele 3 eventos, um Create, um Alarm0 e um Draw. Agora siga os scripts abaixo para cada um: Create Cdigo:

opened = false; timer = 0; move = false d_x = 0; d_y = 0; valor_x = 0; valor_y = 0;

Alarm0 Cdigo:
timer = 0;

Draw Cdigo:
if mouseover(x,x+280,y,y+15){ if mouse_check_button_pressed(mb_left){ LPress();} } if mouse_check_button_released(mb_left){ move = false;} if move = true{ valor_x = abs(view_xview - (mouse_x + d_x)); valor_y = abs(view_yview - (mouse_y + d_y)); } x = view_xview + valor_x; y = view_yview + valor_y; if opened { draw_sprite(status_aberta,0,x,y); } else { draw_sprite(status_fechada,0,x,y); }

Uma pequena observao: no mouseover h dois valores fixos, 280 e 15. Estes valores so respectivamente a largura e a altura que responder ao mouseover, devendo ser mudadas se a janela for mais larga ou estreita e se a barra for mais fina ou espessa. Coloque o objeto na room e rode. Bem mas simples com certeza. A vantagem do uso de imagens padronizadas como as Skins do Ragnarok, que podemos criar um sistema de Skins para o nosso game, bastando criar um script que valida um determinado valor de diretrio e L as respectivas imagens no mesmo. Para desenhar valores dentro da mesma agora, est bem fcil, mas lembre de mudar a cor da fonte e o tamanho. Por hoje s. Na prxima lio, e com certeza por enquanto a ultima de GM RPG, falaremos sobre atributos do heri. At l.

GM RPG - 4 Lio Atributos do Heri - 1 parte


por joaoneto em Seg Fev 23, 2009 7:33 pm ATENO: POR ALGUMA INCOMPATIBILIDADE QUE EU AINDA NO SEI QUAL , ESTA LIO NO FUNCIONA COM O GM 6.1. ASSIM QUE DESCOBRIR O PORQUE EU MODIFICO O CDIGO PARA QUE FUNCIONE. Comeo esta 4 lio de GM RPG agradecendo a todas as PMs e Posts dos usurios que esto gostando e usando o que eu estou ensinando. muito importante para mim saber que est sendo til, pois conhecimento no nada se no foi passado para frente. Na lio passada eu disse que falaramos de Atributos do Heri. Para aqueles que ainda no tem a menor idia do que eu estou falando, eu darei uma pequena prvia. Ao se falar em atributos, estamos falando dos nmeros e textos que compem todos os dados do Heri. O nome do heri um atributo, sua Classe um atributo, bem como seu HP ,MP e Status atual. Dados numricos, como HP, MP, Fora, Destreza, etc. No esto ali simplesmente toa. Jogos de Mesa e Eletrnicos costumam usar classes e raas para definir valores padro aos atributos do Heri, como Fora, inteligncia, entre outros. Pensando nisso, temos o conceito como que se segue: As classes e raas podem determinar vrios tipos de atributos do heri, de como ser a usa evoluo at o tipo de equipamento que o mesmo pode usar, e os poderes mgicos ou fsicos que este ter. Ficou meio esclarecido o que seria os atributos do Heri? Eu espero que sim. Ento em nossa aula de hoje, veremos como construir um sistema de atributos, baseando-se em Classe e raa. Eu pretendia fazer apenas baseado na classe, mas com certeza isso traria problemas para os clculos se voc desejasse fazer um jogo mais elaborado. Vamos comear. Para baixar os arquivos necessrios para esta aula clique Aqui Nas aulas de GM Online eu comecei a falar de banco de dados. O Uso de banco de dados muito importante, mesmo que se usem arquivos texto para armazenar as informaes. Mas porque eu gosto tanto de banco de dados? Por um motivo bem simples:

Recuperao, Atualizao, Insero e Deleo de dados de forma concisa. Todo e qualquer BD usa de uma linguagem chamada de SQL. O SQL de longe a melhor forma de manipulao de dados j inventada. Ento porque reinventar a roda? Criar milhares de arquivos texto, scripts e mais scripts para se manipular os mesmos se temos uma ferramenta pronta, apenas esperando para ser usada? Esse o meu motivo. Em nossa Lio de RPG, como estaremos lidando com um jogo Off-line, no h a necessidade de uma engine de BD como o MYSQL. Ento, estaremos usando o SQLITE. Mas porque o mesmo no foi usado ento? Porque ele no possui um item extremamente importante nos jogos Online: Segurana. Durante o desenvolvimento da aula voc ver porque. Ento, para Continuar nossa lio, estarei disponibilizando trs arquivos: Hat.dll -> A Dll de comunicao com o banco SQLITE. DB.db -> Nossa base SQLITE. SQLite Browser -> Ferramenta para editar o BD. SQLITE.gml -> Scripts desenvolvidos por mim para facilitar a operao do SQLITE. Vamos criar vrias tabelas, as quais eu passarei o script pronto para que voc no tenha tanto trabalho e eu possa escrever menos aqui. Depois que concluirmos a lio, leia todo o material, e com certeza voc achar como customizar para que essa que a parte mais importante do jogo fique de acordo com o que voc deseja. Alguns detalhes importantes: Nosso heri ter os seguintes Atributos: Nome Classe Raa Nvel HP atual HP mximo MP atual MP mximo Status Atual Fora Destreza Agilidade Inteligncia Nossas Classes tero os seguintes atributos: Nome % Fora % Destreza % Agilidade % Inteligncia Nossas raas tero os seguintes atributos: Nome % HP % MP

Resistncia a Status um Resistncia a Status dois Observe que nem falamos de armas e equipamentos. Estes sero tratados numa prxima lio. Os atributos com % significam que sero usados como parmetro toda vez que o Heri evoluir um nvel. Ser graas a esta porcentagem que o heri evoluir mais de num determinado campo de acordo com a sua classe. Note que usei a raa para determinar a % de HP e MP. Contrariando a idia de que estes dados seriam diretamente proporcionais aos usados na classe, ser apenas para que a raa no fique apenas com Resistncia a determinados status. De cara, para termos todos estes dados guardados precisaremos das seguintes tabelas: tb_heroi -> Guardar os atributos principais do heri, como descrito acima. tb_classe_heroi -> Guardar os atributos das Classes, como descrito acima. tb_raca_heroi -> Guardar os atributos das raas, como descrito acima. tb_status -> Guardar a lista de status possveis. Observemos tambm que s uma das trs tabelas receber atualizaes constantes durante o jogo. Apenas a tb_heroi. Para facilitar a sua vida, junto com o pacote de arquivos listados l em cima estaro mais tres arquivos: Tabelas.txt -> Tabelas necessrias Querys.txt -> Todas as Querys possveis nas tabelas criadas Cargas.txt -> Dados Iniciais para o exemplo. Voc pode dizer assim: Mas porque voc no manda o BD j com as tabelas criadas e a carga aplicada? Porque eu tenho que fazer isso? Por algo bem simples: Eu sei como fazer, a qualquer hora e lugar. E voc, sabe? Se sim, timo, se no, a sua oportunidade de estar aprendendo. Em primeiro lugar, abra o SQLite Browser. A tela dele esta:

Clique na pastinha, e abra nosso db.db. Na segunda aba, na Execute SQL, aonde aplicaremos todos os scripts. Primeiro, abra o arquivo Tabelas.txt, selecione CREATE TABLE por CREATE TABLE separadamente e cole na tela, e clique em executar. Um detalhe a respeito dos Scripts que eles esto separados por uma barra de ****, ento, no pegue mais nada alm disso. Outro detalhe a ordem. Para que tudo d certo, necessrio que voc execute cada um como esto nos arquivos. Ao terminar o arquivo Tabelas.txt, abra o arquivo Cargas.txt e faa da mesma forma. Ao terminar, seu SQLite Browser deve mostrar as 4 tabelas criadas na primeira aba, assim:

E na aba Browse Data todas as tabelas devem ter dois registros, como esta:

A parte de banco est inicialmente feita. Temos dois heris, cada um de uma classe, de

uma raa e uma tabela com dois status diferentes. Voc deve ter notado que guardamos na tb_heroi apenas os cdigos de Classe, raa e Status. Ao se utilizar ndices ( o que acabamos de fazer ) evitamos redundncia de dados, alm de otimizar os processos e facilitar na alterao dos mesmos. Voc deve estar se perguntando: Mas onde entra essa bagaa toda no meu game? Para ser usado pelo GM, faremos as consultas, usando os modelos de SQL no arquivo de querys. Carregaremos objetos ds_grid com os dados no incio do jogo, e os usaremos enquanto o jogo estiver rodando. Ao usar BDs, estamos poupando o uso de arquivos texto, e conseqentemente expondo nossos dados internos do jogo a qualquer um. Isso no impede que algum que saiba que voc usou uma base SQLite baixe o SQLite Browser e acesse os mesmos, mas impede que pelo menos os jogadores menos curiosos tentem mexer no seu game. Vamos ao que interessa. Se achar melhor, use o projeto criado para o menu, ou crie um novo. Copie para o diretrio do projeto os arquivos hat.dll, db.db e importe o SQLite.gml. Dentro do seu projeto, a estrutura de scripts deve estar assim:

Se estiver tudo como foi dito logo acima, crie um objeto, chame-o de objQuery, adicione dois eventos, um Create e um press . Logo a seguir o script de cada um: Create: Cdigo:
sqlite_init();

Press : Cdigo:
grid = sqlite_query("SELECT cod_heroi, nom_heroi from tb_heroi",2);

Se voc colocar seu objeto na room agora e rodar, nada vai acontecer. Porque? Por que voc apenas preencheu um objeto grid com o que veio do BD. Voc no pediu para mostrar nada, certo? Que tal desenharmos na tela o que foi recuperado? Antes de mais nada, adicione isto ao evento Create: Cdigo:
grid = ds_grid_create(0,0);

Agora, adicione um Evento Draw, e coloque este cdigo: Cdigo:


if ds_grid_height(grid) > 0 { for(i=0;i<ds_grid_height(grid)-1;i+=1){ saida = ds_grid_get(grid,0,i) + ' - ' + ds_grid_get(grid,1,i) draw_text(x,y+(i*20), saida) } }

Agora sim. Coloque o objeto numa room, e ao rodar, pressione Enter. O resultado ser esse:

Bem, logo de cara, j vimos que poderia ser complexo demais fazer isso, e eu tenho

certeza que voc agora est com milhes de duvidas. Estas sero sanadas, mas uma coisa precisa ser dita: Estas Lies so para dar uma idia de como fazer. Voc no obrigado a seguilas. O que eu quero com elas que voc aprenda, e descubra cada vez mais sobre este mundo maravilhoso que a programao. Por hoje s. Criamos o BD, adicionamos scripts, fizemos uma consulta simples. Na prxima lio eu detalharei os scripts a respeito de suas funcionalidades, mostrarei como faremos para manter os dados constantes que precisamos durante a execuo do jogo e como associar os mesmos. Um pouco de matemtica para quando nosso heri evoluir e por fim, a exibio dos dados num menu. Ah sim, para baixar os arquivos necessrios para esta aula clique Aqui At l.[b]