1 Biblia RGSS [Tópico 2] 23/8/2012, 17:14
Maverick ~
Membro Honorário I
Quem preferir baixar aqui está o link Biblia DO RGSS em PDF
Creditos ao Jão e DarkChocobo
Maverick~ (eu) por arrumar os BBCodes e postar[/i]
Topico 1
Topico 3
Tópico 4 – Superclasses / Herança
Superclasses são aquelas classes que servem de base para uma criação facilitada para as seuas “classes filhas”, que irão herdar todos os métodos já declarados. As classes filhas devem ser declaradas juntamente com o símbolo < separando seu nome, do nome de sua classe pai. Exemplo:
class Window_Status < Window_Base # Trecho retirado da classe Window_Status, linha 7. # No exemplo acima, Window_Status é a classe filha e Window_Base é a sua superclasse.
Para exemplo de superclasses temos Window_Base e Scene_Base, todas as Windows e Scenes são derivados delas. As classes filhas podem utilizar todas as classes já declaradas pela sua “classe mãe”, ou “Superclasse”. Exemplo:
# Método retirado da classe Window_Status, Linhas 20 à 29. def refresh self.contents.clear draw_actor_name(@actor, 4, 0) draw_actor_class(@actor, 128, 0) draw_actor_face(@actor, 8, 32) draw_basic_info(128, 32) draw_parameters(32, 160) draw_exp_info(288, 32) draw_equipments(288, 160) end =begin Se você abrir seu RPGMaker VX e ir na classe Window_Status, não irá encontrar a declaração dos métodos draw_actor_name, draw_actor_class e draw_actor_face; pois estes métodos pertencem à classe Window_Base, porém, a classe Window_Status, é filha de Window_Base, logo, ela tem permição para utilizar seus métodos. =end
As classes filhas também irão herdar as variáveis de instância de sua superclasse, pois as variáveis de instância(para quem não se lembra) são aquelas que pertencem unicamente à classe a qual foi declarada. Ao declarar um método já declarado por sua superclasse, o novo método irá substituir o já declarado, a não ser que seja utilizado o comando „alias‟. (será visto ainda nesta aula) Porém o método já declarado poderar ser chamado pela palavra super.
Exemplo:
# Método „initialize‟ da classe Window_Status def initialize(actor) super(0, 0, 544, 416) @actor = actor refresh end # O método „initialize‟ já foi declarado pela sua superclasse. # Utilizando „super(0, 0, 544, 416)‟ será o mesmo que chamar „initialize(0, 0, 544, 416)‟ # Pois que o comando „super‟ chama o mesmo método, porém, de sua superclasse.
Se você observar os scripts padrões do RPG Maker notará que existem muitas classes que são classes filhas e que suas superclasses são, por sua vez classes filhas de outras superclasses, como exemplo de Window_EquipItem, que é filha de Window_Item, que é filha de Window_Selectable, que é filha de Window_Base, que é filha de Window, que é filha de Object, que é filha de Kernel. (as classes Window, Object e Kernel são classes internas do RGSS, e são impossíveis de serem observadas pelo editor do maker.)
Tópico 5 – Alias
Alias é um comando que serve para alterar o nome dos métodos já criados tanto por superclasses quanto pelas próprias classes. Este comando é muito utilizado por criadores de scripts para não alterar os métodos já existentes nas classes que forem alteradas, apenas adicionando mais comandos aos mesmos. Quando um alias for utilizado ele deve estar dentro da mesma classe que o método em qual o alias deverá alterar o nome, já que não é permitido o uso de expreções como „objeto.método‟. Para utilizar o comando alias basta escrever a palavra „alias‟ seguida do nome a ser alterado do método e o nome original do método. Exemplo:
# Trecho retirado do meu script „Tempo de Jogo‟, linhas 70 à 74. alias dc_tempo_de_jogo_start start def start dc_tempo_de_jogo_start @playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88) End
O alias mudou o nome do método original da classe Scene_Menu de „start‟ para „dc_tempo_de_jogo_start‟, logo depois foi declarado o novo método „start‟, e nele, é chamado o método „dc_tempo_de_jogo_start‟, ou seja, o método „start‟ original, já que seu nome mudou; e depois vem o comando „@playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88)‟. Em outras palavras, é adicionado o comando „@playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88)‟ ao método „start‟ da classe referente.
Aula 4 – Estruturas Condicionais e de Repetição
Índice de Tópicos: Tópico 1 – Como Funcionam Tópico 1.1 – Operadores Tópico 2 – Tipos de Estruturas Condicionais Tópico 2.1 – If / Unless Tópico 2.2 – And / Or Tópico 2.3 – Condições Rápidas Tópico 2.4 – Case Tópico 2.5 – Exceções Tópico 3 – Estruturas de Repetição Tópico 3.1 – Loop Tópico 3.2 – While Tópico 3.4 – For
Tópico 1 – Como Funcionam
Na aula 2 foi visto basicamente para que servem e como funcionam as estruturas condicionais, nesta aula iremos nos aprofundar neste vasto assunto. Basicamente, para que as condições ocorram, sempre serão necessários os pseudovalores true e false (vistos na aula 2). Eles decidirão se a condição citada será verdadeira ou não. Os valores true e false sempre irão substituir 2 valores que estejam separados por um operador. Exemplo:
variável == 5 # Os valores „variável‟ e „5‟ estão separados por um operacional „==‟
Logo, só acontecerão condições se a expressão citada na condição tiver valor de „true‟ ou „false‟.
Tópico 1.1 – Operadores
A função dos operadores condicionais é de substituir os 2 valores que ele separa por um valor „true‟ ou „false‟, de acordo com o operador e valores utilizados.
Operadores:
== != > < >= <= # # # # # # Igual à Diferente de Maior que Menor que Maior ou igual que Menor ou igual que
OBS: Tenha cuidado para não confundir os operadores condicionais com os operadores matemáticos. O operador „==‟, por exemplo, é um operador condicional, já o operador matemático „=‟, é utilizado para definir o valor de uma variável, como ja foi visto em aulas anteriores. Para uma maior compreensão do assunto, aqui vai alguns exemplos:
3 == 3 4 == 2 5 == [5] „[5]‟ é uma array) 1_000_000 == 1000000 variável == variável “string” == “string” „string‟ == “” # true # false # false („5‟ é um número, e # # # # true true true false
Tópico 2 – Tipos de Estruturas Condicionais
Como visto na aula 2, existem vários tipos de estruturas condicionais, qualquer uma poderá ser utilizada para qualquer situação, porém algumas serão basicamente mais simples de serem feitas.
Tópico 2.1 – If / Unless
If If, é a estrutura condicional mais utilizada pelo RGSS, para utilizá-lo basta escrever a palavra „if‟ e logo depois os valores, separados por um espaço. Se os valores resultarem em „true‟, o que está dentro da estrutura acontecerá, vejamos um exemplo já citado na aula 2:
if variável == 5 p „sim‟ end
Como os valores „variável‟ e „5‟ estão separados por um operador condicional, o programa irá verificar se o valor de variável é igual a 5, se for, a espreção será substituída por um „true‟, logo, a espreção „p „sim‟‟ será utilizada, mas se „variável‟ não for igual a 5, a espreção será substituída por um „false‟, logo, a espreção „p „sim‟‟ será ignorada. Vamos à aula prática, crie um script acima de todos os outros em seu projeto (acima de todos os outros para que ele ocorra antes dos outros), e digite a seguinte espreção:
p 5 == 5
Agora teste o jogo, verá que o valor que apareceu na tela foi „true‟, pôs como “5 é igual a 5”, a espreção foi substituída pelo valor „true‟. Agora mude a espreção colocando outros valores no lugar dos cincos e teste para ver o que acontece, coloque também números diferentes como „4 == 6‟, e outros tipos de valores que você aprendeu na aula
2, como strings e arrays, por exemplo. Teste também outros operadores, como por exemplo „2 > 1‟. OBS: Note que você não pode utilizar os operadores „>‟, „<‟, „=>‟ e „<=‟ com valores de arrays e strings, porém, você pode utilizar „==‟ e „!=‟, mesmo que não esteja utilizando junto com valores iguais. Exemplo:
“string” == [1, 2, 3] “RPGMaker XP” == “RPGMaker VX” [5, 4, 6] == [7, 2, 0] “string” != [1, 2, 3] “RPGMaker XP” != “RPGMaker VX” [5, 4, 6] != [7, 2, 0] # false # false # false # true # true # true
Unless Basicamente „Unless‟ é exatamente o contrário de „if‟. Exemplo:
# As 2 espreções abaixo resultariam num mesmo resultado: if variável == outra_variável veriável unless variável != outra_variável diferente da outra variável # se variável for igual a outra # se a variável não for
Utilização Alternativa das expressões Como já dito anteriormente existem vários tipos de condicionais além do tradicional explicados acima. Estas formas alternativas são utilizadas com o mesmo conceito das espreções já explicadas, porém com poucas alterações Condições de uma linha Estas são utilizadas quase da mesma forma que a tradicional explicada acima, porém, só têm suporte à um comando. Para utilizá-la faça da mesma forma que foi esplicado, porém, coloque tudo na mesma linha com a palavra „then‟ logo após os valores condicionais. Exemplo:
# condicional comum: if variável == 5 p „sim‟ end # condicional de uma linha: If variável == 5 then p „sim‟ end „sim‟ # se variável for igual a 5, p
Ocorrerá exatamente a mesma coisa que a condicional comum, porém, utilizando um espaço de linhas menor, como mostra o exemplo acima. Você também pode utilizar um else, para definir uma exceção:
# condicional comum: if variável == 5 p „sim‟ else p 'nao' end # condicional de uma linha: if variável == 5 then p “sim" else p 'não' end igual a 5, p „sim‟, se não, p 'não' # se variável for
OBS: Exceções serão vistas ainda nesta aula Condições de um comando Outra forma de resumir uma condicional comum à uma linha é simplesmente colocar o resultado antes da palavra „if‟. Exemplo:
# condicional comum: if variável == 5 p „sim‟ end # condicional de uma linha: p „sim‟ if variável == 5 # p „sim‟, se variável for igual a 5
Tópico 2.2 – And / Or
As palavras „and‟ e „or‟ são extensões para criar condições mais elaboradas e específicas, quando necessário. Elas devem ser colocadas após a condição, e exigem uma segunda condição. Exemplo:
if variável == 5 and outra_variável == 3 end
ou
if variável == 5 or outra_variável == 3 end
Elas representam uma maior necessidade de requisitos para a estrutura. O „And‟ (em inglês, „e‟) indica que ambas as condições deverão ser cumpridas para a estrutura ser ativada. O „Or‟ (em inglês, „ou‟) indica que a estrutura será ativada se qualquer uma condição for ativada. Exemplo:
# A estrutura abaixo será ativada se „variável‟ e „outra_variável‟ forem, # respectivamente iguais a 5 e 3. if variável == 5 and outra_variável == 3 end
# A estrutura abaixo será ativada se „variável‟ ou „outra_variável‟ for, # respectivamente 5 ou 3. if variável == 5 or outra_variável == 3 end
And e Or podem ser usadas quantas vezes forem necessárias, para não haver estruturas dentro de estruturas. Exemplo:
# Lembrando que você aprendeu na aula 2 que variáveis de tipos diferentes serão # sempre variáveis distintas, mesmo que tenham o mesmo nome. if variável == 5 and @variável == 5 and $variável == 5 and VARIÁVEL == 5 end
ou
if variável == 5 or @variável == 5 or $variável == 5 or VARIÁVEL == 5 end
Você pode criar, também, estruturas com „and‟ e „or‟ juntas. Exemplo:
if variável == 5 or @variável == 5 and $variável == 5 or VARIÁVEL == 5 end =begin Para entender este caso, você deve prestar muita atenção, A estrutura só será ativada se uma das variáveis „variável‟ ou „@variável‟ forem 5, E se, além disto, uma das variáveis „$variável‟ ou „VARIÁVEL‟ forem 5. =end
Tópico 2.3 – Condições Rápidas
Estas condições são utilizadas em casos raros, em que o scripter quer criar uma condição com uma exceção de um único comando. Para utilizá-la não é necessário a palavra „if‟, apenas a condição(valor, operador, valor), uma interrogação(„?‟), o comando em caso de a condição ser verdadeira, dois pontos(„:‟), e o comando de exceção. Exemplo:
variável == 5 ? método : outro_método # É claro que você não é obrigado chamar um método, você pode também # utilizar outro comando, como alterar o valor de uma variável: variável == true ? variável = false : variável = true # O exemplo acima é um comando normalmente usado para variáveis que # representam switches, para mudarems eu valor independente de seu valor atual: # Se ela for true, se transforma em false, mas se não for true, # se transforma em true, pôs logicamente é false.
OBS: O comando „Toogle Switch‟(do maker 2003) foi extinto exatamente pelo fato de ele poder ser facilmente feito por scripts, como mostra o exemplo acima. É sempre bom lembrar que, como o ruby ignora os espaços em branco sempre que há necessidade de um novo valor, as condições rápidas podem ser expressas da seguinte forma, facilitando sua compreensão:
variável == true ? variável = false : variável = true # Se variável for true... # Ela se transforma em false, # Se não, ela se transforma em true
Logo, as condições rápidas também podem ser utilizadas várias veses de uma só vez: Código:
# O trecho abaixo foi retirado da classe Window_Base do RMXP, linhas 301 a 305. # Desenhar HP self.contents.font.color = actor.hp == actor.maxhp ? Color.new(64,255,128) : actor.hp <= actor.maxhp / 5 ? knockout_color : actor.hp <= actor.maxhp / 2 ? crisis_color : normal_color # Note como as condições são repetidas várias vezes. # As condições rápidas são apenas para diminuir o número de linhas utilizadas # por condições mais simples, pois, apesar de este exemplo estar em várias linhas, # ele poderia ter sido feito em apenas uma linha, eliminando os espaços. # Você não é obrigado a entender este exemplo agora, pôs já é algo mais avançado, # e por tanto não será cobrado até que você se especialize em scripts.
Tópico 2.4 – Case
A estrutura condicional Case, tem o mesmo objetivo da estrutura if, porém mais fácil de programar em certas situações. Com ela você irá definir um comando (ou mais) para o caso de cada possível valor de uma determinada variável. Em outras palavras, executará um comando diferente para cada valor que a variável tiver. Para usá-lo, utilize a palavra case, seguida de uma variável, e nas linhas abaixo, as palavras when, seguidas do possível valor da variável, e no final um „end‟, para determinar o fim da estrutura.
# Trecho retirado da classe Scene_Tile, do RMVX, linhas 66 à 73. case @command_window.index # Caso o cursor esteja no botão: when 0 # 0, executa o método „command_new_game‟ command_new_game when 1 # 1, executa o método „command_continue‟ command_continue when 2 # 2, executa o método „command_shutdown‟ command_shutdown end
Você pode utilizar vários valores em cada „when‟, para não precisar repeti-lo, utilizando todos os valores possíveis separados por vírgulas. Vamos fazer um teste, abra o editor de seu projeto e vá na linha 67, e onde tem o 0(zero), coloque 0, 1, 2; e teste o jogo. Você perceberá que não importa qual botão você clicar, todas irão redirecioná-lo ao new game, pôs você definiu que se o cursor estiver em qualquer um dos botões 0, 1 e 2; eles irão levá-lo para o método „new_game‟ (que está logo abaixo do when 0, 1, 2). Você poderá também utilizar um „else‟, entre o último „when‟ e o „end‟, para determinar uma exceção. (exceções serão vistas ainda nesta aula) Exemplo 1: (string)
sabor_do_biscoito = “morango” case biscoito when “chocolate” # o biscoito é de chocolate when “morango” # o biscoito é de morango when “limão” # esse biscoito é ruim >_< End
Exemplo 2: (range)
preço_do_biscoito = 5 case biscoito when 0 ... 2 # que biscoito barato when 3 ... 6 # o biscoito está num preço normal when 7 ... 1_000_000 # biscoito de ouro end
Tópico 2.5 – Exceções
Exceções são o que acontecerão no caso de a condição da estrutura não for cumprida corretamente. As estruturas condicionais poderão, ou não ter exceções (exceto a „condição rápida‟, que é obrigatório o uso de exceções). Para definir exceções utilize a palavra „else‟.
if variável == 5 # variável é 5 else # variável não é 5 end
Exceções podem ser utilizadas também nas estruturas case.
case power_ranger when “Azul”, “Verde”, “Vermelho”, “Preto” # Homem when “Rosa”, “Amarelo” # Mulher else end
Exceções Condicionais As Exceções condicionais são um tipo de exceção utilizado somente nas condicionais if e unless. Elas representam uma segunda condição dentro da exceção da condição principal. Para determinar uma exceção condicional utilize a palavra „elsif‟, ao invés de „else‟, seguido da condição. Exemplo:
if variável == 0 # condição elsif variável == 1 # exceção condicional else # exceção end
Note que o exemplo acima poderia ser representado da seguinte forma:
if variável == 0 # condição principal else if variável == 1 # segunda condição dentro da exceção da condição principal else # exceção da segunda condição end end
Tópico 3 – Estruturas de Repetição
As estruturas de repetição são estruturas que irão executar os comandos determinados repetidamente um determinado número de vezes, ou até você determinar o seu término. Existem vários tipos de estrutura de repetição, cada uma é trabalhada de uma forma diferente, existindo assim uma estrutura diferente para cada caso.
Tópico 3.1 – Loop
Os loops são estruturas em que deverão ser definidos alguns comandos e os mesmos ficarão sendo executados, até que o comando de finalização do loop seja chamado. Em Ruby, os loops são trabalhados de forma exatamente igual aos loops dos eventos do RPGMaker. Para iniciar um loop, use o comando „loop do‟, e use a palavra „break‟ para “quebrar” o loop, não esqueça de que o loop, por ser uma estrutura, precisa de um end, para determinar seu fim. Exemplo:
# Trecho retirado da classe Scene_Base, do RMVX, linhas 16 até 21. loop do Graphics.update Input.update update break if $scene != self end
Note que o comando „break‟, está em uma condição: „break if $scene != self‟, ou seja, o loop só será quebrado no caso de a variável „$scene‟ for diferente ( != ) de „self‟. „self‟ será visto mais profundamente no futuro, „self‟ representa a própria classe em que foi escrito. Caso a condição de „$scene‟ ser diferente de „self‟ não for cumprida, chegará no final sem um „break‟, logo, ela irá recomeçar a partir do primeiro comando. (neste caso, „Graphics.update‟)
Tópico 3.2 – While
While é uma estrutura muito semelhante ao loop, porém, é trabalhada de forma diferente. Em while, você deve descrever uma condição para uma quebra de estrutura logo após a declaração do início da estrutura. Exemplo:
# Trecho retirado do script Main, do RMXP, linhas 36 à 38. while $scene != nil $scene.main end
Na mesma linha da declaração do início da estrutura, foi declarada uma condição para a quebra da estrutura (se $scene != nil). A estrutura será repetira sempre que a condição não for cumprida, e será quebrada no caso de esta condição não for cumprida, ou no caso do uso da quebra de estruturas „break‟.
Tópico 3.3 – For
A estrutura diferente das citadas acima, por trabalhar com um valor que irá mudar de acordo com o número de vezes que a estrutura já foi repetida. Para chamar esta estrutura, utilize a palavra „for‟, seguida de uma variável que não precisa estar declarada, neste caso, você já estará declarando a variável; depois a palavra in, e por último uma range ou uma array, pré determinada. A variável escolhida terá, inicialmente, o primeiro valor da range ou array. A cada vez que a estrutura for repetida, a variável declarada, passará a ter o próximo valor da range ou da array, até chegar em seu último valor, neste caso, a estrutura será quebrada. Exemplo:
# Exemplo retirado da classe Window_Command, do RMXP, linhas 31 à 33. for i in 0...@item_max draw_item(i, normal_color) end
Percebe-se que o método „draw_item‟, é um método que necessita de dois valores, por isso os parênteses, com as duas variáveis separadas por vírgula, „i‟ e „normal_color‟. Cada vez que a estrutura for repetida, a variável „i‟ terá um valor diferente, sendo este valor um valor que virá dês de 0, até o valor da variável @item_max, por exemplo: se @item_max for 3, a cada vez que a estrutura for repetida, i terá um valor de: 0, depois 1, depois 2, e por último 3. Logo, se @item_max for 3, a estrutura acima seria o mesmo que o exemplo abaixo:
draw_item(0, draw_item(1, draw_item(2, draw_item(3,
normal_color) normal_color) normal_color) normal_color)
Este tipo de estrutura é muito útil, quando você quer utilizar várias veses um mesmo comando, porém com valores diferente, exatamente como os exemplos citados acima.
Aula 5 – Revisão e Classes do RGSS
Índice de Tópicos: Tópico 1 – Classes e Módulos Tópico 1.1 – Herança Tópico 2 – Revisão e Complemento Tópico 2.1 – Valores numéricos Tópico 2.2 – String Tópico 2.3 – Array Tópico 2.4 – Hash Tópico 2.4 – Ragexp Tópico 2.5 – For Tópico 3 – Funções Exclusivas do RGSS Tópico 3.1 – Classes Internas do RGSS
Tópico 1 – Classes e Módulos
Ruby é uma linguagem de programação que se baseia num sistema de objetos, as classes. Cada possível valor será considerado uma classe, ou seja, um objeto. Cada classe tem vários métodos, que são os comandos possuídos pelas classes, sem os métodos, as classes não seriam nada, e vice-versa. Módulos são parecidos com as classes, porém, estas não precisarão ser declaradas, além de poderem ser utilizadas a partir de qualquer parte do jogo. Você também pode chamar constantes dos módulos, utilizando o comando „Módulo::Constante‟.
Tópico 2.1 – Herança
Classes que têm uma herança em relação a outras, terão todos os métodos de sua superclasse, ou “classe mãe”. As classes também podem herdar os métodos de um Módulo ao utilizar o comando „Include.Método‟ dentro da classe desejada.
Tópico 2 – Revisão e Complemento
Existem 4 tipos di variáveis: local, de instância, global e constante. Variáveis locais devem ser declaradas e usadas num mesmo método de uma classe ou de um módulo(variável). Variáveis de instância devem ser utilizados somente na classe ou método em que foram declaradas(@variável). Variáveis de instância pública são determinadas variáveis de instância que poderão ser acessadas por outras classes ou módulos(@classe.variável). Variáveis globais poderão ser acessadas por qualquer classe, ou até mesmo pelos eventos($variável). Constantes são variáveis que terão sempre um determinado valor (CONSTANTE ou Constante ou Módulo::Constante).
Tópico 2.1 – Valores Numéricos
Valores numéricos são aqueles representados por números. Existem 2 tipos de valores numéricos: Integer e Float. Integer (Números Inteiros) são números que podem ser negativos, ou positivos, exemplo:
... , -3 , -2 , -1 , 0 , 1, 2 , 3 , ...
Float (Números Decimais) são números que estão entre um número inteiro e outro, exemplo:
... , 0.7 , 0.8 , 0.9 , 1.0, 1.1 , 1.2 , 1.3 , ...
OBS: Note que um valor Float não se transformará em integer se ele terminar com „.0‟. Note também que uma Integer, quando dividida por um valor inadequado (10/3, por exemplo) será arredondado (o resultado seria 3), porém, em float(10.0/3) resultaria no valor correto(3.333...). Logo, o valor Float é utilizado somente em raros casos, o HP dos personagens, por exemplo, é uma Integer. (Imagine se seu HP ficasse “3.333...” entendeu agora porque ele fica em Integer ao invés de Float?) Os Integer são divididos em dois grupos: Fixnum, e Bignum. Fixnum serão Integers pequenas (com valores pequenos), enquanto Bignums (valores raramente usados) são números que excedem o limite da memória para estes valores. Exemplo:
1, 2, 3, 4, 5, 6, ... 1_000_000_000_000 # Fixnum # Bignum
OBS: Lembre-se que Bignum e Fixnum são classes filhas de Integer, logo, um Float nunca será um Bignum ou Fixnum, exemplo:
1_000_000_000_000 1_000_000_000_000.0 # Bignum # Float
Representação das classes que representam valores numéricos:
Numeric > > Integer Float > > Fixnum Bignum
Tópico 2.2 – Strings
Strings são valores em textos (palavras, etc.). Devem ser colocados dentro de parênteses. As strings podem exibir valores de variáveis utilizando o comando „#{variável}‟ dentro da string. Exemplo:
memória_ram = 516 “A sua memória RAM é de: #{memória_ram} Mb.” # O programa interpretará o texto acima desta forma: # “A sua memória RAM é de: 516 Mb.”
# É claro que alterando o valor de „memória_ram‟ obteríamos outros valores memória_ram = 256 # Agora, o programa interpretará o texto da seguinte forma: # “A sua memória RAM é de: 256 Mb.”
Métodos A classe String possui alguns métodos extremamente úteis para casa tipo de situação, estes métodos podem ser complexos para serem compreendidos, e não serão utilizados com grande freqüência no ruby, portanto não é obrigatório o compreendimento de cada um deles. Os principais são: downcase/upcase, sub/gsub e scan. Downcase e Upcase Downcase e Upcase alteram cada letra contida na String entre letras minúsculas e maiúsculas. Downcase e Upcase são métodos que alterarão o valor da String somente no momento em que forem utilizados, para alterar o valor da String permanentemente, são utilizados uma exclamação (“!”) após as palavras downcase e upcase. Exemplo:
string = “Pipoca Salgada” string.upcase # PIPOCA SALGADA string.downcase # pipoca salgada string # Pipoca Salgada string.upcase! string # PIPOCA SALGADA string.downcase! string # pipoca salgada
Sub e Gsub Sub e Gsub são comandos utilizados para uma substituição de determinadas palavras da String por outras palavras. Para utilizar os comandos Sub e Gsub é necessário após chamar o método, um valor a ser substituído (será colocado entre parênteses) e um valor a substituir (será colocado entre chaves). A única diferença entre Sub e Gsub é que Gsub irá substituir todos os trechos da String que conhecidirem com o valor entre parênteses, e Sub irá substituir somente o primeiro valor encontrado, como mostra o exemplo a seguir:
pipoca = “Pipoca Salgada” pipoca.sub(“Salgada”){“Doce”} pipoca # “Pipoca Doce” texto = “o rato roeu a ropa do rei de roma” texto.gsub(“r”){“l”} text # “o lato loeu a lopa do lei de loma”
Scan Scan é um método utilizado para recolher uma array com todos os valores do texto desejado. Exemplo:
texto = “o rato roeu a ropa do rei de roma” text_escaneado = texto.scan(“ro”) texto_escaneado # [“ro”, “ro”, “ro”]
Tópico 2.3 – Array
Arrays são tipos de valores que podem guardar vários valores diferentes, como mostra o exemplo abaixo:
array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: #{variável}”, 8] ] # Cuidado para não confundir um valor com o outro, eles são sempre separados por vírgulas
Cada valor contido em uma Array tem um id, que corresponde a sua posição, dentro da Array, começando a contagem do 0 (zero). Exemplo:
array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: #{variável}”, 8] ] =begin id 0: 4 id 1: [16, [0, 82], 39.4] id 2: “texto” id 3: 1_000_000 id 4: [“variável: #{variável}”, 8] ] =end
Você pode alterar diretamente um único valor de uma array, colocando seu id entre chaves logo após o nome da array. Exemplo:
array = [] array[0] = array[1] = array[2] = array[3] = variável = array[4] = # Declara a variável „array‟ 4 [16, [0, 82], 39.4] “texto” 1_000_000 10 [“variável: #{variável}”, 8] ]
# a variável „array‟ passará a ter o seguinte valor: # array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: 10”, 8] ]
Você pode utilizar os valores dentro da array da mesma forma que outra variável qualquer. Exemplo:
array = [1, 2, 3] array[1] = 3 array[2] = 9 array[0] -= 1 # array agora esta assim: [0, 3, 9]
OBS: Ao tentar selecionar um valor ainda não declarado pela array, ele será nil, exemplo:
array = [1, 2] # array[2] é nil, array[3] é nil, array[4] é nil... array[3] = 4 # array agora esta assim: [1, 2, nil, 4]
Você também pode adicionar determinados novos valores à array, simplesmente somando uma array com outra. Exemplo:
array = [1, 2, 3] array += [4, 5, 6] # array agora está assim: [1, 2, 3, 4, 5, 6]
Você pode selecionar também uma determinada quantidade de valores de uma única vez, utilizado dois valores, dentro das chaves. O primeiro determinará o id do primeiro valor a ser alterado, o segundo determinará a quantidade de valores que deverão ser selecionados. Exemplo:
array = [0, 0, 0, 0, 0, 0, 0, 0] array[1, 6] = [1, 1, 1, 1, 1, 1] # array agora está assim: [0, 1, 1, 1, 1, 1, 1, 0] array[1, 6] = 1 # array agora está assim: [0, 1, 0]
Métodos Por ser uma classe, Array tem alguns métodos que deverão ser utilizados de acordo com a situação. Os principais métodos de Array são: clear, compact, delete/delete_at, empty?, include?, index, length/size, nitems, shift/unshift, push/pop, reverse/sort. Clear Clear é um comando muito simples, que apaga a array, é o mesmo que redeclarar a array. Exemplo:
array = [] # Declara a variável „array‟
array[0] = 4 array[1] = [16, [0, 82], 39.4] array[2] = "texto" array[3] = 1_000_000 array[4] = ["variável: 10", 8] array += [4, 5, 6] array[1, 3] = [1, 2, 1] # array agora está assim: [4, 1, 2, 1, ["variável: 10", 8], 4, 5, 6] array.clear # array agora está assim: []
Compact Compact é um simples comando que elimina todos os valores „nil‟ da array. Exemplo:
array = [1, 2] array[6] = 0 # array agora esta assim: [1, 2, nil, nil, nil, nil, 0] =begin array.compact será: [1, 2, 0] note que o comando „compact‟ não altera o valor verdadeiro da array. (assim como downcase/upcase, das strings) assim, como downcase/upcase, compact também poderá ser utilizado com uma exclamação para alterar definitivamente o valor da array =end array2 = array.compact # array ainda está assim: [1, 2, nil, nil, nil, nil, 0] # array2, está assim: [1, 2, 0] array.compact! # agora, array está assim: [1, 2, 0]
Delete e Delete_at Delete e Delete_at são commandos extremamente parecidos, porém utilizados de forma diferente. Ambos têm a função de eliminar um determinado valor da array, alterando assim toda a estrutura, e conseqüentemente, os ids de cada um dos valores que estiverem posicionados após o valor eliminado. Para utilizar o „Delete‟ é necessário especificar o valor a ser deletado na array, logo após o comando. O programa irá procurar por todos os valores especificados, que a array guardar, e apagá-los. Exemplo:
array = [1, 2, 3, 2, 1, 2, 3, 1, [1, 2, 3]] array.delete(2) # array agora está assim: [1, 3, 1, 3, 1, [1, 2, 3]] array.delete(1) # array agora está assim: [3, 3, [1, 2, 3]] array.delete(3) # array agora está assim: [[1, 2, 3]] array.delete([1, 2, 3]) # array agora está assim: []
Já o comando „Delete_at‟, apaga apenas o valor que estiver na posição definida ao chamar o comando. Exemplo:
array = [1, 2, 3, 2, 1, 2, 3, 1] array.delete_at(2) # array agora está assim: [1, 2, 2, 1, 2, 3, 1] array.delete_at(0) # array agora está assim: [2, 2, 1, 2, 3, 1] array.delete_at(4) # array agora está assim: [2, 2, 1, 2, 1]
Empty? O comando empty, é utilizado em condições, ele será substituído por true, ou false sempre que for chamado, sendo true se a array tiver valor „[]‟ (nenhum valor), e false se ela tiver ao menos um único valor. Exemplo:
if array.empty? # a array está vasia else # a array tem algum valor end
Exemplo 2:
array.clear if array.empty? print “a array está vasia” end =begin Não importa qual valor array tinha antes do comando „array.clear‟, a condição será cumprida, pôs todos os valores da array foram apagados no comando „array.clear‟. =end
Include? A forma de utilizar o comando „Include?‟ é extremamente semelhante ao comando „empty‟ pelo fato de ambos se referirem a uma condição. O comando „Include?‟ verifica se a array têm algum valor específico. Exemplo:
if array.include?(5) # dentro de array, existe um 5 else # dentro de array, não existe nenhum 5 end
Index Index seleciona o id de um determinado valor. Se a Array tiver mais do que um valor especificado, será selecionado o id do primeiro valor, se a Array não possuir nenhum valor igual ao especificado, o comando será substituído por nil. Exemplo 1:
array = [1, 2, 3] id = array.index(2)
# neste caso, id é 1
Exemplo 2:
array = [1, 2, 3, 2, 1] id = array.index(2) # neste caso, id é 1 id = array.index(1) # neste caso, id é 0
Exemplo 3:
array = [1, 3, 1, 3] id = array.index(2) # neste caso, id é nil
length/size Este comando é bem simples, ele seleciona o tamanho da Array, ou seja, o número de valores contidos na mesma. Exemplo:
array = [1, 2, 3] array.length # neste caso, será 3
array = [0, 0, 0, 0, 0, 0] array.size # neste caso, será 6 array = [] array.length # neste caso, será 0
array = [“texto 01”, “texto 02”, “texto 03”] array.size # neste caso, será 3
OBS: Observe que não há qualquer diferença entre os comandos „length‟ e „size‟, é apenas a palavra. Nitems Seleciona o número de valores não „nil‟ existentes na array. Exemplo:
array = [1, 2, 3, 4, 5] array.nitems # neste caso, será 5 array = [1, nil, 3, nil, 5] array.nitems # neste caso, será 3 array = [] array.nitems # neste caso, será 0
array = [nil, nil, nil] array.nitems # neste caso, será 3 array = [0, nil, 1, nil, nil, 2, nil] array.nitems # neste caso, será 3
OBS: Note que nitems será igual a size/length sempre que não existir nenhum nil, na array.
Shift/Unshift Shift e Unshift são comandos utilizados para adicionar ou remover elementos, de id 0 da array. O comando Shift irá remover o primeiro elemento da array, e Unshift adiciona um novo elemento a array, que virá como id 0, mudando a posição dos outros valores da array. Exemplo:
array = [1, 2, 3] array.shift # array, agora está assim: [2, 3] array.unshift(1) # array, agora está assim: [1, 2, 3]
Push/Pop Push e Pop são comandos extremamente parecidos com Shift e Unshift, a única diferença é que os comandos Push e Pop trabalham com o último valor da array, diferente de Shift e Unshift, que se referem ao primeiro valor da array. Exemplo:
array = [1, 2, 3] array.pop # array, agora está assim: [1, 2] array.push(3) # array, agora está assim: [1, 2, 3]
Sort e Reverse Sort é um Comando que organizará a array em uma ordem fixa, e reverse inverterá a array para que sua ordem de valores fique na ordem inversa. Uma array não pode conter tipos diferentes de valores quando utilizar o comando „sort‟, pois neste caso ocorrerá um erro. Se a array conter somente valores numéricos, ela será organizada por ordem de valores do menor para o maior, se ela conter somente textos (strings) ela será organizada em ordem alfabética, e se ela conter somente arrays, seus valores devem conter somente um mesmo tipo de valor, e assim sucessivamente. Exemplo:
array = [5, 8, 9, 7, 4, 2, 6, 8] array.sort # array, agora está assim: [2, 4, 5, 6, 7, 8, 8, 9] array.reverse # array, agora está assim: [9, 8, 8, 7, 6, 5, 4, 2] array = [“Dark Chocobo”, “Jão Rafael”, “Cabana Ruby”, “Reino RPG”] array.sort # array, agora está assim: [“Cabana Ruby”, “Dark Chocobo”, “Jão Rafael”, “Reino RPG”] array = [“Dark”, “Chocobo”, “Jão”, “Rafael”, “Cabana”, “Ruby”, “Reino”, “RPG”]
array.sort # array, agora está assim: [“Cabana”, “Chocobo”, “Dark”, “Jão”, “Rafael”, “Reino”, “RPG”, “Ruby”]
Creditos ao Jão e DarkChocobo
Maverick~ (eu) por arrumar os BBCodes e postar[/i]
Topico 1
Topico 3
Tópico 4 – Superclasses / Herança
Superclasses são aquelas classes que servem de base para uma criação facilitada para as seuas “classes filhas”, que irão herdar todos os métodos já declarados. As classes filhas devem ser declaradas juntamente com o símbolo < separando seu nome, do nome de sua classe pai. Exemplo:
class Window_Status < Window_Base # Trecho retirado da classe Window_Status, linha 7. # No exemplo acima, Window_Status é a classe filha e Window_Base é a sua superclasse.
Para exemplo de superclasses temos Window_Base e Scene_Base, todas as Windows e Scenes são derivados delas. As classes filhas podem utilizar todas as classes já declaradas pela sua “classe mãe”, ou “Superclasse”. Exemplo:
# Método retirado da classe Window_Status, Linhas 20 à 29. def refresh self.contents.clear draw_actor_name(@actor, 4, 0) draw_actor_class(@actor, 128, 0) draw_actor_face(@actor, 8, 32) draw_basic_info(128, 32) draw_parameters(32, 160) draw_exp_info(288, 32) draw_equipments(288, 160) end =begin Se você abrir seu RPGMaker VX e ir na classe Window_Status, não irá encontrar a declaração dos métodos draw_actor_name, draw_actor_class e draw_actor_face; pois estes métodos pertencem à classe Window_Base, porém, a classe Window_Status, é filha de Window_Base, logo, ela tem permição para utilizar seus métodos. =end
As classes filhas também irão herdar as variáveis de instância de sua superclasse, pois as variáveis de instância(para quem não se lembra) são aquelas que pertencem unicamente à classe a qual foi declarada. Ao declarar um método já declarado por sua superclasse, o novo método irá substituir o já declarado, a não ser que seja utilizado o comando „alias‟. (será visto ainda nesta aula) Porém o método já declarado poderar ser chamado pela palavra super.
Exemplo:
# Método „initialize‟ da classe Window_Status def initialize(actor) super(0, 0, 544, 416) @actor = actor refresh end # O método „initialize‟ já foi declarado pela sua superclasse. # Utilizando „super(0, 0, 544, 416)‟ será o mesmo que chamar „initialize(0, 0, 544, 416)‟ # Pois que o comando „super‟ chama o mesmo método, porém, de sua superclasse.
Se você observar os scripts padrões do RPG Maker notará que existem muitas classes que são classes filhas e que suas superclasses são, por sua vez classes filhas de outras superclasses, como exemplo de Window_EquipItem, que é filha de Window_Item, que é filha de Window_Selectable, que é filha de Window_Base, que é filha de Window, que é filha de Object, que é filha de Kernel. (as classes Window, Object e Kernel são classes internas do RGSS, e são impossíveis de serem observadas pelo editor do maker.)
Tópico 5 – Alias
Alias é um comando que serve para alterar o nome dos métodos já criados tanto por superclasses quanto pelas próprias classes. Este comando é muito utilizado por criadores de scripts para não alterar os métodos já existentes nas classes que forem alteradas, apenas adicionando mais comandos aos mesmos. Quando um alias for utilizado ele deve estar dentro da mesma classe que o método em qual o alias deverá alterar o nome, já que não é permitido o uso de expreções como „objeto.método‟. Para utilizar o comando alias basta escrever a palavra „alias‟ seguida do nome a ser alterado do método e o nome original do método. Exemplo:
# Trecho retirado do meu script „Tempo de Jogo‟, linhas 70 à 74. alias dc_tempo_de_jogo_start start def start dc_tempo_de_jogo_start @playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88) End
O alias mudou o nome do método original da classe Scene_Menu de „start‟ para „dc_tempo_de_jogo_start‟, logo depois foi declarado o novo método „start‟, e nele, é chamado o método „dc_tempo_de_jogo_start‟, ou seja, o método „start‟ original, já que seu nome mudou; e depois vem o comando „@playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88)‟. Em outras palavras, é adicionado o comando „@playtime_window = Window_PlayTime.new(@gold_window.x, @gold_window.y - 88)‟ ao método „start‟ da classe referente.
Aula 4 – Estruturas Condicionais e de Repetição
Índice de Tópicos: Tópico 1 – Como Funcionam Tópico 1.1 – Operadores Tópico 2 – Tipos de Estruturas Condicionais Tópico 2.1 – If / Unless Tópico 2.2 – And / Or Tópico 2.3 – Condições Rápidas Tópico 2.4 – Case Tópico 2.5 – Exceções Tópico 3 – Estruturas de Repetição Tópico 3.1 – Loop Tópico 3.2 – While Tópico 3.4 – For
Tópico 1 – Como Funcionam
Na aula 2 foi visto basicamente para que servem e como funcionam as estruturas condicionais, nesta aula iremos nos aprofundar neste vasto assunto. Basicamente, para que as condições ocorram, sempre serão necessários os pseudovalores true e false (vistos na aula 2). Eles decidirão se a condição citada será verdadeira ou não. Os valores true e false sempre irão substituir 2 valores que estejam separados por um operador. Exemplo:
variável == 5 # Os valores „variável‟ e „5‟ estão separados por um operacional „==‟
Logo, só acontecerão condições se a expressão citada na condição tiver valor de „true‟ ou „false‟.
Tópico 1.1 – Operadores
A função dos operadores condicionais é de substituir os 2 valores que ele separa por um valor „true‟ ou „false‟, de acordo com o operador e valores utilizados.
Operadores:
== != > < >= <= # # # # # # Igual à Diferente de Maior que Menor que Maior ou igual que Menor ou igual que
OBS: Tenha cuidado para não confundir os operadores condicionais com os operadores matemáticos. O operador „==‟, por exemplo, é um operador condicional, já o operador matemático „=‟, é utilizado para definir o valor de uma variável, como ja foi visto em aulas anteriores. Para uma maior compreensão do assunto, aqui vai alguns exemplos:
3 == 3 4 == 2 5 == [5] „[5]‟ é uma array) 1_000_000 == 1000000 variável == variável “string” == “string” „string‟ == “” # true # false # false („5‟ é um número, e # # # # true true true false
Tópico 2 – Tipos de Estruturas Condicionais
Como visto na aula 2, existem vários tipos de estruturas condicionais, qualquer uma poderá ser utilizada para qualquer situação, porém algumas serão basicamente mais simples de serem feitas.
Tópico 2.1 – If / Unless
If If, é a estrutura condicional mais utilizada pelo RGSS, para utilizá-lo basta escrever a palavra „if‟ e logo depois os valores, separados por um espaço. Se os valores resultarem em „true‟, o que está dentro da estrutura acontecerá, vejamos um exemplo já citado na aula 2:
if variável == 5 p „sim‟ end
Como os valores „variável‟ e „5‟ estão separados por um operador condicional, o programa irá verificar se o valor de variável é igual a 5, se for, a espreção será substituída por um „true‟, logo, a espreção „p „sim‟‟ será utilizada, mas se „variável‟ não for igual a 5, a espreção será substituída por um „false‟, logo, a espreção „p „sim‟‟ será ignorada. Vamos à aula prática, crie um script acima de todos os outros em seu projeto (acima de todos os outros para que ele ocorra antes dos outros), e digite a seguinte espreção:
p 5 == 5
Agora teste o jogo, verá que o valor que apareceu na tela foi „true‟, pôs como “5 é igual a 5”, a espreção foi substituída pelo valor „true‟. Agora mude a espreção colocando outros valores no lugar dos cincos e teste para ver o que acontece, coloque também números diferentes como „4 == 6‟, e outros tipos de valores que você aprendeu na aula
2, como strings e arrays, por exemplo. Teste também outros operadores, como por exemplo „2 > 1‟. OBS: Note que você não pode utilizar os operadores „>‟, „<‟, „=>‟ e „<=‟ com valores de arrays e strings, porém, você pode utilizar „==‟ e „!=‟, mesmo que não esteja utilizando junto com valores iguais. Exemplo:
“string” == [1, 2, 3] “RPGMaker XP” == “RPGMaker VX” [5, 4, 6] == [7, 2, 0] “string” != [1, 2, 3] “RPGMaker XP” != “RPGMaker VX” [5, 4, 6] != [7, 2, 0] # false # false # false # true # true # true
Unless Basicamente „Unless‟ é exatamente o contrário de „if‟. Exemplo:
# As 2 espreções abaixo resultariam num mesmo resultado: if variável == outra_variável veriável unless variável != outra_variável diferente da outra variável # se variável for igual a outra # se a variável não for
Utilização Alternativa das expressões Como já dito anteriormente existem vários tipos de condicionais além do tradicional explicados acima. Estas formas alternativas são utilizadas com o mesmo conceito das espreções já explicadas, porém com poucas alterações Condições de uma linha Estas são utilizadas quase da mesma forma que a tradicional explicada acima, porém, só têm suporte à um comando. Para utilizá-la faça da mesma forma que foi esplicado, porém, coloque tudo na mesma linha com a palavra „then‟ logo após os valores condicionais. Exemplo:
# condicional comum: if variável == 5 p „sim‟ end # condicional de uma linha: If variável == 5 then p „sim‟ end „sim‟ # se variável for igual a 5, p
Ocorrerá exatamente a mesma coisa que a condicional comum, porém, utilizando um espaço de linhas menor, como mostra o exemplo acima. Você também pode utilizar um else, para definir uma exceção:
# condicional comum: if variável == 5 p „sim‟ else p 'nao' end # condicional de uma linha: if variável == 5 then p “sim" else p 'não' end igual a 5, p „sim‟, se não, p 'não' # se variável for
OBS: Exceções serão vistas ainda nesta aula Condições de um comando Outra forma de resumir uma condicional comum à uma linha é simplesmente colocar o resultado antes da palavra „if‟. Exemplo:
# condicional comum: if variável == 5 p „sim‟ end # condicional de uma linha: p „sim‟ if variável == 5 # p „sim‟, se variável for igual a 5
Tópico 2.2 – And / Or
As palavras „and‟ e „or‟ são extensões para criar condições mais elaboradas e específicas, quando necessário. Elas devem ser colocadas após a condição, e exigem uma segunda condição. Exemplo:
if variável == 5 and outra_variável == 3 end
ou
if variável == 5 or outra_variável == 3 end
Elas representam uma maior necessidade de requisitos para a estrutura. O „And‟ (em inglês, „e‟) indica que ambas as condições deverão ser cumpridas para a estrutura ser ativada. O „Or‟ (em inglês, „ou‟) indica que a estrutura será ativada se qualquer uma condição for ativada. Exemplo:
# A estrutura abaixo será ativada se „variável‟ e „outra_variável‟ forem, # respectivamente iguais a 5 e 3. if variável == 5 and outra_variável == 3 end
# A estrutura abaixo será ativada se „variável‟ ou „outra_variável‟ for, # respectivamente 5 ou 3. if variável == 5 or outra_variável == 3 end
And e Or podem ser usadas quantas vezes forem necessárias, para não haver estruturas dentro de estruturas. Exemplo:
# Lembrando que você aprendeu na aula 2 que variáveis de tipos diferentes serão # sempre variáveis distintas, mesmo que tenham o mesmo nome. if variável == 5 and @variável == 5 and $variável == 5 and VARIÁVEL == 5 end
ou
if variável == 5 or @variável == 5 or $variável == 5 or VARIÁVEL == 5 end
Você pode criar, também, estruturas com „and‟ e „or‟ juntas. Exemplo:
if variável == 5 or @variável == 5 and $variável == 5 or VARIÁVEL == 5 end =begin Para entender este caso, você deve prestar muita atenção, A estrutura só será ativada se uma das variáveis „variável‟ ou „@variável‟ forem 5, E se, além disto, uma das variáveis „$variável‟ ou „VARIÁVEL‟ forem 5. =end
Tópico 2.3 – Condições Rápidas
Estas condições são utilizadas em casos raros, em que o scripter quer criar uma condição com uma exceção de um único comando. Para utilizá-la não é necessário a palavra „if‟, apenas a condição(valor, operador, valor), uma interrogação(„?‟), o comando em caso de a condição ser verdadeira, dois pontos(„:‟), e o comando de exceção. Exemplo:
variável == 5 ? método : outro_método # É claro que você não é obrigado chamar um método, você pode também # utilizar outro comando, como alterar o valor de uma variável: variável == true ? variável = false : variável = true # O exemplo acima é um comando normalmente usado para variáveis que # representam switches, para mudarems eu valor independente de seu valor atual: # Se ela for true, se transforma em false, mas se não for true, # se transforma em true, pôs logicamente é false.
OBS: O comando „Toogle Switch‟(do maker 2003) foi extinto exatamente pelo fato de ele poder ser facilmente feito por scripts, como mostra o exemplo acima. É sempre bom lembrar que, como o ruby ignora os espaços em branco sempre que há necessidade de um novo valor, as condições rápidas podem ser expressas da seguinte forma, facilitando sua compreensão:
variável == true ? variável = false : variável = true # Se variável for true... # Ela se transforma em false, # Se não, ela se transforma em true
Logo, as condições rápidas também podem ser utilizadas várias veses de uma só vez: Código:
# O trecho abaixo foi retirado da classe Window_Base do RMXP, linhas 301 a 305. # Desenhar HP self.contents.font.color = actor.hp == actor.maxhp ? Color.new(64,255,128) : actor.hp <= actor.maxhp / 5 ? knockout_color : actor.hp <= actor.maxhp / 2 ? crisis_color : normal_color # Note como as condições são repetidas várias vezes. # As condições rápidas são apenas para diminuir o número de linhas utilizadas # por condições mais simples, pois, apesar de este exemplo estar em várias linhas, # ele poderia ter sido feito em apenas uma linha, eliminando os espaços. # Você não é obrigado a entender este exemplo agora, pôs já é algo mais avançado, # e por tanto não será cobrado até que você se especialize em scripts.
Tópico 2.4 – Case
A estrutura condicional Case, tem o mesmo objetivo da estrutura if, porém mais fácil de programar em certas situações. Com ela você irá definir um comando (ou mais) para o caso de cada possível valor de uma determinada variável. Em outras palavras, executará um comando diferente para cada valor que a variável tiver. Para usá-lo, utilize a palavra case, seguida de uma variável, e nas linhas abaixo, as palavras when, seguidas do possível valor da variável, e no final um „end‟, para determinar o fim da estrutura.
# Trecho retirado da classe Scene_Tile, do RMVX, linhas 66 à 73. case @command_window.index # Caso o cursor esteja no botão: when 0 # 0, executa o método „command_new_game‟ command_new_game when 1 # 1, executa o método „command_continue‟ command_continue when 2 # 2, executa o método „command_shutdown‟ command_shutdown end
Você pode utilizar vários valores em cada „when‟, para não precisar repeti-lo, utilizando todos os valores possíveis separados por vírgulas. Vamos fazer um teste, abra o editor de seu projeto e vá na linha 67, e onde tem o 0(zero), coloque 0, 1, 2; e teste o jogo. Você perceberá que não importa qual botão você clicar, todas irão redirecioná-lo ao new game, pôs você definiu que se o cursor estiver em qualquer um dos botões 0, 1 e 2; eles irão levá-lo para o método „new_game‟ (que está logo abaixo do when 0, 1, 2). Você poderá também utilizar um „else‟, entre o último „when‟ e o „end‟, para determinar uma exceção. (exceções serão vistas ainda nesta aula) Exemplo 1: (string)
sabor_do_biscoito = “morango” case biscoito when “chocolate” # o biscoito é de chocolate when “morango” # o biscoito é de morango when “limão” # esse biscoito é ruim >_< End
Exemplo 2: (range)
preço_do_biscoito = 5 case biscoito when 0 ... 2 # que biscoito barato when 3 ... 6 # o biscoito está num preço normal when 7 ... 1_000_000 # biscoito de ouro end
Tópico 2.5 – Exceções
Exceções são o que acontecerão no caso de a condição da estrutura não for cumprida corretamente. As estruturas condicionais poderão, ou não ter exceções (exceto a „condição rápida‟, que é obrigatório o uso de exceções). Para definir exceções utilize a palavra „else‟.
if variável == 5 # variável é 5 else # variável não é 5 end
Exceções podem ser utilizadas também nas estruturas case.
case power_ranger when “Azul”, “Verde”, “Vermelho”, “Preto” # Homem when “Rosa”, “Amarelo” # Mulher else end
Exceções Condicionais As Exceções condicionais são um tipo de exceção utilizado somente nas condicionais if e unless. Elas representam uma segunda condição dentro da exceção da condição principal. Para determinar uma exceção condicional utilize a palavra „elsif‟, ao invés de „else‟, seguido da condição. Exemplo:
if variável == 0 # condição elsif variável == 1 # exceção condicional else # exceção end
Note que o exemplo acima poderia ser representado da seguinte forma:
if variável == 0 # condição principal else if variável == 1 # segunda condição dentro da exceção da condição principal else # exceção da segunda condição end end
Tópico 3 – Estruturas de Repetição
As estruturas de repetição são estruturas que irão executar os comandos determinados repetidamente um determinado número de vezes, ou até você determinar o seu término. Existem vários tipos de estrutura de repetição, cada uma é trabalhada de uma forma diferente, existindo assim uma estrutura diferente para cada caso.
Tópico 3.1 – Loop
Os loops são estruturas em que deverão ser definidos alguns comandos e os mesmos ficarão sendo executados, até que o comando de finalização do loop seja chamado. Em Ruby, os loops são trabalhados de forma exatamente igual aos loops dos eventos do RPGMaker. Para iniciar um loop, use o comando „loop do‟, e use a palavra „break‟ para “quebrar” o loop, não esqueça de que o loop, por ser uma estrutura, precisa de um end, para determinar seu fim. Exemplo:
# Trecho retirado da classe Scene_Base, do RMVX, linhas 16 até 21. loop do Graphics.update Input.update update break if $scene != self end
Note que o comando „break‟, está em uma condição: „break if $scene != self‟, ou seja, o loop só será quebrado no caso de a variável „$scene‟ for diferente ( != ) de „self‟. „self‟ será visto mais profundamente no futuro, „self‟ representa a própria classe em que foi escrito. Caso a condição de „$scene‟ ser diferente de „self‟ não for cumprida, chegará no final sem um „break‟, logo, ela irá recomeçar a partir do primeiro comando. (neste caso, „Graphics.update‟)
Tópico 3.2 – While
While é uma estrutura muito semelhante ao loop, porém, é trabalhada de forma diferente. Em while, você deve descrever uma condição para uma quebra de estrutura logo após a declaração do início da estrutura. Exemplo:
# Trecho retirado do script Main, do RMXP, linhas 36 à 38. while $scene != nil $scene.main end
Na mesma linha da declaração do início da estrutura, foi declarada uma condição para a quebra da estrutura (se $scene != nil). A estrutura será repetira sempre que a condição não for cumprida, e será quebrada no caso de esta condição não for cumprida, ou no caso do uso da quebra de estruturas „break‟.
Tópico 3.3 – For
A estrutura diferente das citadas acima, por trabalhar com um valor que irá mudar de acordo com o número de vezes que a estrutura já foi repetida. Para chamar esta estrutura, utilize a palavra „for‟, seguida de uma variável que não precisa estar declarada, neste caso, você já estará declarando a variável; depois a palavra in, e por último uma range ou uma array, pré determinada. A variável escolhida terá, inicialmente, o primeiro valor da range ou array. A cada vez que a estrutura for repetida, a variável declarada, passará a ter o próximo valor da range ou da array, até chegar em seu último valor, neste caso, a estrutura será quebrada. Exemplo:
# Exemplo retirado da classe Window_Command, do RMXP, linhas 31 à 33. for i in 0...@item_max draw_item(i, normal_color) end
Percebe-se que o método „draw_item‟, é um método que necessita de dois valores, por isso os parênteses, com as duas variáveis separadas por vírgula, „i‟ e „normal_color‟. Cada vez que a estrutura for repetida, a variável „i‟ terá um valor diferente, sendo este valor um valor que virá dês de 0, até o valor da variável @item_max, por exemplo: se @item_max for 3, a cada vez que a estrutura for repetida, i terá um valor de: 0, depois 1, depois 2, e por último 3. Logo, se @item_max for 3, a estrutura acima seria o mesmo que o exemplo abaixo:
draw_item(0, draw_item(1, draw_item(2, draw_item(3,
normal_color) normal_color) normal_color) normal_color)
Este tipo de estrutura é muito útil, quando você quer utilizar várias veses um mesmo comando, porém com valores diferente, exatamente como os exemplos citados acima.
Aula 5 – Revisão e Classes do RGSS
Índice de Tópicos: Tópico 1 – Classes e Módulos Tópico 1.1 – Herança Tópico 2 – Revisão e Complemento Tópico 2.1 – Valores numéricos Tópico 2.2 – String Tópico 2.3 – Array Tópico 2.4 – Hash Tópico 2.4 – Ragexp Tópico 2.5 – For Tópico 3 – Funções Exclusivas do RGSS Tópico 3.1 – Classes Internas do RGSS
Tópico 1 – Classes e Módulos
Ruby é uma linguagem de programação que se baseia num sistema de objetos, as classes. Cada possível valor será considerado uma classe, ou seja, um objeto. Cada classe tem vários métodos, que são os comandos possuídos pelas classes, sem os métodos, as classes não seriam nada, e vice-versa. Módulos são parecidos com as classes, porém, estas não precisarão ser declaradas, além de poderem ser utilizadas a partir de qualquer parte do jogo. Você também pode chamar constantes dos módulos, utilizando o comando „Módulo::Constante‟.
Tópico 2.1 – Herança
Classes que têm uma herança em relação a outras, terão todos os métodos de sua superclasse, ou “classe mãe”. As classes também podem herdar os métodos de um Módulo ao utilizar o comando „Include.Método‟ dentro da classe desejada.
Tópico 2 – Revisão e Complemento
Existem 4 tipos di variáveis: local, de instância, global e constante. Variáveis locais devem ser declaradas e usadas num mesmo método de uma classe ou de um módulo(variável). Variáveis de instância devem ser utilizados somente na classe ou método em que foram declaradas(@variável). Variáveis de instância pública são determinadas variáveis de instância que poderão ser acessadas por outras classes ou módulos(@classe.variável). Variáveis globais poderão ser acessadas por qualquer classe, ou até mesmo pelos eventos($variável). Constantes são variáveis que terão sempre um determinado valor (CONSTANTE ou Constante ou Módulo::Constante).
Tópico 2.1 – Valores Numéricos
Valores numéricos são aqueles representados por números. Existem 2 tipos de valores numéricos: Integer e Float. Integer (Números Inteiros) são números que podem ser negativos, ou positivos, exemplo:
... , -3 , -2 , -1 , 0 , 1, 2 , 3 , ...
Float (Números Decimais) são números que estão entre um número inteiro e outro, exemplo:
... , 0.7 , 0.8 , 0.9 , 1.0, 1.1 , 1.2 , 1.3 , ...
OBS: Note que um valor Float não se transformará em integer se ele terminar com „.0‟. Note também que uma Integer, quando dividida por um valor inadequado (10/3, por exemplo) será arredondado (o resultado seria 3), porém, em float(10.0/3) resultaria no valor correto(3.333...). Logo, o valor Float é utilizado somente em raros casos, o HP dos personagens, por exemplo, é uma Integer. (Imagine se seu HP ficasse “3.333...” entendeu agora porque ele fica em Integer ao invés de Float?) Os Integer são divididos em dois grupos: Fixnum, e Bignum. Fixnum serão Integers pequenas (com valores pequenos), enquanto Bignums (valores raramente usados) são números que excedem o limite da memória para estes valores. Exemplo:
1, 2, 3, 4, 5, 6, ... 1_000_000_000_000 # Fixnum # Bignum
OBS: Lembre-se que Bignum e Fixnum são classes filhas de Integer, logo, um Float nunca será um Bignum ou Fixnum, exemplo:
1_000_000_000_000 1_000_000_000_000.0 # Bignum # Float
Representação das classes que representam valores numéricos:
Numeric > > Integer Float > > Fixnum Bignum
Tópico 2.2 – Strings
Strings são valores em textos (palavras, etc.). Devem ser colocados dentro de parênteses. As strings podem exibir valores de variáveis utilizando o comando „#{variável}‟ dentro da string. Exemplo:
memória_ram = 516 “A sua memória RAM é de: #{memória_ram} Mb.” # O programa interpretará o texto acima desta forma: # “A sua memória RAM é de: 516 Mb.”
# É claro que alterando o valor de „memória_ram‟ obteríamos outros valores memória_ram = 256 # Agora, o programa interpretará o texto da seguinte forma: # “A sua memória RAM é de: 256 Mb.”
Métodos A classe String possui alguns métodos extremamente úteis para casa tipo de situação, estes métodos podem ser complexos para serem compreendidos, e não serão utilizados com grande freqüência no ruby, portanto não é obrigatório o compreendimento de cada um deles. Os principais são: downcase/upcase, sub/gsub e scan. Downcase e Upcase Downcase e Upcase alteram cada letra contida na String entre letras minúsculas e maiúsculas. Downcase e Upcase são métodos que alterarão o valor da String somente no momento em que forem utilizados, para alterar o valor da String permanentemente, são utilizados uma exclamação (“!”) após as palavras downcase e upcase. Exemplo:
string = “Pipoca Salgada” string.upcase # PIPOCA SALGADA string.downcase # pipoca salgada string # Pipoca Salgada string.upcase! string # PIPOCA SALGADA string.downcase! string # pipoca salgada
Sub e Gsub Sub e Gsub são comandos utilizados para uma substituição de determinadas palavras da String por outras palavras. Para utilizar os comandos Sub e Gsub é necessário após chamar o método, um valor a ser substituído (será colocado entre parênteses) e um valor a substituir (será colocado entre chaves). A única diferença entre Sub e Gsub é que Gsub irá substituir todos os trechos da String que conhecidirem com o valor entre parênteses, e Sub irá substituir somente o primeiro valor encontrado, como mostra o exemplo a seguir:
pipoca = “Pipoca Salgada” pipoca.sub(“Salgada”){“Doce”} pipoca # “Pipoca Doce” texto = “o rato roeu a ropa do rei de roma” texto.gsub(“r”){“l”} text # “o lato loeu a lopa do lei de loma”
Scan Scan é um método utilizado para recolher uma array com todos os valores do texto desejado. Exemplo:
texto = “o rato roeu a ropa do rei de roma” text_escaneado = texto.scan(“ro”) texto_escaneado # [“ro”, “ro”, “ro”]
Tópico 2.3 – Array
Arrays são tipos de valores que podem guardar vários valores diferentes, como mostra o exemplo abaixo:
array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: #{variável}”, 8] ] # Cuidado para não confundir um valor com o outro, eles são sempre separados por vírgulas
Cada valor contido em uma Array tem um id, que corresponde a sua posição, dentro da Array, começando a contagem do 0 (zero). Exemplo:
array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: #{variável}”, 8] ] =begin id 0: 4 id 1: [16, [0, 82], 39.4] id 2: “texto” id 3: 1_000_000 id 4: [“variável: #{variável}”, 8] ] =end
Você pode alterar diretamente um único valor de uma array, colocando seu id entre chaves logo após o nome da array. Exemplo:
array = [] array[0] = array[1] = array[2] = array[3] = variável = array[4] = # Declara a variável „array‟ 4 [16, [0, 82], 39.4] “texto” 1_000_000 10 [“variável: #{variável}”, 8] ]
# a variável „array‟ passará a ter o seguinte valor: # array = [4, [16, [0, 82], 39.4], “texto”, 1_000_000, [“variável: 10”, 8] ]
Você pode utilizar os valores dentro da array da mesma forma que outra variável qualquer. Exemplo:
array = [1, 2, 3] array[1] = 3 array[2] = 9 array[0] -= 1 # array agora esta assim: [0, 3, 9]
OBS: Ao tentar selecionar um valor ainda não declarado pela array, ele será nil, exemplo:
array = [1, 2] # array[2] é nil, array[3] é nil, array[4] é nil... array[3] = 4 # array agora esta assim: [1, 2, nil, 4]
Você também pode adicionar determinados novos valores à array, simplesmente somando uma array com outra. Exemplo:
array = [1, 2, 3] array += [4, 5, 6] # array agora está assim: [1, 2, 3, 4, 5, 6]
Você pode selecionar também uma determinada quantidade de valores de uma única vez, utilizado dois valores, dentro das chaves. O primeiro determinará o id do primeiro valor a ser alterado, o segundo determinará a quantidade de valores que deverão ser selecionados. Exemplo:
array = [0, 0, 0, 0, 0, 0, 0, 0] array[1, 6] = [1, 1, 1, 1, 1, 1] # array agora está assim: [0, 1, 1, 1, 1, 1, 1, 0] array[1, 6] = 1 # array agora está assim: [0, 1, 0]
Métodos Por ser uma classe, Array tem alguns métodos que deverão ser utilizados de acordo com a situação. Os principais métodos de Array são: clear, compact, delete/delete_at, empty?, include?, index, length/size, nitems, shift/unshift, push/pop, reverse/sort. Clear Clear é um comando muito simples, que apaga a array, é o mesmo que redeclarar a array. Exemplo:
array = [] # Declara a variável „array‟
array[0] = 4 array[1] = [16, [0, 82], 39.4] array[2] = "texto" array[3] = 1_000_000 array[4] = ["variável: 10", 8] array += [4, 5, 6] array[1, 3] = [1, 2, 1] # array agora está assim: [4, 1, 2, 1, ["variável: 10", 8], 4, 5, 6] array.clear # array agora está assim: []
Compact Compact é um simples comando que elimina todos os valores „nil‟ da array. Exemplo:
array = [1, 2] array[6] = 0 # array agora esta assim: [1, 2, nil, nil, nil, nil, 0] =begin array.compact será: [1, 2, 0] note que o comando „compact‟ não altera o valor verdadeiro da array. (assim como downcase/upcase, das strings) assim, como downcase/upcase, compact também poderá ser utilizado com uma exclamação para alterar definitivamente o valor da array =end array2 = array.compact # array ainda está assim: [1, 2, nil, nil, nil, nil, 0] # array2, está assim: [1, 2, 0] array.compact! # agora, array está assim: [1, 2, 0]
Delete e Delete_at Delete e Delete_at são commandos extremamente parecidos, porém utilizados de forma diferente. Ambos têm a função de eliminar um determinado valor da array, alterando assim toda a estrutura, e conseqüentemente, os ids de cada um dos valores que estiverem posicionados após o valor eliminado. Para utilizar o „Delete‟ é necessário especificar o valor a ser deletado na array, logo após o comando. O programa irá procurar por todos os valores especificados, que a array guardar, e apagá-los. Exemplo:
array = [1, 2, 3, 2, 1, 2, 3, 1, [1, 2, 3]] array.delete(2) # array agora está assim: [1, 3, 1, 3, 1, [1, 2, 3]] array.delete(1) # array agora está assim: [3, 3, [1, 2, 3]] array.delete(3) # array agora está assim: [[1, 2, 3]] array.delete([1, 2, 3]) # array agora está assim: []
Já o comando „Delete_at‟, apaga apenas o valor que estiver na posição definida ao chamar o comando. Exemplo:
array = [1, 2, 3, 2, 1, 2, 3, 1] array.delete_at(2) # array agora está assim: [1, 2, 2, 1, 2, 3, 1] array.delete_at(0) # array agora está assim: [2, 2, 1, 2, 3, 1] array.delete_at(4) # array agora está assim: [2, 2, 1, 2, 1]
Empty? O comando empty, é utilizado em condições, ele será substituído por true, ou false sempre que for chamado, sendo true se a array tiver valor „[]‟ (nenhum valor), e false se ela tiver ao menos um único valor. Exemplo:
if array.empty? # a array está vasia else # a array tem algum valor end
Exemplo 2:
array.clear if array.empty? print “a array está vasia” end =begin Não importa qual valor array tinha antes do comando „array.clear‟, a condição será cumprida, pôs todos os valores da array foram apagados no comando „array.clear‟. =end
Include? A forma de utilizar o comando „Include?‟ é extremamente semelhante ao comando „empty‟ pelo fato de ambos se referirem a uma condição. O comando „Include?‟ verifica se a array têm algum valor específico. Exemplo:
if array.include?(5) # dentro de array, existe um 5 else # dentro de array, não existe nenhum 5 end
Index Index seleciona o id de um determinado valor. Se a Array tiver mais do que um valor especificado, será selecionado o id do primeiro valor, se a Array não possuir nenhum valor igual ao especificado, o comando será substituído por nil. Exemplo 1:
array = [1, 2, 3] id = array.index(2)
# neste caso, id é 1
Exemplo 2:
array = [1, 2, 3, 2, 1] id = array.index(2) # neste caso, id é 1 id = array.index(1) # neste caso, id é 0
Exemplo 3:
array = [1, 3, 1, 3] id = array.index(2) # neste caso, id é nil
length/size Este comando é bem simples, ele seleciona o tamanho da Array, ou seja, o número de valores contidos na mesma. Exemplo:
array = [1, 2, 3] array.length # neste caso, será 3
array = [0, 0, 0, 0, 0, 0] array.size # neste caso, será 6 array = [] array.length # neste caso, será 0
array = [“texto 01”, “texto 02”, “texto 03”] array.size # neste caso, será 3
OBS: Observe que não há qualquer diferença entre os comandos „length‟ e „size‟, é apenas a palavra. Nitems Seleciona o número de valores não „nil‟ existentes na array. Exemplo:
array = [1, 2, 3, 4, 5] array.nitems # neste caso, será 5 array = [1, nil, 3, nil, 5] array.nitems # neste caso, será 3 array = [] array.nitems # neste caso, será 0
array = [nil, nil, nil] array.nitems # neste caso, será 3 array = [0, nil, 1, nil, nil, 2, nil] array.nitems # neste caso, será 3
OBS: Note que nitems será igual a size/length sempre que não existir nenhum nil, na array.
Shift/Unshift Shift e Unshift são comandos utilizados para adicionar ou remover elementos, de id 0 da array. O comando Shift irá remover o primeiro elemento da array, e Unshift adiciona um novo elemento a array, que virá como id 0, mudando a posição dos outros valores da array. Exemplo:
array = [1, 2, 3] array.shift # array, agora está assim: [2, 3] array.unshift(1) # array, agora está assim: [1, 2, 3]
Push/Pop Push e Pop são comandos extremamente parecidos com Shift e Unshift, a única diferença é que os comandos Push e Pop trabalham com o último valor da array, diferente de Shift e Unshift, que se referem ao primeiro valor da array. Exemplo:
array = [1, 2, 3] array.pop # array, agora está assim: [1, 2] array.push(3) # array, agora está assim: [1, 2, 3]
Sort e Reverse Sort é um Comando que organizará a array em uma ordem fixa, e reverse inverterá a array para que sua ordem de valores fique na ordem inversa. Uma array não pode conter tipos diferentes de valores quando utilizar o comando „sort‟, pois neste caso ocorrerá um erro. Se a array conter somente valores numéricos, ela será organizada por ordem de valores do menor para o maior, se ela conter somente textos (strings) ela será organizada em ordem alfabética, e se ela conter somente arrays, seus valores devem conter somente um mesmo tipo de valor, e assim sucessivamente. Exemplo:
array = [5, 8, 9, 7, 4, 2, 6, 8] array.sort # array, agora está assim: [2, 4, 5, 6, 7, 8, 8, 9] array.reverse # array, agora está assim: [9, 8, 8, 7, 6, 5, 4, 2] array = [“Dark Chocobo”, “Jão Rafael”, “Cabana Ruby”, “Reino RPG”] array.sort # array, agora está assim: [“Cabana Ruby”, “Dark Chocobo”, “Jão Rafael”, “Reino RPG”] array = [“Dark”, “Chocobo”, “Jão”, “Rafael”, “Cabana”, “Ruby”, “Reino”, “RPG”]
array.sort # array, agora está assim: [“Cabana”, “Chocobo”, “Dark”, “Jão”, “Rafael”, “Reino”, “RPG”, “Ruby”]