Como eu também não podia deixar de dedicar um tópico ao Aniversário do JogosRPG, vamos ver hoje um dos temas de programação mais complexos(para muitos). as Variáveis ARRAY. Vou começar tentando explicar o que é e como funciona.
Imagine que você precise de 5 variáveis, que serão uma sequência (var0,var1,...,var4). quando você declara uma var, o sistema aloca (monta) um espaço na memória do computador para aquela var. Se você declarou 5, o Sistema vai alocar 5 espaços, e criar 5 endereços para elas (O endereço é pro sistema saber onde ele está, igual quando você pede o endereço daquela menina linda lá da escola ;D ). Dependendo da utilização, você vai gastar toneladas de IFs para verificar os valores dessas variáveis. O Array simplifica essa declaração, primeiro que o sistema alocará um espaço maior, mas com apenas um endereço de memória. O que faz com que o sistema as diferencie é a indexação. Ao invés de você criar 5 vars assim:
var0,var1,var2,var3,var4 = 0,0,0,0,0
Você cria assim:
var = [0,0,0,0,0]
Agora, se você quiser saber o valor de uma delas, nas duas maneiras é fácil:
if var1 == 0 ...
if var[1] == 0 ...
Mas e para saber um valor em uma determinada??
Na programação, usamos muito duas funções:
- Condições(if,elsif,[ ? : ])
- Estruturas de repetição(while,for,loop do,until)
Nas condições, podemos perguntar uma por uma, sem problema:
aqui, testamos uma por uma, para saber qual delas tinha o valor igual a 5.
Mas imagine quantas linhas você gastaria se fossem, ao invés de 5, 50 ?
Agora, usando uma Estrutura de repetição e a declaração do array...
Parece confuso... array, indexação...
Você com certeza já entendeu o que é indexação. é uma forma de "numerar" objetos, de forma a nos referenciarmos a ele pelo seu numero.
Quando você cria uma janela de comandos com 5 itens, a indexação dela vai de 0 a 4. A indexação facilita o não-uso de nomes para distinguir objetos dentro de um array. Sim, uma janela de comando é um array. Sempre que você criar um objeto que usa indexação, indiretamente você está criando um array.
O RGSS ainda permite algo muito maior. Um array pode conter Vários itens dentro de cada item. Significa que se você declarar assim:
Você vai criar 50 itens, cada um com 6 itens internos, ou seja 300 itens.
Podemos usar também o método push, assim:
Eu sei, tá cada vez mais confuso... Vamos citar um exemplo.
No Scene_Title, quando você inicia o game, ele cria a seguinte array:
$game_party = Game_Party.new
?? Array ?? mas ele não está declarando uma classe ??
Sim, mas olha só essa declaração:
$game_party.setup_starting_members
Aqui, o jogo coloca na var $game_party os heróis que irão começar o jogo. Vamos á classe Game_Party para ver como ela funciona?, aqui está:
Observe que ele usa como referencia outras duas vars, a $data_system e a $game_actors. Olha a definição de party_members na var data_system:
Observando a função setup_starting_members, vemos que a estrutura for não usa numeros. Neste caso, ela conta os itens, independente de numeração. Chamamos este tipo de for como for each, usado largamente em outras linguagens. A função usa o método push para colocar em sua var @actors, que é um array(olha a declaração,@actors = []) os Heróis contidos na var $game_actors.
A classe Game_Actors, por sua vez, é criada um array na sua inicialização(@data = []) E este array contem todos os heróis do database, observe o procedimento:
Então quando você declara $game_actors[ID], ela verifica se há realmente este ID de herói, e declara na array @data a Classe Game_Actor. Vamos a ela:
Logo no initialize, ela chama o procedimento setup, passando como parametro o ID do herói:
actor = $data_actors[actor_id]
Então, TODAS ESTAS CLASSES, PARA MOSTRAREM UM HERÓI NO GRUPO, USAM DE ARRAYS E INDEXAÇÃO.
Ae você vai me dizer "Mas onde ele usou indexação ??"
O ID do heroi..., um único número, que faz com que toda essa avalanche de código funcione. Podemos ver o quanto a indexação é primária no caso de arrays. Agora vem a parte boa...
Tá bom, o RGSS sabe usar as arrays, e eu, como fico nessa estória ??
Você pode usar arrays de milhares de formas. Suponhamos que você queira criar uma atributo novo qualquer para os heróis. O atributo "preguiça" por exemplo. Você não tem que desmachar o módulo Actor para fazer isso. Lá no Scene_Title, declare a var, assim:
$preguica = []
Agora, com um simples for, crie o array relacionado aos heróis:
Agora, você tem uma var preguiça para cada herói de seu database. Quando quiser mudar o valor ou saber o valor, basta usar o ID do herói em questão. Olha a bagunça:
Podemos usar a classe Game_Party:
Podemos usar a var $data_actors:
Por hoje é só. Foi apenas uma pincelada sobre arrays. A programação é algo extenso, que depende mais de estudo e testes do que simplesmente leitura. Na próxima aula, falaremos mais sobre janelas, e começaremos a ver a contrução da classe de desenho principal, os Spritesets. Até lá.