Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


    Lição 11 - Programação: Herança, Alias e modelagem de Procedimentos

    avatar
    Nothing
    Iniciante
    Iniciante


    Mensagens : 43
    Créditos : 8

    Lição 11 - Programação: Herança, Alias e modelagem de Procedimentos Empty Lição 11 - Programação: Herança, Alias e modelagem de Procedimentos

    Mensagem por Nothing Qua Jan 05, 2011 8:31 am

    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[i] == 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[i] = [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[i])
    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 ??"
    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[i].id] = 5
    end
    #Para ler os valores:
    for i in 0...$game_party.actors.size
    print $preguica[$game_party.actors[i].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[i].id] = 5
    end
    #Para ler os valores:
    for i in 0...$data_actors.size
    print $preguica[$data_actors[i].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á.

      Data/hora atual: Sex Nov 22, 2024 7:30 pm