conhecendo os scripts do rpg maker xp
Transcrição
conhecendo os scripts do rpg maker xp
DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Tutorial RPG Maker XP Tutorial RPG Maker XP Por Marcelo Cavaco ([email protected]) Conhecendo os Scripts Conhecendo os Scripts 1 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Considera÷‰es Iniciais Devido à falta de tutoriais a respeito desta ferramenta de criação de jogos, decidi aplicar um pouco de meu tempo e o meu pequeno conhecimento do assunto para mudar este quadro. Estou fazendo isso por vontade própria e com o intuito de ajudar. Espero conseguir neste tutorial... Por favor, me avisem se existirem erros (podem existir erros de português, sobre o RPG Maker XP, erros de tradução ou qualquer coisa). Todos os erros serão corrigidos. Este tutorial não é um guia para solucionar problemas. Se você não consegue executar o aplicativo, não será aqui que seu problema será solucionado. Este tutorial é de nível Avançado. Um bom conhecimento no RPG Maker é necessário para utiliza-lo. O Maker utilizado neste tutorial é uma versão em inglês, mas TODOS os nomes em inglês têm sua tradução entre parênteses. Não conheço nem utilizo versões em português. Não conheço quem traduziu outras versões e podem existir diferenças entre as traduções. Fiz curso de “Inglês Técnico I” e “Inglês Técnico II” e acho que a tradução deve estar razoável e coerente com a realidade, apesar disso, podem ocorrer erros. Por favor, me avisem caso encontrem algum. Não estou aqui querendo afirmar nada sobre nada nem ninguém. Não quero ofender nenhum leitor, ou o visinho, ou o cachorro do visinho, ou o papagaio de qualquer um que seja. Não estou tentando provar nada. Não sou “guru” do RPG Maker XP. Portanto, tenham paciência... E me desculpem por qualquer tipo de transtorno e muito obrigado aos que me ajudaram e incentivaram. Fora isso, boa leitura... 2 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Agradecimentos Creio que sem ajuda ninguém é nada... Mesmo os seres mais arrogantes da face da terra, que negam receber qualquer forma de ajuda, um dia tiveram que receber a ajuda de alguém. Mesmo que esta tenha sido há muito tempo atrás quando o médico ajudou esta pessoa a nascer... Mas vamos parar de enrolar e vamos ao que interessa. Agradeço à: Minha família, por me criar e aturar... Meus amigos de RPG, por jogarem comigo... Colegas de RPG Maker XP, por tirarem muitas de minhas dúvidas... Aos que me ajudaram neste tutorial, demonstro aqui minha gratidão, agradecendo à: phylomortis.com pela excelente pagina da internet sobre o tema; Se faltar alguém, faça o favor de me avisar. A memória às vezes (várias vezes) falha... 3 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Sum–rio Tutorial RPG Maker XP 1 Considerações Iniciais 2 Agradecimentos 3 Sumário 4 Como Utilizar este Tutorial 9 Começando 10 Introdução 10 O Editor de Scripts 11 Lógica de Programação 16 Introdução 16 Lógica 16 Seqüência Lógica 16 Instruções ou Expressões 17 Algoritimo 18 Diagrama de Bloco 19 Operadores Relacionais 20 Operadores Lógicos 22 Operações Lógicas 24 SE ... SENÃO / IF ... ELSE 26 Enquanto ou Até que x, Processar (While ou Loop) 27 A Lógica 28 4 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE A Sintaxe do Ruby 30 Sintaxe e Expressões 31 Identificadores / Variáveis 31 Comentários 31 Palavras Reservadas 32 Expressões 33 Variáveis e Constantes 34 Variáveis Globais 34 Variáveis de Instância 35 Variáveis Locais 35 Constantes 36 Pseudo Variáveis 37 Expressões Literais 38 Números Literais 38 Strings Literais 39 Notações de barra invertida Expression Substitution Array’s 39 40 41 Hash 42 Expressões de Range (Faixa) 42 Symbols 43 Operadores RGSS 44 Operadores de redefinição (métodos) 45 Operadores sem redefinição (controle de estruturas) 45 And (e) 46 Or (ou) 46 Not (negação) 47 (?) Operador Condicinal 47 Controle Estrutural Condições IF if (Outra opção) unless unless (Outra opção) case 48 48 48 49 50 50 51 5 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Repetições 52 while while (Outra opção) until until (Outra opção) for break next Method Exit (Método de Saída) 52 53 53 54 54 55 56 57 Return 57 Definindo Classes e Métodos 58 Definição de Classes (Class) 58 Definição de Módulos (Module) 60 Definição de Métodos (Method) 61 Operações de Definição (Definition Operations) 63 alias (aliás) Scripts RGSS Standard Listagem de Scripts RGSS Padrão 63 64 64 Arrow_Actor 65 Arrow_Base 65 Arrow_Enemy 65 Game_Actor 65 Game_Actors 65 Game_BattleAction 65 Game_Battler 66 Game_Character 66 Game_CommonEvent 66 Game_Enemy 66 Game_Event 66 Game_Map 67 Game_Party 67 Game_Picture 67 Game_Player 67 Game_Screen 67 Game_SelfSwitches 68 Game_Switches 68 Game_System 68 Game_Troop 68 Game_Variables 68 6 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Interpreter 69 Scene_Battle 69 Scene_Debug 69 Scene_End 69 Scene_Equip 69 Scene_File 70 Scene_Gameover 70 Scene_Item 70 Scene_Load 70 Scene_Map 70 Scene_Menu 71 Scene_Name 71 Scene_Save 71 Scene_Shop 71 Scene_Skill 71 Scene_Status 71 Scene_Title 72 Sprite_Battler 72 Sprite_Character 72 Sprite_Picture 72 Sprite_Timer 72 Spriteset_Battle 72 Spriteset_Map 73 Window_Base 73 Window_BattleResult 73 Window_BattleStatus 73 Window_Command 73 Window_DebugLeft 74 Window_DebugRight 74 Window_Gold 74 Window_Help 74 Window_InputNumber 74 Window_Item 75 Window_MenuStatus 75 Window_Message 75 Window_NameEdit 75 Window_NameInput 75 Window_PartyCommand 75 Window_PlayTime 76 Window_SaveFile 76 Window_Selectable 76 7 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_ShopBuy 76 Window_ShopCommand 76 Window_ShopNumber 76 Window_ShopSell 77 Window_ShopStatus 77 Window_Skill 77 Window_SkillStatus 77 Window_Status 77 Window_Steps 77 Window_Target 78 Entendendo as Classes e Métodos 79 Introdução 79 Orientação a Obejtos 79 Criando um Script 84 Introdução 84 Scene_Tutorial 84 O Editor de Scripts 84 Planejando da Cena 87 Entendendo As Classes 88 class Window_TutorialCommand class Window_Tela1 class Window_Tela2 class Scene_Tutorial O Código do Script 88 89 90 91 92 Testando o Script Conclusão 101 105 8 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Como Utilizar este Tutorial Para aproveitar da melhor forma possível este tutorial, devemos saber para que ele serve. Este documento é onde estaremos vendo diversos recursos dos scripts RGSS do RPG Maker XP. Existem imagens de telas onde setas e círculos vermelhos indicam pontos importantes. Estas setas e círculos vermelhos não são parte da tela e não aparecem no aplicativo. Elas foram adicionadas neste tutorial apenas com o objetivo de auxiliar o leitor a localizar pontos importantes na tela. Este tutorial é de nível avançado. Só é aconselhável à leitura deste tutorial após se certificar de que já conhece completamente os recursos do RPG Maker, além de noções de lógica de programação, estruturação de dados e orientação a objetos. Após a leitura deste documento, podemos passar para o próximo tutorial da série chamado “Scripts Avançados no RPG Maker XP”. Podem vir a surgir novos tutoriais, sendo que a lista pode aumentar... Só o tempo dirá o que está por vir... 9 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Come÷ando Introdução Uma pesquisa realizada em setembro de 2003 pela gamedev.net (um importante site para programadores de jogos) revelou que a grande maioria dos jogos (72%) é desenvolvida com o auxílio de uma linguagem de script. Embora as linguagens de script não sejam definidas muito precisamente, elas apresentam um conjunto de características comuns típicas. Em geral, as linguagens de script são linguagens interpretadas, têm “tipagem” dinâmica, gerência automática de memória, e fornecem facilidades para construção de estruturas de dados dinâmicas e manipulação de cadeias de caracteres. Tipicamente, essas linguagens funcionam acopladas a programas hospedeiros implementados em linguagens compiladas tradicionais como C e C++ (No caso do RPG Maker XP o Ruby). Uma outra característica importante de linguagens de script é que elas devem ser seguras, não sendo possível acessar serviços não autorizados do programa hospedeiro. A combinação dessas características resulta numa excelente ferramenta para o desenvolvimento de jogos. Acoplar uma linguagem de script em um jogo traz vários benefícios. A linguagem de script pode ser usada para efetivamente implementar o script do jogo, para definir objetos e seus comportamentos, para gerenciar os algoritimos de inteligência artificial e controlar os personagens, e ainda para tratar os eventos de entrada e descrever a interface com o usuário. Uma linguagem de script também desempenha um papel importante nas etapas de prototipação, teste, depuração e análise de adequação do jogo. A escolha de uma linguagem de script simples permite ainda que seja dado a roteiristas e artistas acesso programável ao jogo, a fim de que eles que possam experimentar novas idéias e variações. Esses profissionais conduzem a maior parte do desenvolvimento real do jogo, mas não são em geral programadores profissionais e não estão familiarizados com técnicas sofisticadas de programação. 10 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE O Editor de Scripts Para começarmos a criar scripts em nosso projeto, devemos conhecer o editor de scripts. Além disso, é bastante recomendável um conhecimento básico de lógica de programação e orientação a objetos. Agora, vamos fazer uma rápida análise da tela do editor de scripts do RPG Maker XP e logo depois vamos conhecer um pouco de lógica. Com o projeto aberto, podemos abrir o editor de scripts de diversas formas. Podemos utilizar a tecla de atalho “F11”, ou podemos clicar no ícone da barra de ferramentas, ou ir pelo menu “Tools/Script Editor” (“Ferramentas/Editor de Scripts”). Observe a figura 01. Figura 01 Abrindo a tela do editor de scripts. 11 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Na tela que se abrirá podemos ver que já existem vários scripts prontos. Observe a figura 02. Figura 02 Tela do editor de scripts. 12 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Note que na tela do editor de scripts as expressões e códigos aparecem em diversas cores. Cada cor representa um tipo de texto. Isso é extremamente útil para facilitar o entendimento dos scripts. As cores são: • Azul: O azul é utlizado representar as palavras reservadas do RGSS, ou simplesmente sintaxe do RGSS, como o def, class, end, when, if, case, dentre outros. • Vermelho: O vermelho representa números literais nas expressões e códigos, como 1, 2, 3, 5, dentre outros. • Azul Claro: O azul mais claro representa operadores e operandos em seu código. Como =,||, + , * , dentre outros. Além disso, representa operadores condicionais, parenteses e colchetes. • Verde: O verde representa os comentários. Os comentários não são interpretados pelo RPG Maker e são ignorados. • Roxo: O roxo representa uma cadeia de caracteres ou elementos do texto (String) em seu código. 13 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE O editor de Scripts do RPG maker XP possui busca de texto, comando para substituir um texto por outro e busca por linhas. Todos este comandos podem ser acessados por teclas de atalho. Vejamos a lista de comandos e suas respectivas teclas de atalho: Cut (Recortar) : Ctrl+X Copy (Copiar) : Ctrl+C Paste (Colar) : Ctrl+V Undo (Voltar) : Ctrl+Z Find (Procurar) : Ctrl+F Replace (Subistiruir) : Ctrl+H Jump (pular para a linha) : Ctrl+G Zoom IN/OUT (Aumentar/Diminuir) : Ctrl+botão do meio do mouse Estas opções podem ainda ser acessadas através de um menu pop up que é apresentado quando clicamos com o botão direito do mouse na tela principal do editor. Observe a figura 03. Figura 03 Menu pop up da tela principal do editor de scripts. 14 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE No lado esquerdo da tela existe uma listagem com todos os scripts de nosso projeto. Esta listagem também possui comandos específicos. Todos este comandos podem ser acessados por teclas de atalho. Vejamos a lista de comandos e suas respectivas teclas de atalho: Cut (Recortar) : Ctrl+X Copy (Copiar) : Ctrl+C Paste (Colar) : Ctrl+V Undo (Voltar) : Ctrl+Z Insert (Adicionar) : Ins Delete (Excluir) : Del Searsh All (Busca Total) : Control+Shft+F Estas opções podem ainda ser acessadas através de um menu pop up que é apresentado quando clicamos com o botão direito do mouse na listagem de scripts do editor. Observe a figura 04. Figura 04 Menu pop up da listagem de scripts. Como foi dito anteriormente muitas pessoas conduzem a maior parte do desenvolvimento real do jogo através de scripts, mas não são em geral programadores profissionais e não estão familiarizados com técnicas sofisticadas de programação. Portanto vamos conhecer um pouco mais sobre lógica de programação antes de continuar. 15 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE L‡gica de Programa÷‘o Introdução Antes de começar a mexer no editor visto no capítulo anterior, vamos aprender um pouco de lógica de programação e algoritimos. Isso pode parecer desnecessário, mas para a criação de um bom código (e sem lag’s) é necessário saber programar corretamente. Veremos alguns segredos de lógica de programação nos próximos capítulos. Lógica A lógica de programação é necessária para pessoas que desejam trabalhar com desenvolvimento de sistemas e programas (incluindo jogos), ela permite definir a seqüência lógica para o desenvolvimento. Então o que é lógica? Lógica de programação é a técnica de encadear pensamentos para atingir determinado objetivo. Seqüência Lógica Estes pensamentos podem ser descritos como uma seqüência de instruções, que devem ser seguidas para se cumprir uma determinada tarefa. Seqüência Lógica são passos executados até atingir um objetivo ou solução de um problema. 16 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Instruções ou Expressões Na linguagem comum, entende-se por instruções ou expressões “um conjunto de regras ou normas definidas para a realização ou emprego de algo”. Em informática, porém, instrução é a informação que indica a um computador uma ação elementar a executar. Convém ressaltar que uma ordem isolada não permite realizar o processo completo, para isso é necessário um conjunto de instruções colocadas em ordem seqüencial lógica. Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prática uma série de instruções: descascar as batatas, bater os ovos, fritar as batatas, etc... É evidente que essas instruções tem que ser executadas em uma ordem adequada (não se pode descascar as batatas depois de fritá-las). Dessa maneira, uma instrução tomada em separado não tem muito sentido. Para obtermos o resultado esperado, precisamos colocar em prática o conjunto de todas as instruções, na ordem correta. Instruções são um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma ação elementar a executar. Nos scripts, trabalharemos com muitas instruções e expressões que juntas e em uma determinada ordem, darão forma ao nosso jogo. 17 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Algoritimo Um algoritimo é formalmente uma seqüência finita de passos que levam a execução de uma tarefa. Podemos pensar em algoritimo como uma receita, uma seqüência de instruções que dão cabo de uma meta específica. Estas tarefas não podem ser redundantes nem subjetivas na sua definição, devem ser claras e precisas. Como exemplos de algoritimos podemos citar os algoritimos das operações básicas (adição, multiplicação, divisão e subtração) de números reais decimais. Outros exemplos seriam os manuais de aparelhos eletrônicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar uma imagem ou filme. Até mesmo as coisas mais simples, podem ser descritas por seqüências lógicas. Por exemplo: “Chupar uma bala”. 1. Pegar a bala; 2. Retirar o papel; 3. Chupar a bala; 4. Jogar o papel no lixo; Isso é um algoritimo. De forma genérica, podemos dizer que algoritimo são as expressões de scripts em sua forma bruta. Seria o código resumido e sem “sintaxe”, possuindo apenas a lógica. 18 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Diagrama de Bloco O diagrama de blocos é uma forma padronizada e eficaz para representar os passos lógicos de um determinado processamento ou algoritimo. Com o diagrama podemos definir uma seqüência de símbolos, com significado bem definido, portanto, sua principal função é a de facilitar a visualização dos passos de um algoritimo. Os blocos mais comuns são: Veja que no exemplo da bala seguimos uma seqüência lógica com informações diretas. 19 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Operadores Relacionais Os operadores relacionais são utilizados para comparar string de caracteres e números. Os valores a serem comparados podem ser caracteres ou variáveis. Estes operadores sempre retornam valores lógicos (verdadeiro ou falso / true ou false). Para estabelecer prioridades no que diz respeito a qual operação executar primeiro, utilize os parênteses. Os operadores relacionais são: Exemplo: Tendo duas variáveis A = 5 e B = 3, os resultados das expressões seriam: 20 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE O símbolo utilizado para comparação entre expressões seria: Veremos mais exemplos de como utilizar este símbolo mais a diante. 21 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Operadores Lógicos Os operadores lógicos servem para combinar resultados de expressões, retornando se o resultado final é verdadeiro ou falso. Os operadores lógicos são: E / AND Æ Uma expressão AND (E) é verdadeira se todas as condições forem verdadeiras OU / OR Æ Uma expressão OR (OU) é verdadeira se pelo menos uma condição for verdadeira NOT Æ Uma expressão NOT (NÃO) inverte o valor da expressão ou condição, se verdadeira inverte para falsa e vice-versa. A tabela abaixo mostra todos os valores possíveis criados pelos três operadores lógicos (AND, OR e NOT). 22 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Exemplo 1: Suponha que temos três variáveis A = 5, B = 8 e C =1. Os resultados das expressões seriam: Exemplo 2: Tendo as variáveis SALARIO, IR e SALLIQ, e considerando os valores abaixo. Informe se as expressões são verdadeiras ou falsas. Verdadeiro Falso Verdadeiro 23 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Operações Lógicas Operações Lógicas são utilizadas quando se torna necessário tomar decisões em um diagrama de bloco. Num diagrama de bloco, toda decisão terá sempre como resposta o resultado VERDADEIRO ou FALSO. Como no exemplo do algoritimo “CHUPAR UMA BALA”. Imaginemos que algumas pessoas não gostem de chupar bala de morango, neste caso teremos que modificar o algoritimo para: 1. Pegar a bala; 2. A bala é de morango? • Se sim, não chupe a bala; • Se não, continue com o algoritimo; 3. Retirar o papel; 4. Chupar a bala; 5. Jogar o papel no lixo; 24 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Exemplo: Algoritimo “Chupar Bala” utilizando diagrama de Blocos. Note que desta vez utilizamos o símbolo para comparação entre expressões. 25 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE SE ... SENÃO / IF ... ELSE Os comandos de decisão ou desvio fazem parte das técnicas de programação que conduzem a estruturas de programas que não são totalmente seqüenciais. Com as instruções de SALTO ou DESVIO pode-se fazer com que o programa proceda de uma forma ou de outra, de acordo com as decisões lógicas tomadas em função dos dados ou resultados anteriores. As principais estruturas de decisão são: “Se” e “Se / Senão. Exemplo 1: SE MÉDIA < 5.0 ENTÃO ALUNO REPROVADO FIMSE Exemplo 2: SE MÉDIA >= 5.0 ENTÃO ALUNO APROVADO SENÃO ALUNO REPROVADO FIMSE Em diagrama, as expressões do exemplo 2 ficariam organizadas assim: 26 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Enquanto ou Até que x, Processar (While ou Loop) Neste caso, o bloco de operações será executado enquanto a condição x for verdadeira. O teste da condição será sempre realizado no inicio, ou no fim da repetição, dependendo do comando utilizado e da linguagem de programação utilizada. Enquanto a condição for verdadeira o processo se repete. Podemos utilizar essa estrutura para trabalharmos com contadores. Em diagrama de bloco a estrutura é a seguinte: 27 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE A Lógica Expressões SE e ENQUANTO sempre usarão operadores lógicos. A lógica de programação deve ser desenvolvida com estes operadores de forma bem estruturada, para assim, criarmos programas menores e mais rápidos. Vamos ver um exemplo de algoritimo utilizando os conceitos de lógica que vimos anteriormente. Exemplo (Média de Notas): PROGRAMA MEDIA_FINAL VARIÁVEL NOTA1, NOTA2, NOTA3, NOTA4, MEDIA VARIÁVEL NOME = “” INICIO LER (NOME) LER (NOTA1, NOTA2, NOTA3, NOTA4) MEDIA := (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4 SE MEDIA>=6 ENTÃO ESCREVER (‘APROVADO!’) SENÃO ESCREVER (‘REPROVADO!’) FIM DO SE ESCREVER (NOME, MEDIA) FIM. Este algoritimo é um bom exercício de lógica, mas ainda podemos transformá-lo em uma estrutura de blocos. 28 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Agora, vejamos um exemplo de bloco estruturado. Exemplo (Média de Notas): Inicio Ler Nome Ler Nota 1 Ler Nota 2 Ler Nota 3 Ler Nota 4 MEDIA := (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4 Média >= 6.0 ???? sim Escreva Aprovado não Escreva Reprovado Escreva Nome e Média Fim 29 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE A Sintaxe do Ruby Quando você tiver certeza de que conhece algoritimo e lógica de programação, está na hora de passar para o estudo de uma linguagem de programação. Estaremos agora vendo os detalhes da linguagem Ruby, principalmente a parte relacionada com RGSS. Os scripts RGSS se baseiam numa linguagem de programação chamada Ruby. A sigla RGSS significa “Ruby Game Scripting System”, que pode ser traduzida como “Sistema de Script de Jogo Ruby”. Como podemos ver, os scripts são uma extensão ou “pseudópode” do Ruby. Ruby é uma linguagem que trata sua sintaxe de forma “case-sensitive”. O que seria uma linguagem case_sensitive? É uma linguagem que diferencia as letras maiúsculas das minúsculas, ou seja, se você digitar algo minúsculo e depois for usar, lembre-se de que deve digitar minúsculo novamente. Exemplo: Se você criar uma variável chamada “vida_do_heroi” e, mais tarde, se você digitar “Vida_do_Heroi” vai ocorrer um erro, pois estas duas variáveis são totalmente diferentes para o Ruby. Variáveis, identificadores, sintaxe, espaços em branco e comentários podem ser colocadas em qualquer lugar da tela destinada aos scripts. Outra característica peculiar é que as expressões não precisam ser escritas numa mesma linha, ou seja, podemos criar comandos em duas ou mais linhas. Utilizando este recurso sabiamente, o código pode ficar mais limpo e fácil de entender. Nos próximos capítulos veremos a sintaxe e expressões básicas dos Scripts RGSS. Será mostrado um resumo dos principais comandos e alguns exemplos. Qualquer semelhança com o arquivo de ajuda do RPG Maker XP não é uma mera coincidência. Os próximos capítulos foram realmente baseados nos arquivos de ajuda do RPG Maker, portanto, se quiser mais detalhes sobre algo, basta abrir o Help (Ajuda) do aplicativo. 30 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Sintaxe e Expressões Identificadores / Variáveis Um identificador ou variável Ruby deve começar por um caractere alfanumérico ou o símbolo underscore (_). Não há limite de tamanho, contanto que sejam utilizados apenas caracteres alfanuméricos ou o símbolo underscore (_). Exemplos: ruby_simples vida_do_heroi É aconselhável declarar as variáveis apenas com letras minúsculas. Não que seja errado usar maiúsculas, mas é força do costume de muitos programadores. Comentários Qualquer coisa que comece com um sustenido (#) é considerado como um comentário. Os comentários servem para escrevermos lembretes, dar dicas para outros programadores que foram ler nosso código, impedir que uma linha seja executada (sem apagá-la), dentre outros... Exemplos: # esta é uma linha de comentário # vida_do_herói = 500 # vida_do_herói = 1000 Os comentários não são executados nem interpretados pelo aplicativo e aparecem no editor de scripts com uma coloração esverdeada. 31 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Palavras Reservadas As palavras reservadas são palavras que fazem parte da sintaxe básica do Ruby. Estas palavras não podem ser usadas como variáveis ou nomes de classe, ou algo semelhante. Estas palavras foram reservadas para uso exclusivo do Ruby, mas se for utilizado o prefixo '$' ou '@' elas não são consideradas reservadas. As palavras reservadas, quando usadas, farão apenas o que elas foram programadas para fazer. Não adianta querer tentar criar uma variável utilizando o nome de uma palavra reservada. No editor de scripts, estas palavras sempre aparecem com a coloração azulada. As palavras reservadas são: BEGIN not and undef return class super do break until ensure while if elsif nil alias redo module self defined? true retry when for begin unless END or else case def then in end false yield rescue next Estas são as palavras reservadas encontradas no RGSS do RPG Maker XP. 32 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Expressões O termo expressões serve para tudo aquilo formado por variáveis e comandos literais (números, textos, dentre outros) incluindo operações, controle de estruturas, chamada de métodos, classes, cálculos, mudança de valor de variáveis. Tudo isso é considerado como uma expressão. Uma coleção de expressões é considerada como um programa. Expressões podem ser separadas umas das outras pelo símbolo de ponto e virgula (;) ou por quebras de linha ([Enter]). Uma expressão pode utilizar várias linhas, bastando pressionar a tecla [Enter] e continuar na linha seguinte. As expressões, ainda podem ser agrupadas com parênteses. Expressões agrupadas são efetuadas antes do resto da expressão. Exemplos: true (1+2)*3 Actor() if teste then ok else erro end 33 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Variáveis e Constantes Variáveis são ponteiros para áreas da memória, onde podem ser armazenados valores. Variáveis e constantes são exatamente a mesma coisa dentro do Ruby. Elas têm a mesma característica e funcionam da mesma forma. A única diferença é que as constantes são como variáveis que não devem ter seu valor modificado. Então, como saberemos como diferenciar uma variável de uma constante, já que elas funcionam de forma igual? Neste caso costuma-se criar variáveis apenas com letras minúsculas e as constantes com letras maiúsculas. O caractere inicial de uma variável define o seu tipo (variável global, variável de instância, variável local). Normalmente uma variável é um nome alfanumérico, exceto pelo primeiro caractere que pode ser de outro tipo e ainda pode ter underscore (_). Muitas variáveis built-in começam com '$' + um caractere (veja Variáveis Built-In). Variáveis e constantes apontam para um objeto específico. Adicionar valor a uma variável, nada mais é do que criar novos ponteiros para novos objetos. Isso não cria novos objetos. Em Ruby, tudo são objetos, pois ela é uma linguagem orientada a obejtos. Variáveis Globais Variáveis que possuam o prefixo '$' são variáveis globais e podem ser referenciadas de qualquer parte do programa. Este tipo de variável não necessita ser declarado. Quando referenciado, o valor das variáveis globais não iniciadas equivale a nil. Exemplo: $actor 34 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Variáveis de Instância Variáveis que começam com o prefixo '@' são variáveis de instância. As variáveis de instância são variáveis que podem ser acessadas por qualquer método de sua classe ou sub-classe. Estas variáveis não podem ser acessadas por outras classes diretamente. Quando referenciado, o valor das variáveis de instância não iniciadas equivale a nil. Exemplo: @actor Variáveis Locais As variáveis locais e identificadores começam com caracteres alfanuméricos minúsculos ou com o símbolo '_' (underscore). Este tipo de variável só pode ser usado ou acessado no método onde foi criado. O escopo de variáveis locais se estende entre outras estruturas como as classes, modules e definições de métodos (def). Neste caso, uma classe, por exemplo, é considerada como uma variável local. Quando referenciado, o valor das variáveis locais não iniciadas equivale a uma chamada de método sem nenhum argumento. Caso não exista um método de mesmo nome, um erro é gerado. Exemplo: actor 35 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Constantes Identificadores ou “variáveis” com letra maiúscula são constantes. A definição e iniciação dependem da aplicação. Constantes não podem ser definidas como métodos. Acesso a constantes não iniciadas gera um erro de exceção conhecido como “NameError”. Exemplo: ACTOR Uma constante criada numa classe pode ser referenciada por classes e módulos herdados. Para acessar as constantes externamente utiliza o operador '::'. Exemplos: class Actors ACTOR1 = 'Arshes' ACTOR2 = 'Teste de Constante' end class Ator < Actors heroi1 = ACTOR1 # heroi1 = "Arshes" heroi2 = ACTOR2 # heroi2 = "Teste de Constante" end heroi1 = Actors::ACTOR1 # heroi1 = "Arshes" heroi2 = Actors::ACTOR2 # heroi2 = "Teste de Constante" 36 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Pseudo Variáveis Aparte das variáveis comuns existe um tipo especial de variável que são conhecidas como Pseudo Variáveis. O valor destas variáveis não pode ser modificado. Ao tentar adicionar algum valor a uma variável deste tipo ocorrerá um erro de sintaxe. As Pseudo Variáveis são: self Constituído pelo método ou classe atual. nil Instância do NilClass class. Significa nulo. Quando algo não foi iniciado. true Instância do TrueClass class. Significa verdadeiro. false Instância do FalseClass class. Significa falso. 37 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Expressões Literais Em programas Ruby, os valores podem ser expressos diretamente, seja ele o valor 1 ou a string “Olá mundo!”, são conhecidos como expressões literais. Números Literais Números literais podem usar o símbolo underscore (_). O interpretador Ruby ignora estes símbolos. Isso é bastante útil quando usado como separador em grandes números. Contudo, se este símbolo for usado após um número literal, vai ocorrer um erro. 1_000_000_000 # => 1000000000 0xffff_ffff # => 0xffffffff Os tipos de números literais são: 123 ou 0d123 é um número inteiro decimal. -123 é um número inteiro (com sinal). 123.45 é um número com ponto flutuante. Número com ponto flutuante que iniciem com o ponto não são considerados pelo interpretador do Ruby. Eles devem ser escritos com 0 (zero) na frente (exemplo : 0.1). 1.2e-3 é um número com ponto flutuante. 0xffff é um número inteiro hexadecimal. 0b1011 é um número binário inteiro. 0377 ou 0o377 é um número octogonal inteiro. 38 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Strings Literais Expressões com uma cadeia de caracteres são conhecidas como Strings. Existem duas formas de se criar uma string (cadeia de caracteres). São elas: "Esta é uma string\n" 'Esta também é uma string' Note que podemos utilizar a aspas simples ou aspas dupla. As aspas duplas permitem que sejam usados comandos extras como notações de “barra invertida” e “substituição de expressões”. As aspas simples não podem conter nenhuma destas opções (exceto por \' and \\). Strings com um espaço em branco entre si são tratadas como uma única string. Exemplo: texto = "test" "ando" # texto = "testando" Notações de barra invertida \t equivale a um “tab” (0x09) \n equivale a um “newline” (0x0a) (nova linha) \r equivale a um “carriage return” (0x0d) (retorno de carro, ou seja, inicio de linha) \f equivale a um “form feed” (0x0c) \s equivale a um “whitespace” (0x20) (espaço em branco) \nnn equivale a um “caractere em valor octogonal nnn” (n = 0-7) \xnn equivale a um “caractere em valor hexagonal nn” (n = 0-9, a-f) 39 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Expression Substitution Em strings com aspas dupla e em expressões regulares, o termo "#{expressão}" é usado num contexto de substituição. Em expressões com variáveis começando com $ ou com @ a expreção é substituída pelo valor da variável. Se quiser evitar que o Ruby tente efetuar uma substituição, adicione uma barra invertida na frente da expressão. Exemplos: $variavel = "RUBY" nome = "meu nome é #{$variavel}" # nome = "meu nome é RUBY" nome = "meu nome é \#{$variavel}" # nome = "meu nome é #{$variavel}" Lembra-se de que as strings com aspas simples não interpretam os comandos extras. nome = 'meu nome é #{$variavel}' # nome = "meu nome é #{$variavel}" 40 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Array’s Objeto que retorna um vetor contendo o resultado de cada expressão. Array é uma instância da classe Array. O valor inicial de um array em Ruby é 0 (zero). Exemplo: [1, 2, 3] Syntaxe: '[' expr ',' ... ']' Suponha que você tenha o seguinte array: ary = [0, 1, 2, 3] Se quisermos adicionar os valores "a", "b", "c" removendo o se gundo e o terceiro valor do array, podemos usar a seguinte expressão: ary[1, 2] = ["a", "b", "c"] vetor = ary # vetor = [0, "a", "b", "c", 3] Para adicionarmos o valor 99 removendo o valor “b”, podemos usar a seguinte expressão: ary[2, 1] = 99 vetor = ary # vetor = [0, "a", 99, "c", 3] Para inserirmos o valor “xyz” sem remover nenhum valor, podemos usar a seguinte expressão: ary[1, 0] = ["xyz"] vetor = ary # vetor = [0, "xyz", "a", 99, "c", 3] a = [1, 2] b = [8, 9] c=a+b # c = [1, 2, 8, 9] pa # => [1, 2] (sem mudanças) pb # => [8, 9] (sem mudanças aqui também) 41 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Hash Retorna um objeto do tipo Hash que mapeia cada valor resultante em uma chave. Hash é uma instância da classe Hash. Podemos dizer, de forma muito grosseira, que um Hash é um conjunto de vários vetores dentro de outro vetor. Exemplo: {1=>2, 2=>4, 3=>6} Syntaxe: '{' expr '=>' expr ',' ... '}' '{' expr ',' expr ',' ... '}' Expressões de Range (Faixa) Se uma expressão de faixa aparecer numa expressão de condição, retornará o objeto range da expressão 1 até a expressão 2. Os objetos do tipo range são instâncias da classe Range. Objetos do tipo Range são separados pelo operador ‘..’ Exemplo 1: 1 .. 20 Exemplo 2: for i in 0...10 #faz qualquer coisa end Syntaxe: expr1 '..' expr2 expr1 '...' expr2 42 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Symbols Retorna o símbolo correspondente a uma string. Objetos Symbols são instâncias da classe Symbol. Estes são os únicos objetos que retornam o mesmo objeto sempre que são chamados. Exemplo: :class :lvar :method :$gvar :@ivar :+ Syntaxe: ':' identifier ':' variable name ':' operator 43 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Operadores RGSS Com os operadores iremos efetuar nossos cálculos, operações de comparação, mudança de valores, dentre outros... Os operadores podem ser usados em expressões literais e em conjunto com outros comandos e/ou operadores. Os operadores têm uma determinada prioridade de execução. As operações podem ser agrupadas com parênteses para mudar a ordem de prioridade de execução dos operadores Exemplo: 1+2*3/4 A linguagem de programação Ruby possui os seguintes operadores: Alto :: [] ** -(unary) +(unary) ! ~ * / % + << >> & | ^ > >= < <= <=> == === != =~ !~ && || .. ... ?:(conditional operator) =(+=, -= ... ) not Baixo and or 44 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE O “Alto” e “Baixo” define o nível de prioridade e, conseqüentemente, execução dos operadores. Por exemplo, "&&" tem prioridade maior que "||", então ele é interpretado da seguinte forma: a && b || c # => (a && b) || c a || b && c # => a || (b && c) Operadores de redefinição (métodos) Operadores de redefinição, quando usados, alteram o valor da expressão ou do comando de comparação em questão. Os valores são modificados e armazenados (temporariamente ou não). +@ e -@ representa o mesmo que os operadores + and -. Suponha que você tenha uma variável “a” com o valor 1 e a variável “b” com o valor 2. Se você criar a expressão a = b, a variável “a” terá seu valor redefinido para 2. Os operadores de redefinição: | ^ & <=> == === =~ > + - * / % ** ~ >= < <= << >> +@ -@ [] []= ` A atribuição de valor pode ser feita diretamente, a si mesmo ou através de uma atribuição múltipla. Veremos várias expressões com diversas formas de atribuição mais adiante. Operadores sem redefinição (controle de estruturas) São os operadores que não alteram os valores das expressões, portanto só servem para serem usados em determinados tipos de expressões. Combinação de operadores de redefinição com os operadores sem redefinição criam operadores sem redefinição. Como exemplo, temos: (!=) ou (!~). Os operadores sem redefinição: = ?: .. ... ! not && and || or :: 45 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE And (e) Este operador avalia primeiramente o lado esquerdo da expressão, se o resultado for verdadeiro, avalia o lado direito. Tem a mesma função que && e é um operador de baixa prioridade. Exemplo: teste && set teste and set Sintaxe: expr '&&' expr expr and expr Or (ou) Este operador avalia primeiramente o lado esquerdo da expressão, se o resultado for verdadeiro, avalia o lado direito. Tem a mesma função que || e é um operador de baixa prioridade. Exemplo: vida || morte vida or morte Sintaxe: expr '||' expr expr or expr 46 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Not (negação) Se o valor da expressão for “True”, retorna “False”, se o valor da expressão for “False”, retorna “True”. Este operador funciona como uma negação comum. Exemplo: ! teste not teste t != teste Sintaxe: '!' expr not expr (?) Operador Condicinal Retorna expr2 ou expr3 dependendo do resultado da expr1. O seu funcionamento é idêntico a: if expr1 then expr2 else expr3 end Exemplo: teste == 1 ? teste1 : teste2 Sintaxe: expr1 ? expr2 : expr3 47 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Controle Estrutural Ao contrário do que acontece na linguagem C, as estruturas do controle no Ruby são expressões que retornam valor. Expressões de controle estrutural são formadas pelos comandos que definem o funcionamento básico de seu código. Estes controles podem conter If’s, Case, Loop’s, Exception, dentre outros... Condições IF if --- then --- elsif --- else --- end Se uma expressão condicional for avaliada como verdadeira, executa a expressão do then. Cláusulas múltiplas de elsif podem ser especificadas. Quando todas as clausulas If e Elsif forem falsas, a expressão else, caso exista, é executado. If retorna o valor da última expressão avaliada na cláusula da expressão condicional (ou na cláusula else). Se não houver nenhuma cláusula else e nenhuma expressão condicional for verdadeira, retorna nil. Valores falsos e o nil são false. Tudo mais, incluindo cadeia de caracteres vazias, é verdadeiro. Exemplo 1: if age <= 1 then print "Recem nascido\n" elsif age <= 12 then print "Criança\n" elsif age <= 18 then print "Adolescente\n" else print "Adulto\n" end 48 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE exemplo 2: sexo = if actor.sexo == "M" then "masculino" else "feminino" end Sintaxe: if expr [then] expr ... [elsif expr [then] expr ... ] ... [else expr ... ] end if (Outra opção) Avalia e retorna o resultado da expressão à esquerda da clausula If se a expressão da direita for verdadeira. Se a condição não tiver resultado possível, retorna nil. Exemplo: print "debug\n" if $DEBUG Syntax: expr if expr 49 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE unless O comando unless funciona de forma contrária ao if, Se a condição for falsa, avalia a expressão inicial. O comando elsif não pode ser usado com unless. Exemplo: unless tem_filho? compra_cerveja else compra_leite end Sintaxe: unless expr [then] expr ... [else expr ... ] end unless (Outra opção) Avalia e retorna o resultado da expressão da esquerda se a condição da direita for falsa. Se a condição não tiver resultado possível, retorna nil. Exemplo: print "stop\n" unless valid(passwd) Sintaxe: expr unless expr 50 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE case A expressão case funciona através da comparação das clausulas when com a expressão do case. Quando a clausula when comparada com a expressão case retorna true, as expressões do when são executadas. A expressão case retorna a último valor avaliado na clausula when ou na clausula else. Se a condição não tiver resultado possível, retorna nil. Exemplo: case $idade when 0 .. 2 "bêbe" when 3 .. 12 "criança" when 13 .. 18 "adolescente" else "adulto" end Sintaxe: case expr [when expr [, expr] ... [then] expr ..].. [else expr ..] end 51 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Repetições while Executa repetidamente as instruções até que a condição de parada seja alcançada. A expressão while retorna nil. Opcionalmente, podemos fazer uma expressão while retornar um valor ligado à expressão break. Example: ary = [0,2,4,8,16,32,64,128,256,512,1024] i=0 while i < ary.length print ary[i] i += 1 end Syntax: while expr [do] ... end A expressão while afeta o escopo das variáveis locais. 52 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE while (Outra opção) Em alguns casos desejamos executar algo enquanto esperamos que outra coisa aconteça. Neste caso a expressão é executada primeiro e depois é verificada a condição. A expressão while retorna nil. Opcionalmente, podemos fazer uma expressão while retornar um valor ligado à expressão break. Exemplo: sleep(60) while io_not_ready? Sintaxe: expr while expr until Repete várias vezes as expressões até que a condição de parada seja alcançada. until retorna nil. Opcionalmente, podemos fazer uma expressão until retornar um valor ligado à expressão break. Exemplo: until f.eof? print f.gets end Sintaxe: until expr [do] ... end 53 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE until (Outra opção) Em alguns casos desejamos executar algo enquanto esperamos que outra coisa aconteça. Neste caso a expressão é executada primeiro e depois é verificada a condição. A expressão until retorna nil. Opcionalmente, podemos fazer uma expressão until retornar um valor ligado à expressão break. Exemplo: print(f.gets) until f.eof? Sintaxe: expr until expr for A estrutura de repetição for é uma das mais utilizada nos scripts, juntamente com o while. A expressão for retorna o valor do método each para cada objeto especificado no in. Exemplo: for i in [1, 2, 3] print i*2, "\n" end Sintaxe: for lhs ... in expr [do] expr .. end Podemos repetir a execução das expressões de cada objeto de forma semelhante a: (expr).each '{' '|' lhs..'|' expr .. '}' A expressão for não afeta o escopo das variáveis locais. 54 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE break Expressão utilizada quando se deseja sair de uma repetição, incluindo while, until, for e a expressão do tipo iterator. Este comando retorna o valor nil. Se algum argumento for especificado, o retorno será o valor deste argumento. Diferente da linguagem de programação C, a expressão break só pode ser usada em repetições (em C ele pode ser usado em expressões case). Exemplo: i=0 while i < 3 print i, "\n" break end Sintaxe: break [expr] 55 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE next A expressão next pula para a próxima iteração dentro da repetição. Em uma expressão do tipo iterator, o next é uma forma de sair ou terminar a chamada. A expressão next retorna nil. Se algum argumento for especificado, o retorno será o valor deste argumento. Exemplo: str.each_line do |line| next if line.empty? print line end Sintaxe: next [expr] 56 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Method Exit (Método de Saída) return Força a saída de um método retornando o valor especificado. Se dois ou mais valores forem especificados, o método de retorno considera que o valor retornado é um array. Se a expressão de retorno não existir, o valor retornado é nil. Exemplo: return 12 return 1,2,3 Sintaxe: return [expr[',' expr ... ]] 57 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Definindo Classes e Métodos Definição de Classes (Class) Exemplo: class Teste < Super def test : end : end Sintaxe: class identificador ['<' classe_mãe ] expr .. end Este comando define (cria) uma classe. Costuma-se criar nomes de classes com a primeira letra em maiúsculo. A definição de classes ocorre com a associação desta a um identificador que podemos utilizar em nosso código. Em Ruby, classes e objetos são instâncias da classe Class. 58 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Quando uma classe já está definida (criada) ainda é possível criar uma classe com o mesmo nome. Neste caso, a segunda definição de classe terá todo o seu código adicionado na primeira definição. Exemplo: class Teste < Array def tentando end end class Teste def outro_teste end end Numa definição de classe, o identificador self refere-se a esta classe. A definição de classes funciona inteiramente sobre o modelo de orientação a objetos. Isto inclui relacionamentos do tipo herança. Exemplo: class Heroi class Equipamento end end O retorno de uma classe é o resultado da última expressão executada. Se esta expressão não possui valor de retorno, a classe retorna nil. 59 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Definição de Módulos (Module) Este comando define (cria) um módulo. Costuma-se criar nomes de módulos com a primeira letra em maiúsculo. A definição de módulos ocorre com a associação deste a um identificador que podemos utilizar em nosso código. Em Ruby, classes e objetos são instâncias da classe Class. Exemplo: module Teste def testando : end : end Sintaxe: module identificador expr .. end Quando um módulo já está definido (criado) ainda é possível criar um módulo com o mesmo nome. Neste caso, a segunda definição do módulo terá todo o seu código adicionado na primeira definição. O retorno de um módulo é o resultado da última expressão executada. Se esta expressão não possui valor de retorno, o módulo retorna nil. 60 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Definição de Métodos (def) Para criarmos um método usamos a expressão def. Esta expressão cria um método de classe ou módulo. Se os métodos forem definidos na classe mãe, todos os filhos poderão usa-los. O funcionamento dos métodos é semelhante ao das funções que existem em outras linguagens de programação. Nome de métodos podem possuir caracteres normais ou operadores de redefinição (==, +, -,). Exemplo: def fatorial(n) if n == 1 then 1 else n * fatorial (n-1) end end Sintaxe: def nome_do_método ['(' [arg ['=' default]] ... [',' '*' arg] ')'] expr .. [rescue [error_type,..] [then] expr ..].. [ensure expr ..] end 61 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Quando uma expressão possui argumentos, na chamada do método temos que passar valores a estes argumentos. Caso não sejam passados, o valor do argumento omitido recebe o valor padrão. A execução desta expressão ocorre normalmente utilizando o valor padrão. Argumentos que tenham o símbolo (*) imediatamente antes do nome, irá armazenar todos os argumentos subseqüentes num vetor (array). Exemplos: # Método sem argumentos def teste end # Método com argumentos def teste(arg, arg2) # Método com argumento de valor padrão nil def teste(arg = nil) # Todos os exemplos de argumentos incluindo vetor def teste(arg, arg2 = 10, arg3 = nil, *rest) # Método do tipo operador def ==(outro) def +(outro) def *(outro) A ordem de definição dos argumentos dos métodos deve ser seguida na hora de chamar o método. 62 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Operações de Definição (Definition Operations) alias (aliás) Só é possível criar sinônimos do tipo alias para métodos ou variáveis globais. Esta expressão cria um identificador que aponta para o método especificado. Expressões do tipo objeto.método não são permitidas. Exemplo: alias teste testeantigo alias : teste : testeantigo Sintaxe: alias método_novo método_velho Este comando é útil para modificar um método antigo ou adicionar novos comandos a ele. Sempre retorna nil. Mais exemplos: # Definindo o método "teste" def teste "teste" end # Definindo um sinônimo alias :_novo_teste :teste # teste redefinido def teste _novo_teste * 2 end p teste # => "testeteste" 63 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Scripts RGSS Standard Antes de criarmos nossos scripts vamos saber resumidamente para que servem cada um dos scripts padrões no próximo capítulo. Listagem de Scripts RGSS Padrão Vamos então à listagem padrão dos scripts RGSS. Estes scripts são essenciais para o bom funcionamento de qualquer jogo. Mas em muitos casos esta lista pode ser modificada. Ao instalar o aplicativo, apenas estes scripts estarão disponíveis, mas isso não impede que novos scripts sejam adicionados ou que eles sejam removidos. A estrutura dos próximos capítulos é a seguinte: 1. Nome da classe em negrito; 2. Herança em letras pequenas; 3. Descrição em letras normais; As palavras em itálico sevem para fazer referência a uma classe, objeto, variável, indicador, ou qualquer comando dos scripts RGSS. 64 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Arrow_Actor Herança: Arrow_Base Descrição: Esta classe serve para definir o comportamento do cursor quando aponta para um actor durante a batalha. Arrow_Base Herança: Sprite Descrição: Esta classe controla o comportamento do cusror de alvo usado nas batalhas. As classes Arrow_Actor e Arrow_Enemy herdam todas as funcionalidades desta classe. Arrow_Enemy Herança: Arrow_Base Descrição: Esta classe define o comportamento do cursor ao apontar para um dos inimigos durante a batalha. Game_Actor Herança: Game_Battler Descrição: Esta classe define um ator, com todos os elementos e dados típicos tais como o nível, o equipamento, e a progressão da habilidade (Database). Esta classe faz referências às variáveis globais $game_actors e $game_party (variáveis do tipo array ou vetores). Game_Actors Herança: Nenhuma Descrição: Esta classe existe meramente para simplificar questões relacionadas à manipulação dos dados da variável global $game_actors (variável do tipo array ou vetor). Game_BattleAction Herança: Nenhuma Descrição: Esta classe descreve propriedades de uma ação da batalha e possui métodos usados em determinar a validade e o escopo de uma ação da batalha, além de possuir os métodos que decidem qual o último alvo ou qual é o alvo aleatório para ações forçadas durante a batalha. 65 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Game_Battler Herança: Nenhuma Descrição: Esta classe descreve um "battler", isto é, uma figura de um ator ou de um monstro, e tudo que poderia lhe acontecer durante a batalha. Observe que estes objetos do tipo "battler" são membros distintos e diferentes da classe actors. Isto torna mais fácil a aplicação de efeitos temporários. Game_Character Herança: Nenhuma Descrição: Esta classe determina o comportamento dos “hero sprite” (figuras do herói) e “event sprites” (figuras de eventos) no mapa, incluindo o movimento, definindo tipos diferentes de movimento para eventos, e garantindo o correto funcionamento do movimento para as rotas criadas com o “Define Route” (Definição de Rota) e as rotas criadas com o comando “Move Event” (Mover Evento). Game_CommonEvent Herança: Nenhuma Descrição: Esta classe possui métodos e indicadores para trabalharmos com informações de eventos comuns, tais como a lista de comandos do evento, seu trigger (gatilho), e seu swtich (interruptor do gatilho). Esta classe possui também o código para manter o funcionamento eventos comuns que sejam processos paralelos. Game_Enemy Herança: Game_Battler Descrição: Esta classe define um inimigo, contendo seus estados, ações, tesouro e resistências. Contem também o código para decidir que ação o monster deve fazer. Game_Event Herança: Game_Character Descrição: Esta classe possui informações sobre um evento do mapa, além de métodos para verificar se um evento foi executado. 66 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Game_Map Herança: Nenhuma Descrição: Esta classe possui informações sobre o mapa atual, incluindo seus tileset, a sua passabilidade, névoa, panorama, fundo da batalha e eventos. Game_Party Herança: Nenhuma Descrição: Esta classe possui os métodos que tratam do grupo como um todo, além de métodos para tratar cada membro do grupo individualmente. Estes métodos incluem aqueles para ganhar ou perder dinheiro, adicionar e remover membros do grupo, e alguns métodos úteis para batalhas. Game_Picture Herança: Nenhuma Descrição: Esta classe possui informações sobre uma imagem qualquer e contem métodos para mostrar, mover, girar e apagar imagens. Game_Player Herança: Game_Character Descrição: Esta classe calcula a posição relativa do herói em relação ao centro do mapa, evento que provoca decisões relativas ao jogador, além de possuir métodos para tratar a contagem de passos e a contagem de passos restantes para uma batalha. Game_Screen Herança: Nenhuma Descrição: Esta classe possuiu informações e métodos para controle da tela do jogo, e controle do mapa, tal como o tempo se passa, como a tela pisca e como a tela se movimenta (efeito de terremoto). 67 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Game_SelfSwitches Herança: Nenhuma Descrição: Esta classe controla os “Local Switchs” (Interruptores Locais) associados aos eventos além de possuir os métodos para ajustar e iniciar os valores dos interruptores locais. Game_Switches Herança: Nenhuma Descrição: Esta classe controla os switchs (interruptores) do jogo e possui métodos para atribuir e iniciar os switchs (interruptores). Game_System Herança: Nenhuma Descrição: Esta classe possui informações sobre o sistema de jogo, tal como “battle event interpreter”, informações sobre o evento de mapa ou de batalha em execução, a quantidade de tempo restante no temporizador, se os menus “saving” (registrar o jogo), “main menu” (menu principal) e “encounters” (encontros) estão desabilitados, etc... A maioria dos métodos desta classe tratam do processamento dos sons. Game_Troop Herança: Nenhuma Descrição: Esta classe possui informações sobre o grupo de monstros que está em batalha, além de possuir métodos para configurar os grupos de monstros e para determinar um alvo aleatório para um monstro. Game_Variables Herança: Nenhuma Descrição: Esta classe possui as variáveis do jogo além de ter métodos para atribuir e iniciar os dados das variáveis. 68 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Interpreter Herança: Nenhuma Descrição: Esta classe possui métodos que executam os comandos dos eventos incorporados. Cada evento executando representa uma instância desta classe. Scene_Battle Herança: Nenhuma Descrição: Esta é a classe principal do sistema da batalha. Para facilitar o entendimento desta classe, o código do sistema da batalha é dividido em Phases (fases). Estas fases são: Fase 1: Inicio da fase de batalha; Fase 2: Fase de comandos do grupo de heróis; Fase 3: Fase de comandos individuais; Fase 4: Fase principal; Fase 5: Fase da vitória; Scene_Debug Herança: Nenhuma Descrição: Esta classe representa a tela de depuração do jogo que é aberta quando se pressiona a tecla F9 durante um “test play” (Teste de Jogo). Scene_End Herança: Nenhuma Descrição: Esta classe controla o menu que aparece quando você seleciona a opção “End Game” (Fim de Jogo) do menu principal. Scene_Equip Herança: Nenhuma Descrição: Esta classe controla a tela de equipamentos e todas as janelas contidas nela. 69 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Scene_File Herança: Nenhuma Descrição: Esta classe controla os elementos da seleção de arquivo utilizados ao se registrar (save) e carregar (load) um arquivo da memória. Existem duas classes que são heranças desta, Scene_Save e Scene_Load, que controlam elemetos específicos do registro (save) e carregamento (load) respectivamente. Scene_Gameover Herança: Nenhuma Descrição: Esta classe controla os elementos da tela de fim de jogo (Gameover Screen). Scene_Item Herança: Nenhuma Descrição: Esta classe controla a seleção dos itens de menu do menu principal. Note que um processo seperado garante que o menu de itens apareça quando o comando da batalha "item" é selecionado. Scene_Load Herança: Scene_File Descrição: Esta classe garante que o processo de seleção de arquivos inicie apenas uma vez o arquivo de jogo e da forma correta. Scene_Map Herança: Nenhuma Descrição: Esta classe garante que os elementos relacionados ao mapa como a janela da mensagem e a chamada dos vários menus que podem mudar a cena (scene). Além disso, esta classe é responsável pelo processamento dos gráficos dos eventos do mapa, que são asegurados pela classe de Game_Map e por seus objetos. 70 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Scene_Menu Herança: Nenhuma Descrição: Esta classe atualiza o menu principal do jogo, processa as entradas do usuário no menu de comando e a seleção de personagens do menu de estatísticas. Scene_Name Herança: Nenhuma Descrição: Esta classe controla a tela "Enter Hero Name" (Digitar Nome do Herói). Este tela pode ser chamada através dos comandos de eventos. Scene_Save Herança: Scene_File Descrição: Esta classe controla a forma de seleção dos arquivos a serem gravados garantindo que seja utilizado apenas um arquivo por vez. Scene_Shop Herança: Nenhuma Descrição: Esta classe controla as telas de lojas e as suas sub-telas, além de responder às opções escolhidas pelo usuário. Scene_Skill Herança: Nenhuma Descrição: Esta classe controla as janelas e garante a correta utilização e seleção das habilidades dentro do menu principal. Note que a seleção de habilidades na batalha é controlada pela classe Scene_Battle. Scene_Status Herança: Nenhuma Descrição: Esta classe possui as janelas de estatísitcas do herói e podem ser acessadas através do menu principal do jogo. 71 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Scene_Title Herança: Nenhuma Descrição: Esta classe controla a tela de inicio do jogo. Sprite_Battler Herança: Sprite Descrição: Esta classe proporciona mudanças gráficas nas imagens de batalha, tais como atualizar a tela se a imagem estiver é visível, fazer a tela picar como um flash antes de atacar e mostrar os danos causados durante a batalha. Sprite_Character Herança: Sprite Descrição: Esta classe proporciona mudanças gráficas nas imagens do personagem (character), tais como atualizar a tela se a imagem estiver visível, fazer a tela picar como um flash antes de atacar e mostrar os danos causados durante a batalha. Sprite_Picture Herança: Sprite Descrição: Esta classe controla as alterações em imagens durante o jogo. Sprite_Timer Herança: Sprite Descrição: Esta classe atualiza o gráfico de tempo. Spriteset_Battle Herança: Nenhuma Descrição: Esta classe controla todos os sprites (grupos de imagens) usados na classe de Scene_Battle, tal como os inimigos, os atores, o fundo da batalha, e todas as imagens que estão sendo mostradas. 72 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Spriteset_Map Herança: Nenhuma Descrição: Esta classe contem os sprites (grupo de imagens) usados na classe Scene_Map, tal como o tileset, o panorama, a névoa, o tempo e as figuras. Window_Base Herança: Window Descrição: Esta é a classe principal das janelas. Todas as outras classes de janela herdam desta classe. Ela possui métodos úteis que podem ser chamads em diversas janelas. Se você deseja adicionar um método que você irá usar em muitas janelas durante todo o seu jogo, você deve adicionr este método nesta classe. Window_BattleResult Herança: Window_Base Descrição: Esta é a classe da janela que aparece quando você vence uma batalha. Ela mostra a quantidade de experiência e dinheiro adquirido. Em alguns casos itens são deixados pelos monstros. Estes istens são mostrados nesta tela também. Window_BattleStatus Herança: Window_Base Descrição: Esta é a classe da janela que mostra os pontos de vida (HP), os pontos de habilidade (SP) e o estado dos heróis durante a batalha. Window_Command Herança: Window_Selectable Descrição: Esta janela mostra uma lista de comandos. Ao contrário das outras classes que herdam de Window_Base, esta herda de Window_Selectable e é projetada para ser o mais flexível possível, permitindo que uma janela seja construída fácilmente toda vez que você quiser que o jogador escolha uma opção entre vários comandos disponíveis. 73 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_DebugLeft Herança: Window_Selectable Descrição: Esta janela mostra grupos de dez swtichs e variables (interruptores e variáveis) que o usuário pode escolher e modificar durante o teste de seu projeto. Quando o usuário escolhe um grupo do lado esquerdo na tela, o lado direito da tela mostra dez switchs ou variable (interruptores ou variáveis) individuais para serem modificados. Window_DebugRight Herança: Window_Selectable Descrição: Esta janela mostra dez switchs ou variable (interruptores ou variáveis) individuais dependendo do grupo escolhido no lado esquerdo da tela. Pressionando a tecla [Enter] é possível alterar o valor dos switchs (interruptores), além de diversas operações com variable (variáveis) estarem disponíveis. Window_Gold Herança: Window_Base Descrição: Esta janela mostra a quantidade ouro disponível naquele momento. Esta tela é apresentada no menu, nas lojas e quando o comando "\g" é utilizado nas mensagens de texto. Window_Help Herança: Window_Base Descrição: Esta tela é apresentada em várias situaçãoes diferentes, como na tela de itens, na tela de habilidades, equipamentos, dentre outros. Serve para apresentar um texto descritivo sobre uma determinada situação. Na batalha serve para mostrar os nomes dos personagens e dos inimigos. Window_InputNumber Herança: Window_Base Descrição: Esta é a janela para entrada de números. Ela é apresentada quando o comando de evento "Input Number" (Entrar/Digitar Número) é utilizado. 74 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_Item Herança: Window_Selectable Descrição: Esta janela mostra a lista de itens do grupo de personagens. É apresentada toda vez que a opção Item (itens) do menu principal é selecionada. Window_MenuStatus Herança: Window_Selectable Descrição: Esta janela mostra o nome, o nível, os pontos de vida (HP), os pontos de habilidade (SP), e o estado de cada personagem do grupo. Esta janela herda de Window_Selectable e não de Window_Base pois determinados comandos de menu requerem que uma opção esteja selecionada. Window_Message Herança: Window_Selectable Descrição: Esta é a janela principal de mensagens mostrada quando o comando de evento "Show Message" (Mostrar Mensagem) é usado. Window_NameEdit Herança: Window_Base Descrição: Esta janela mostra o nome original do jogador, enquanto possibilita a alteração do nome antigo através da escolha de um novo nome. Os novos nomes devem ser predefinidos e o jogador não pode criar um novo. Window_NameInput Herança: Window_Base Descrição: Esta janela é a janela onde o jogador realmente cria um novo nome. Não precisa ser um nome pré-determinado. O jogador escolhe as letras para o nome da maneira que quiser. Window_PartyCommand Herança: Window_Selectable Descrição: Esta janela mostra as opções Fight (Lutar) ou Flee (Fugir) no inicio de cada turno. 75 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_PlayTime Herança: Window_Base Descrição: Esta janela mostra quanto tempo de jogo já se passou no menu principal do jogo. Window_SaveFile Herança: Window_Base Descrição: Esta janela mostra o estado de um arquivo salvo individualmente nas cenas scene_save ou scene_load. Window_Selectable Herança: Window_Base Descrição: Esta é a classe básica para a maioria das janelas que permitem que você selecione alguma opção na tela. É bastante flexível, a ponto de aceitar opções divididas em linhas e/ou em colunas. Window_ShopBuy Herança: Window_Selectable Descrição: Esta janela mostra os itens disponíveis para serem comprados quando é selecionada a opção Buy (compra) na tela principal das lojas, ou seja, na tela Window_ShopCommand. Window_ShopCommand Herança: Window_Selectable Descrição: Esta janela mostra as opções Buy (Comprar), Sell (Vender), and Exit (Sair) quando uma tela de loja é aberta. Window_ShopNumber Herança: Window_ShopNumber Descrição: Esta tela aparece quando um item é comprado ou vendido, para que possamos indicar a quantidade de itens que desejamos. 76 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_ShopSell Herança: Window_Selectable Descrição: Esta tela mostra os itens disponíveis que podem ser vendidos quando é selecionada a opção Sell (venda) na tela principal das lojas, ou seja, na tela Window_ShopCommand. Window_ShopStatus Herança: Window_Base Descrição: Quando é selecionado um item para comprar numa loja, esta tela mostra a quantidade disponível deste mesmo item no inventário do grupo. Ela mostra também a mudança de poder ou defesa (dependendo do item) para cada personagem que pode utilizar aquele item. Window_Skill Herança: Window_Selectable Descrição: Esta janela mostra a lista de habilidades do personagem e pode ser usado no menu ou durante uma batalha. Window_SkillStatus Herança: Window_Base Descrição: Esta janela aparece em cima da janela de seleção de habilidades. Ela mostra o nome, o estado, os pontos de vida (HP) e os ponstos de habilidade SP do personagem usando esta habilidade. Window_Status Herança: Window_Base Descrição: Esta habilidade mostra o estado do personagem no menu principal. Window_Steps Herança: Window_Base Descrição: Esta janela mostra no menu principal quantos passos foram dados pelos heróis. 77 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Window_Target Herança: Window_Selectable Descrição: Esta tela é apresentada quando um item ou habilidade precisa de um alvo. Esta tela não é utilizada durante uma batalha. 78 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Entendendo as Classes e M◊todos Introdução Muito bem... Já vimos muita coisa. Sabemos tudo sobre a sintaxe e os comandos (eu espero), mas ainda está meio confuso este negócio chamado “orienteção a obejtos”. Que bixo é este? O que siginifica orientação a objetos? É o que veremos agora... Orientação a Obejtos Um objeto é a instância de uma classe. Traduzindo isso para português, uma classe e um objeto são exatamente a mesma coisa, mas quando está no papel (ou na tela do computador) é chamado de classe e quando está sendo executado pelo programa é objeto. Vejamos um exemplo de classe: class Musica def initialize(nome, artista, duracao) @nome = nome @artista = artista @duracao = duracao end end Aqui, criamos a classe Musica. Note que criamos dentro desta classe um método chamado initialize. Este é um método especial do Ruby. Quando executamos o comando Musica.new para criarmos o objeto Musica na memória, o Ruby cria um objeto não inicializado e logo depois chama o método initialize passando os parâmetros especificados no new. 79 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Na classe música têmos três parâmetros. Estes parâmetros adicionam valores a variáveis de instância. Estas variáveis podem ser acessadas por qualquer método de nossa classe Musica ou sub-classe. Vamos voltar à nossa classe e criar mais um método. Ela deve ficar assim: class Musica def initialize(nome, artista, duracao) @nome = nome @artista = artista @duracao = duracao end def to_s return "Música: #{@nome}-#{@artista} (#{@duracao})" end end Aqui, estamos pedindo para nosso novo método (chamado to_s) para retornar um valor no formato String que seja composto pelo nome da música (nome), nome do artista (artista) e a duração da música (duracao). Agora, nossa classe já faz alguma coisa de útil. Vamos ver um código típico onde utilizarêmos a nossa classe e seus métodos. minha_musica = Musica.new(“Track01”, “Fulano”, “05:00 minutos”) print minha_musica.to_s O resultado disso será: "Música: Track01-Fulano (05:00 minutos)". 80 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Já criamos a classe Musica, mas que tal criarmos um Karaoke? Esta classe deve ser bastante semelhante à classe Musica, não acha? Precisariamos de apenas uma mudança. Esta mudança deve possibilitar que a letra da música apareça. Então fica fácil criarmos a classe Karaoke. Basta copiarmos nossa classe e colocarmos outro nome nela. Depois criamos a variável @letra. Certo? Errado! Nunca duplique um código (utilizando os famosos Crtl+C e Ctrl+V) numa linguagem orientada a obejtos. Para fazermos nossa classe Karaoke do modo correto devemos utilizar as “heranças”. Primeiro, nós devemos criar a classe Karaoke herdando as caracteristicas da classe Musica. class Karaoke < Musica def initialize(nome, artista, duracao, letra) super(nome, artista, duracao) @letra = letra end end Note que na inicialização, temos quatro parametros agora. Numa herança, todas as variáveis da classe mãe funcionam com se tivessem sido declaradas na classe filha. O mesmo acontece com os métodos, portanto já podemos utilizar o método to_s. Qual seria o resultado deste comando? meu_karaoke = Karaoke.new(“Track99”, “Ciclano”, “02:30 minutos”, “la la la... laa, laa... la, la”) print meu_karaoke.to_s O resultado disso será: "Música: Track99-Ciclano (02:30 minutos)". Onde foi parar o valor da variável letra??? A variável letra não apreceu, pois numa herança, os métodos são herdados exatamente como foram definidos na classe mãe. Na classe mãe não mandamos a variável letra aparecer, lembra? 81 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Para resolver este problema temos que redefenir o método to_s. Nossa classe deve ficar assim: class Karaoke < Musica def initialize(nome, artista, duracao, letra) super(nome, artista, duracao) @letra = letra end def to_s return "Karaoke: #{@nome}-#{@artista} (#{@duracao}) [#{@letra}]" end end Pronto! Agora, nosso retorno será: "Karaoke: Track99-Ciclano (02:30 minutos) [la la la... laa, laa... la, la]". Note que os métodos das classes que criamos foram usadas sem problema nenhum. Isso ocorre, pois os métodos criados são públicos por definição. Se não indicarmos nada, os métodos serão públicos, mas ainda podemos deixá-los como protegidos ou no modo privado. Uma das formas de se fazer isso é assim: class MinhaClasse public :metodo1, :metodo4 protected :metodo3 private :metodo4 end 82 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Outra forma seria esta: class MinhaClasse def metodo1 # o padrão é 'public' #... end protected # os métodos subsequentes serão 'protected' def metodo2 # vai ser 'protected' #... end private # os métodos subsequentes serão 'private' def metodo3 # vai ser 'private' #... end public # os métodos subsequentes serão 'public' def metodo4 # e este vai ser 'public' #... end end Os métodos public (públicos) podem ser chamados por qualquer um e não existe controle de acesso. Os métodos são públicos por definição (à exceção de inicialize, que é sempre private). Os métodos protected (protegidos) podem ser chamados somente por objetos da classe atual e de suas sub-classes. O escopo de utilização é mantido “dentro da família”, ou seja, classe mãe e suas classes filhas. Os métodos private (confidenciais) não podem ser chamados por outra classe que não seja ela mesma ou a classe que seja descendente direto desta classe. Este é o básico da orientação a objetos. Agora, podemos criar nosso primeiro script. 83 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Criando um Script Introdução Agora nós já conhecemos lógica de programação, a sintaxe básica dos scripts RGSS, os scripts RGSS padrões e o funcionamento básico de uma linguagem OOP. Com esta base, temos conhecimento para criar o nosso primeiro script. Se você está lendo este tutorial, com certeza já deve ter uma boa base nos recursos do RPG Maker XP. Por causa disso, este capítulo irá detalhar apenas os casos referentes aos scripts. Caso você não tenha conhecimentos básicos, este capítulo pode parecer complexo e de difícil entendimento. Portanto, só continue a leitura se você tem certeza que conhece bem o aplicativo. Scene_Tutorial O Editor de Scripts Aqui, vamos ver como criar uma scene completa, com tela de help (ajuda), tela de comandos, telas secundárias, dentre outras coisas. E qual o motivo para estudarmos sobre a criação de uma scene? Bem... Exitem muitas scene’s num jogo criado no RPG Maker, portanto, se você deseja personalisar seu jogo, é inprescendível ter um conhecimento no funcionamento das scene’s. Primeiro crie um novo projeto. Depois vamos abrir o editor de scripts RGSS. Caso não se lembre como fazer isso, tente usar a tecla de atalho F11. No lado esquerdo da tela temos a lista de todos os scripts padrões (aqueles que já vimos no capítulo anterior). Desca a tela até encontrar o script com nome de Main (Principal). 84 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Clique com o botão direito do mouse em cima do Main. Um menu pop up deve aparecer conforme podemos observar na figura 05. Figura 05 Menu pop up do editor de scripts. Selecione a opção Insert (Inserir). Uma tela em branco deve aparecer. Selecione a opção criada e dê um nome para ela. Exemplo: Scene_Tutorial_Script. Agora podemos digitar nossas expressões e códigos do script. Observe na figura 06 como a tela deve ficar. 85 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Figura 06 Script do tutorial. Antes de começarmos a encher nossa tela de expressões e códigos, vamos entender uma scene. Toda cena com janelas é uma scene. As janelas são criadas separadamente, ou seja, cada janela é uma classe diferente. A scene também eu uma classe, mas ela fica responsável apenas por controlar o que cada janela faz. Resumindo: Classe da Scene: Define e controla as janelas. Classes das Janleas: Define a aparência das janelas. 86 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Planejando da Cena Antes de chegarmos ao código, vamos pensar em como será nossa scene. Podemos criar uma cena onde em cima fica a tela de help (ajuda), depois uma tela de comandos e por último duas telas diferentes para aprendermos a usar diversos comandos. Nossas janelas devem ser utilizadas através de variáveis. Vamos criar uma variável para cada janela. A primeira janela será representada pela variável @help_window onde mostrarêmos textos descritivos sobre a nossa scene. A segunda janela será representada pela variável @command_window responsável pelas opções principais de scene, depois terêmos a terceira janela representada pela variável @tela1_window e a quarta janela que será representada pela variável @tela2_window onde irêmos testar a iteração entre as janelas. Só com variáveis que a nossa scene sonsegue manipular as janelas. Em nosso exemplo, a scene irá manipular quatro janelas e, portanto, terêmos que ter quatro variáveis deste tipo, sendo uma variável para cada janela. A cena utiliza as variáveis para manipular as janelas atravé do método main da classe da scene. Lá é onde as variáveis referentes às janelas são instanciadas e usadas pela primeira vez. Em outros métodos da scene, as variáveis de janelas são usadas novamente toda vez que desejamos efetuar alguma operação com janelas. 87 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Entendendo As Classes Agora que já sabemos que nossas classes de janelas serão usadas através de variáveis, devemos saber como será o funcionamento das janelas e da scene. É batante simples. A classe scene possuirá métodos para controlar toda a iteração entre as janelas, cursores, opções e informações. A classe scene só não irá controlar o formato das janelas. Cada janela é uma classe que terá dentro de si métodos para definir como será o seu formato, tamanho, cor, estilo, skin, dentre outras coisas. Agora, vamos ver cada classe resumidamente. class Window_TutorialCommand A variável @command_window deve ser do tipo de nossa janela de comando com as opções principais de nossa scene. Nome de exemplo para esta janela: Window_TutorialCommand. # classe Window_TutorialCommand class Window_TutorialCommand < Window_Selectable # método initialize def initialize ... # incializa a classe end # método draw_item(index) def draw_item(index) ... # desenhando o texto na janela end # método refresh def refresh ... # atualizando desenhos e textos da janela end # método update_help def update_help ... # muda o texto do help end end # fim da classe 88 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE class Window_Tela1 A variável @tela1_window deve ser do tipo de nossa primeira janela de informações. Aqui, podemos criar uma tela onde o jogador irá ver algumas informações, mas não iteragir. Note que nesta janela só vamos mostrar dados, ou seja, não vamos selecionar nada. Por causa disso, esta janela vai herdar de Window_Base ao invés de Window_Selectable. Nome de exemplo para esta janela: Window_Tela1. # classe Window_Tela1 class Window_Tela1 < Window_Base # método initialize def initialize ... # incializa a classe end # método refresh def refresh ... # atualizando desenhos e textos da janela end end # fim da classe 89 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE class Window_Tela2 A variável @tela2_window deve ser do tipo de nossa segunda janela de informações. Aqui irêmos efetuar operações, ou seja, será necessário selecionar opções. Por causa disso, esta janela vai herdar de Window_Selectable. Nome de exemplo para esta janela: Window_Tela2. # classe Window_Tela2 class Window_Tela2 < Window_Selectable # método initialize def initialize ... # incializa a classe end # método draw_item(index) def draw_item(index) ... # desenhando o texto na janela end # método refresh def refresh ... # atualizando desenhos e textos da janela end # método update_help def update_help ... # muda o texto do help end end # fim da classe 90 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE class Scene_Tutorial Ainda terêmos a scene que será responsável por controlar todas as nossas janelas. Na classe Scene_Tutorial é onde devem existir as variáveis referentes às janelas. No main elas são instânciadas. Exemplo: @command_window = Window_TutorialCommand.new Nome de exemplo para esta classe: Scene_Tutorial. # Scene_Tutorial class Scene_Tutorial # método main def main ... # método com expressões executadas por tempo indefinido até que a scene seja fechada end # método update def update ... # atualiza todas as janelas e verifica o tratamento dos comandos end # método update_command def update_command ... # checa se uma tecla foi pressionada na tela de comando principal end # método update def update_command_tela2 ... # checa se uma tecla foi pressionada na tela de comando da janela Window_Tela2 end end # fim da classe 91 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE O Código do Script Agora, finalmente, vamos ao código! #-----------------------------------------------------------------------------# Window_TutorialCommand # * janela de comando que herda de Window_Selectable #-----------------------------------------------------------------------------class Window_TutorialCommand < Window_Selectable #-----------------------------------------------------------------------------# método initialize da janela Window_TutorialCommand #-----------------------------------------------------------------------------def initialize # incializa a classe mãe super(0, 64, 640, 64) # configura a área disponível para uso da janela self.contents = Bitmap.new(width - 32, height - 32) # configura a fonte da janela self.contents.font.name = $fontface # configura o tamanho da fonte da janela self.contents.font.size = $fontsize # vetor com opções de comando da janela @commands = ["Tela 01", "Tela 02", "Voltar para o Mapa"] # indicando quantos itens queremos na tela de comando # itens igual ao total de valores no vetor @commands @item_max = @commands.size # indicando quantas colunas queremos na tela de comando # colunas igual ao número de itens @column_max = @item_max # redesenhando a janela refresh # indicando a posição inicial do cursor ao abrir a janela self.index = 0 # indicando a posição da janela no eixo Z self.z=50 end # fim do método initialize da classe Window_TutorialCommand #-----------------------------------------------------------------------------# método draw_item da janela Window_TutorialCommand #-----------------------------------------------------------------------------def draw_item(index) # index representa a coluna onde o texto vai ser digitado # calculando a posição x do texto x = 4 + index * (640/@column_max) # calculando o tamanho do texto w = (640/@column_max)-32 # indicando a cor do texto self.contents.font.color = normal_color 92 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE # desenhando o texto na janela self.contents.draw_text(x, 0, w, 32, @commands[index]) end # fim do método draw_item(index) da classe Window_TutorialCommand #-----------------------------------------------------------------------------# método refresh da janela Window_TutorialCommand #-----------------------------------------------------------------------------def refresh # limpando toda a janela self.contents.clear # indicando a skin da janela @windowskin_name = $game_system.windowskin_name self.windowskin = RPG::Cache.windowskin(@windowskin_name) # desenhandoa listagem de itens for i in 0...@item_max draw_item(i) end # atualizando otexto da tela de help (ajuda) update_help end # fim do método refresh da classe Window_TutorialCommand #-----------------------------------------------------------------------------# método update_help da janela Window_TutorialCommand #-----------------------------------------------------------------------------def update_help # se a janela ativa não tiver help, retorna sem dar erro return if @help_window.nil? # se a janela atual estiver ativa... if self.active == true if self.index == 0 # se a posição do cursor for 0 (zero) na janela atual... # então muda o texto de help para "Abre a Tela 01." @help_window.set_text("Abre a Tela 01.") elsif self.index == 1 # se a posição do cursor for 1 (um) na janela atual... # então muda o texto de help para "Abre a Tela 02." @help_window.set_text("Abre a Tela 02.") elsif self.index == 2 # se a posição do cursor for 2 (dois) na janela atual... # então muda o texto de help para "Fecha a Scene." @help_window.set_text("Fecha a Scene.") end # fim do if self.index == xxx end # fim do if self.active == true end # fim do método update_help da classe Window_TutorialCommand end # fim da classe Window_TutorialCommand #-----------------------------------------------------------------------------# Fim da classe Window_TutorialCommand #------------------------------------------------------------------------------ 93 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE #-----------------------------------------------------------------------------# Window_Tela1 # * janela normal que herda de Window_Base #-----------------------------------------------------------------------------class Window_Tela1 < Window_Base #-----------------------------------------------------------------------------# método initialize da janela Window_Tela1 #-----------------------------------------------------------------------------def initialize # incializa a classe mãe super(0, 128, 640, 352) # configura a área disponível para uso da janela self.contents = Bitmap.new(width - 32, height - 32) # configura a fonte da janela self.contents.font.name = $fontface # configura o tamanho da fonte da janela self.contents.font.size = $fontsize # redesenhando a janela refresh # indicando a posição da janela no eixo Z self.z=50 end # fim do método initialize da classe Window_Tela1 #-----------------------------------------------------------------------------# método refresh da janela Window_Tela1 #-----------------------------------------------------------------------------def refresh # limpando toda a janela self.contents.clear # indicando a skin da janela @windowskin_name = $game_system.windowskin_name self.windowskin = RPG::Cache.windowskin(@windowskin_name) # indicando a cor do texto self.contents.font.color = normal_color # cria variável com ponteiro para o primeiro actor (heroi) actor = $game_party.actors[0] # desenhando os diversos tipos de textos na janela self.contents.draw_text(4 , 32 * 0, 640, 32, "Nome: " + actor.name) # desenhando o nome self.contents.draw_text(4 , 32 * 1, 640, 32, "Classe: " + actor.class_name + " (nível " + actor.level.to_s + ")") # desenhando a classe e nível self.contents.draw_text(4 , 32 * 3, 640, 32, "Opções modificadas na tela 2:") # desenhando texto self.contents.draw_text(4+32, 32 * 4, 640, 32, "Variável [0001] : " + $game_variables[1].to_s) # desenhando valor de variável self.contents.draw_text(4+32, 32 * 5, 640, 32, "Variável [0002] : " + $game_variables[2].to_s) # desenhando valor de variável self.contents.draw_text(4+32, 32 * 6, 640, 32, "Variável [0003] : " + $game_variables[3].to_s) # desenhando valor de variável self.contents.draw_text(4+32, 32 * 7, 640, 32, "Switches [0001] : " + $game_switches[1].to_s) # desenhando valor de swtich self.contents.draw_text(4+32, 32 * 8, 640, 32, "Switches [0002] : " + $game_switches[2].to_s) # desenhando valor de swtich self.contents.draw_text(4+32, 32 * 9, 640, 32, "Switches [0003] : " + $game_switches[3].to_s) # desenhando valor de swtich # desenhando os diversos tipos de informação sobre o herói draw_actor_graphic (actor, 364, 32 * 1.6) # desenhando o chaset draw_actor_hp (actor, 396, 32 * 0, 172) # desenhando o HP draw_actor_sp (actor, 396, 32 * 1, 172) # desenhando o SP 94 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE draw_actor_parameter(actor, 396, 32 * 3, 0) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 4, 1) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 5, 2) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 6, 3) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 7, 4) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 8, 5) # desenhando atributos draw_actor_parameter(actor, 396, 32 * 9, 6) # desenhando atributos end # fim do método refresh da classe Window_Tela1 end # fim da classe Window_Tela1 #-----------------------------------------------------------------------------# Fim da classe Window_Tela1 #-----------------------------------------------------------------------------#-----------------------------------------------------------------------------# Window_Tela2 # * janela de comando que herda de Window_Selectable #-----------------------------------------------------------------------------class Window_Tela2 < Window_Selectable #-----------------------------------------------------------------------------# método initialize da janela Window_Tela2 #-----------------------------------------------------------------------------def initialize # incializa a classe mãe super(0, 128, 640, 352) # configura a área disponível para uso da janela self.contents = Bitmap.new(width - 32, height - 32) # configura a fonte da janela self.contents.font.name = $fontface # configura o tamanho da fonte da janela self.contents.font.size = $fontsize # indicando quantos itens queremos na tela de comando @item_max = 10 # indicando quantas colunas queremos na tela de comando @column_max = 1 # variáveis temporárias usadas no vetor com opções de comando s1 = "Variable: [0001] += 1" s2 = "Variable: [0001] -= 1" s3 = "Variable: [0002] += 15" s4 = "Variable: [0002] -= 15" s5 = "Variable: [0002] *= 2" s6 = "Switch: [0001] = ON" s7 = "Switch: [0001] = OFF" s8 = "Switch: [0002] = ON / OFF" s9 = "Variable: [0003] = Variable: [0001] * Variable: [0002]" s10 = "Switch: [0003] = not Switch: [0002]" # vetor com opções de comando da janela @commands = [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10] # redesenhando a janela refresh # indicando a posição inicial do cursor ao abrir a janela self.index = 0 95 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE # indicando a posição da janela no eixo Z self.z=50 end # fim do método initialize da classe Window_Tela2 #-----------------------------------------------------------------------------# método draw_item(index) da janela Window_Tela2 #-----------------------------------------------------------------------------def draw_item(index) # index representa a linha onde o texto vai ser digitado # calculando a posição y do texto y = index * 32 # indicando a cor do texto self.contents.font.color = normal_color # desenhando o texto na janela self.contents.draw_text(4, y, 640, 32, @commands[index].to_s) end # fim do método draw_item(index) da classe Window_Tela2 #-----------------------------------------------------------------------------# método refresh da janela Window_Tela2 #-----------------------------------------------------------------------------def refresh # limpando toda a janela self.contents.clear # indicando a skin da janela @windowskin_name = $game_system.windowskin_name self.windowskin = RPG::Cache.windowskin(@windowskin_name) # desenhandoa listagem de itens for i in 0...@item_max draw_item(i) end # atualizando otexto da tela de help (ajuda) update_help end # fim do método refresh da classe Window_Tela2 #-----------------------------------------------------------------------------# método update_help da janela Window_Tela2 #-----------------------------------------------------------------------------def update_help # se a janela ativa não tiver help, retorna sem dar erro return if @help_window.nil? if self.active == true # se a janela atual estiver ativa... # atualiza o texto da janela de help com a opção selecionada @help_window.set_text("opção selecionada : " + @commands[index]) end # fim do if self.active == true end # fim do método update_help da classe Window_Tela2 end # fim da classe Window_Tela2 #-----------------------------------------------------------------------------# Fim da classe Window_Tela2 #------------------------------------------------------------------------------ 96 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE #-----------------------------------------------------------------------------# Scene_Tutorial # * Classe que vai controlar nossas janelas #-----------------------------------------------------------------------------class Scene_Tutorial #-----------------------------------------------------------------------------# método main executado toda vez que iniciamos o objeto # (Scene_Tutorial.New) #-----------------------------------------------------------------------------def main # definindo uma variável para nossa janela de help # não foi necessário criar esta janela, pois usamos # a janela de help padrão dos Scripts RGSS @help_window = Window_Help.new # informando que queremos a janela de help ativada @help_window.active = true # informando que queremos a janela de help visível @help_window.visible = true # definindo uma variável para nossa janela de comandos principais @command_window = Window_TutorialCommand.new # associando a janela de help à nossa janela de comandos @command_window.help_window = @help_window # informando que queremos a janela de comandos ativada @command_window.active = true # informando que queremos a janela de comandos visível @command_window.visible = true # definindo uma variável para nossa janela chamada Tela 01 # a janela "Tela 01" não usa a janela de help @tela1_window = Window_Tela1.new # informando que queremos a janela chamada Tela 01 desativada @tela1_window.active = false # informando que queremos a janela chamada Tela 01 visível @tela1_window.visible = true # definindo uma variável para nossa janela chamada Tela 02 @tela2_window = Window_Tela2.new # associando a janela de help à nossa janela "Tela 02" @tela2_window.help_window = @help_window # informando que queremos a janela chamada Tela 02 desativada @tela2_window.active = false # informando que queremos a janela chamada Tela 02 invisível @tela2_window.visible = false # executa a transição da tela Graphics.transition loop do # atualiza os gráficos Graphics.update # atualiza as entradas Input.update # atualiza scene indefinidamente até que a scene seja fechada update if $scene != self # se sair desta scene, # para de executar este código 97 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE break end # fim do if $scene != self end # fim do comando loop do # finaliza os gráficos e imagens Graphics.freeze # fecha todas as janelas que criamos nesta scene @help_window.dispose @command_window.dispose @tela1_window.dispose @tela2_window .dispose end # fim do método main da classe Scene_Tutorial #-----------------------------------------------------------------------------# método update da classe Scene_Tutorial #-----------------------------------------------------------------------------def update # atualiza todas as janelas que criamos nesta scene @help_window.update @command_window.update @tela1_window.update @tela2_window .update if @command_window.active # se a janela @command_window estiver ativa # atualiza os comandos da janela @command_window update_command elsif @tela2_window.active # se a janela @tela2_windowestiver ativa # atualiza os comandos da janela @tela2_window update_command_tela2 end # fim do if @command_window.active end # fim do método update da classe Scene_Tutorial #-----------------------------------------------------------------------------# método update_command da classe Scene_Tutorial #-----------------------------------------------------------------------------def update_command #verifica a tecla pressionada if Input.trigger?(Input::B) # se a tecla dgitada por [esc] ou X # toca som de cancelar $game_system.se_play($data_system.cancel_se) # e volta para o mapa de jogo $scene = Scene_Map.new elsif Input.trigger?(Input::C) # se a tecla digitada por [enter] ou C # toca som de decisão $game_system.se_play($data_system.decision_se) case @command_window.index # verifica em que posição esta o cursor when 0 # se o cursor estiver na posição 0 (zero) 98 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE @command_window.active = true # ativa a janela @command_window @help_window.active = false # desativa a janela @help_window @help_window.visible = true # torna a janela @help_window visível @tela1_window.active = false # desativa a janela @tela1_window @tela1_window.visible = true # torna a janela @tela1_window visível @tela2_window.active = false # desativa a janela @tela2_window @tela2_window.visible = false # torna a janela @tela2_window invisível @tela1_window.refresh # redefine a janela @tela1_window when 1 # se o cursor estiver na posição 1 (um) @command_window.active = false # ativa a janela @command_window @help_window.active = true # ativa a janela @help_window @help_window.visible = true # torna a janela @help_window visível @tela1_window.active = false # desativa a janela @tela1_window @tela1_window.visible = false # torna a janela @tela1_window invisível @tela2_window.active = true # ativa a janela @tela2_window @tela2_window.visible = true # torna a janela @tela2_window visível when 2 # se o cursor estiver na posição 2 (dois) # toca som de cancelar $game_system.se_play($data_system.cancel_se) # e volta para o mapa de jogo $scene = Scene_Map.new end # fim do case @command_window.index end # fim do if Input.trigger? end # fim do método update_command da classe Scene_Tutorial #-----------------------------------------------------------------------------# método update da classe Scene_Tutorial #-----------------------------------------------------------------------------def update_command_tela2 #verifica a tecla pressionada if Input.trigger?(Input::B) # se a tecla dgitada por [esc] ou X # toca som de cancelar $game_system.se_play($data_system.cancel_se) @command_window.active = true # ativa a janela @command_window @help_window.active = true # ativa a janela @command_window @help_window.visible = true # torna a janela @help_window visível @tela1_window.active = false # desativa a janela @command_window @tela1_window.visible = false # torna a janela @tela1_window invisível @tela2_window.active = false # desativa a janela @command_window 99 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE @tela2_window.visible = true # torna a janela @tela2_window visível elsif Input.trigger?(Input::C) # se a tecla dgitada por [enter] ou C # toca som de decisão $game_system.se_play($data_system.decision_se) case @tela2_window.index # verifica em que posição esta o cursor when 0 # se o cursor estiver na posição 0 (zero) # variável 1 recebe +1 em seu valor $game_variables[1] += 1 when 1 # se o cursor estiver na posição 1 (um) # variável 1 recebe -1 em seu valor $game_variables[1] -= 1 when 2 # se o cursor estiver na posição 2 (dois) # variável 2 recebe +15 em seu valor $game_variables[2] += 15 when 3 # se o cursor estiver na posição 3 (três) # variável 2 recebe -15 em seu valor $game_variables[2] -= 15 when 4 # se o cursor estiver na posição 4 (quatro) # variável 2 recebe *2 em seu valor $game_variables[2] *= 2 when 5 # se o cursor estiver na posição 5 (cinco) # switch 1 fica ON $game_switches[1] = true when 6 # se o cursor estiver na posição 6 (seis) # switch 1 fica OFF $game_switches[1] = false when 7 # se o cursor estiver na posição 7 (sete) # switch 2 muda de valor entre ON e OFF $game_switches[2] = (not $game_switches[2]) when 8 # se o cursor estiver na posição 8 (oito) # variável 3 recebe o valor da variável 1 * variável 2 $game_variables[3] = $game_variables[1] * $game_variables[2] when 9 # se o cursor estiver na posição 9 (nove) # switch 3 fica com valor oposto do Switch 2 $game_switches[3] = (not $game_switches[2]) end # fim do case @tela2_window.index end # if Input.trigger? end # fim do método update_command_tela2 da classe Scene_Tutorial end # fim da classe Scene_Tutorial #-----------------------------------------------------------------------------# Fim da classe Scene_Tutorial #------------------------------------------------------------------------------ 100 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Testando o Script Chegou a hora dos testes. Crie um novo evento no mapa. Deixe-o como “Action Key” (Tecla de Ação). Escolha uma imagem para este evento, para podermos visualizá-lo no mapa. Abra a terceira aba de comando e selecione o comando de evento chamado “Call Script” (Rodar/Chamar Script). Na tela que irá se abrir digite “$scene = Scene_Tutorial.new” sem as aspas. A tela deste comando deve ficar semelhante à figura 07. Figura 07 Evento para chamar o Script. Com este comando estarêmos instanciando a classe Scene_Tutorial na memória, ou seja, estarêmos criando o obejto Scene_Tutorial. A tela de evento deve ficar semelhante à figura 08. 101 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Figura 08 Evento para chamar o Script. Depois de criar o evento, clique em OK e aperte F12 para iniciar o teste de nosso jogo. Se aproxime do evento que acabamos de criar e pressione a tecla [Enter] ou “C”. Se tudo estiver correto, a scene que criamos deve aparecer na tela. Observe as figuras 09 e 10 para ver nosso script em funcionamento. 102 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Figura 09 Testando o Script. 103 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Figura 10 Testando o Script. 104 Tutorial por Marcelo Cavaco ([email protected]) DEGFDEGF Conhecendo Os Scripts RGSS GFDEGFDE Conclus‘o O objetivo deste tutorial é apenas mostrar alguns dos recursos avançados dos Scripts RGSS disponíveis no RPG Maker XP. Este tutorial iniciou nossa caminhada no mundo dos scripts, agora vamos nos aprofundar ainda mais neste assunto. Estamos apenas começando a conhecer esta maravilhosa ferramenta do RPG Maker XP. O nome do próximo tutorial é “Recursos Avançados de Scripts do RPG Maker XP”. Nele iremos conhecer mais profundamente alguns dos recursos mais avançados do editor de scripts e veremos toda a potencialidade que podemos ter em nossas mãos. O autor deste tutorial é Marcelo Cavaco, formado em Processamento de Dados pela Faculdade Rui Barbosa e formado em Engenharia de Produção pela Unibahia. Já trabalhou 6 anos como analista de sistemas e agora trabalha como engenheiro e responsável pelo setor de informática da Sengin – Serviços de Engenharia de Instrumentação Ltda (www.sengin.com.br) desde 2004. Qualquer dúvida, crítica, sugestão, reclamação, comentário ou algo semelhante, favor mandar um e-mail para [email protected] ou se preferir mande um scrapt (recado) no meu Orkut. Está na hora de avançar para o tutorial: “Recursos Avançados dos Scripts do RPG Maker XP ”. 105 Tutorial por Marcelo Cavaco ([email protected])