Forums » RGSS

Lição 10 - Arrays - Fundamento e Utilização

    • 683 posts
    2 de junho de 2015 18h11min14s ART

    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.

    Citar
    array - Dicionário Michaelis
         arranjo; estrutura ordenada contendo elementos acessíveis 
    individualmente referenciados por números, usada para armazenar tabelas ou conjuntos de dados relacionados e de mesmo tipo;


    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:

    Código:
    if var0 == 5

    elsif var1 == 5

    elsif var2 == 5

    elsif var3 == 5

    elsif var4 == 5

    end


    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...

    Código:
    for i in 0... var.size #Ignorando que eu sei a quantidade de itens
    if var == 5

    end
    end


    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:

    Código:
    for i in 0... 50
    var = [10,2,"Maluco","Doido",0,""]
    end


    Você vai criar 50 itens, cada um com 6 itens internos, ou seja 300 itens.
    Podemos usar também o método push, assim:

    Código:
    for i in 0... 50
    var.push(10,2,"Maluco","Doido",0,"")
    end


    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á:

    Código:
    def setup_starting_members
        @actors = []
        for i in $data_system.party_members
          @actors.push($game_actors)
        end
      end


    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:

    Citar
    party_members 
    The initial party. An array of actor IDs. 
    A equipe inicial. Um array com o ID dos heróis.


    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:

    Código:
    def [](actor_id)
        if actor_id > 999 or $data_actors[actor_id] == nil
          return nil
        end
        if @data[actor_id] == nil
          @data[actor_id] = Game_Actor.new(actor_id)
        end
        return @data[actor_id]
      end


    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 ??"
    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:

    Código:
    for hero in $data_actors
    $preguica[hero.id] = 0
    end


    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:

    Código:
    #Para setar os valores:
    for i in 0...$game_party.actors.size
    $preguica[$game_party.actors.id] = 5
    end
    #Para ler os valores:
    for i in 0...$game_party.actors.size
    print $preguica[$game_party.actors.id].to_s
    end


    Podemos usar a var $data_actors:


    Código:
    #Para setar os valores:
    for i in 0...$data_actors.size
    $preguica[$data_actors.id] = 5
    end
    #Para ler os valores:
    for i in 0...$data_actors.size
    print $preguica[$data_actors.id].to_s
    end


    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á.