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