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

Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir para baixo  Mensagem [Página 1 de 1]

Fetelk13

Fetelk13
Membro Honorário I
Membro Honorário I
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

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
<condição>
elsif var1 == 5
<condição>
elsif var2 == 5
<condição>
elsif var3 == 5
<condição>
elsif var4 == 5
<condição>
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
<condição>
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:





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

http://elementosrpgmakerbr.forumeiros.com/forum

Ver o tópico anterior Ver o tópico seguinte Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos