Pseudo-arrays, como funcionam e + exemplos de uso

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por GameMakerTutoriais em Qui 17 Jan 2013, 17:46




Pseudo-arrays

Antes de usar as duas fórmulas pra começar a mexer com matrizes, você tem que ter em mente duas regrinhas que vou comentar logo abaixo. As fórmulas são facílimas, mas se já sabe, não custa relembrar: vai ser relevante nas observações ao longo dos exemplos...

  1. Um array unidimensional (ex. “array[X]”) pode ter um range (intervalo) de índices (posições) que vai de 0 (zero) até 31999, portanto, 32000 índices.

  2. Um array bidimensional (ex. “array[X, Y]”) permite o mesmo limite de índices usado no unidimensional (32000) pra cada vetor (X ou Y), desde que o número total de índices (X * Y) não exceda 1.000.000 (10^6).


Salve os dois scripts abaixo com os nomes “v4” e “v6”, respectivamente. Vou explicar como funciona cada um.

v4:
Código:
return ((argument0 << 5) | argument1);

v6:
Código:
return (argument0 * 100 + argument1 * 10 + argument2);

Pra implementar mais de dois vetores na matriz (ex. “array[X, Y, Z]”), o limite do range que já era imposto para o uni ou bidimensional tem que ser respeitado. Já sabemos quais são esses limites.

Como o número de índices que estamos usando é dado pela multiplicação dos vetores (“X * Y” ou “X * Y * Z”), o limite do range de cada um desses vetores será obtido pela raiz quadrada (pra 2 vetores, no primeiro exemplo) ou cúbica (pra 3 vetores, no segundo exemplo).

Vamos considerar agora que os limites de range impostos pelo GM sejam A = 32000” e B = 10^6”.

Uma das velhas regrinhas de radiciação nos diz que: para conseguirmos a raiz de um número qualquer (seja ela: quadrada, cúbica, quarta, quinta, etc., ou seja, quantos vetores nós usaremos na matriz), devemos elevar esse número (potencializar A ou B) onde o expoente deve ser a razão inversa da base (por exemplo, a razão inversa da base 3 é igual a “3 ^ -1” ou “1 / 3”).

Partindo daí, teremos:

  • A raiz quadrada de A é igual a “R = A ^ 1/2”. Nossa matriz terá dois vetores (X e Y) e o limite de índices é R para cada vetor. Esse array gera (R * R) possibilidades.

  • A raiz cúbica de B é igual a “R = B ^ 1/3”. Nossa matriz terá três vetores (X, Y e Z) e o limite de índices é R para cada vetor. Esse array gera (R * R * R) possibilidades.

  • A raiz quarta de A é igual a “R = A ^ 1/4”. Nossa matriz terá quatro vetores (W, X, Y e Z) e o limite de índices é R para cada vetor. Esse array gera (R * R * R * R) possibilidades.

  • ...e assim por diante. Agora que já entendemos como funcionam esses limites, podemos usar os scripts. É a parte mais fácil.


O script v6:

O script “v6” divide um vetor do array uni ou bidimensional em três novos vetores. Por exemplo: “array[v6(X, Y, Z)] ou array[v6(A, B, C), v6(X, Y, Z)]”. O limite que o GM impõe de (10^6) índices para o total de índices é levado em conta. Portanto, o script v6 retorna sempre um número de 0 a 999 (1000 índices), pois 1000 * 1000 = 10^6 possibilidades. O alcance máximo de cada vetor do script é de 10 (0 a 9).

O script v4:

O script “v4” divide um vetor do array uni ou bidimensional em dois novos vetores. Por exemplo: “array[v4(X, Y)] ou array[v4(A, B), v4(C, D)]”. Novamente, o limite de (10^6) é considerado. O script também vai sempre retornar um número menor que 1000, sendo que o alcance máximo de cada vetor do script é de 31 (0 a 30), pois 31 ^ 4 = 923521 < 10 ^ 6 possibilidades. Sempre respeite esse limite.

Outros exemplos:

Código:
array[A, v4(B, C)] = 0;
array[v4(A, B), C] = 0;
array[v4(A, B), v4(C, D)] = 0;

Código:
array[A, v6(B, C, D)] = 0;
array[v6(A, B, C), D] = 0;
array[v6(A, B, C), v6(D, E, F)] = 0;

Código:
array[v4(A, B), v6(D, E, F)] = 0;
array[v6(A, B, C), v4(D, E)] = 0;


E quando eu precisar de mais índices, sem limites?

É possível, mas é um pouco mais complicado. Uma maneira legal (mas que requer um pouco de atenção) é o uso de ds_grids (tem tutoriais sobre ds_grids no fórum, então vou colocar só o necessário, pressupondo que você já conheça).

Você pode criar duas ou mais ds_grids, indexar uma dentro da outra e usar um script pra retornar determinado valor da última grid em profundidade. É um jeito mais complicado, mas funciona muito bem. Por exemplo:

Código:
// Vamos considerar que os dois vetores dessa grid sejam A e B
meu_array = ds_grid_create(10, 10); // criamos uma grade com 100 índices no total.

// criamos outra ds grid e colocamos o id dentro da posição X = 0 e Y = 0
ds_grid_add(
    meu_array,
    0,
    0,
    ds_grid_create(10, 10)
    )

Cada nova grid criada, nessa camada de grids, terão os vetores reconhecidos como C e D. A partir disso, vamos criando quantas grids forem necessárias e com o tamanho que convier. Agora podemos criar um script pra colocar ou retirar um valor no array:

Código:
// põe um valor na matriz
// vpush(A, B, C, D, valor)

ds_grid_add(
    ds_grid_get(
        meu_array,
        argument0,
        argument1
        ),
    argument2,
    argument3,
    argument4
    )


Código:
// pega um valor dentro da matriz
// vpop(A, B, C, D)
return (
    ds_grid_get(
    ds_grid_get(
        meu_array,
        argument0,
        argument1
        ),
    argument2,
    argument3
    )
)

É bom lembrar que argumentos usados em scripts também são um vetor de 16 índices (0 a 15) e podem ser usados como “argument[X]”. Isso aumenta exponencialmente seu leque na criação de matrizes inteligentes usando esse mesmo método de encapsular ds_gris. Não é necessário criar tudo “no braço”, basta montar a quantidade de grids necessárias em loop usando os argumentos.

Valeu! =)


Última edição por Borderline em Qui 17 Jan 2013, 20:18, editado 2 vez(es)

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por PedroX em Qui 17 Jan 2013, 17:58

Muito bom. Arrays multidimensionais podem ser muito úteis. Uma vez tentei fazer por ds_grids, mas sem sucesso. Agora você clareou o conceito. O bom é que não há limites com grids (a não ser pelo hardware). Scripts bem interessantes também.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por Pit Bull em Qui 17 Jan 2013, 18:24

Nos meus jogos eu usava variable_global_set(name,value) para criar varias arrays usando o nome da variavel, para mim parece mais facil, mas fiquei sabendo que isso faz o jogo ser muito "editável" e assim qualquer um pode pegar o endereço de memoria de onde está sendo feito essa modificação.

Gostei muito do tutorial, vou pesquisar mais sobre o assunto e atualizar meus códigos.

Obrigado.

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por Rodrigo Santiago em Qui 17 Jan 2013, 19:01

muito interresante, mas existem formas muito mais rapidas do que usar arry, a nao ser q a logica do programa requira indispensavelmente arrays.
Bom tuto

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por GameMakerTutoriais em Qui 17 Jan 2013, 20:15

Pit Bull escreveu:Nos meus jogos eu usava variable_global_set(name,value) para criar varias arrays usando o nome da variavel, para mim parece mais facil, mas fiquei sabendo que isso faz o jogo ser muito "editável" e assim qualquer um pode pegar o endereço de memoria de onde está sendo feito essa modificação.

Pois é... Mas, na verdade, isso acontece com todo o código. Infelizmente, muitas linguagens de script padecem disso... Olhando por um lado positivo, é fácil saber quando um programa seu foi plagiado. O próprio GM coloca várias partes do código descaradamente na RAM e mantém lá, sem nenhum tipo de precaução ou artifício de proteção.

Mas essa maneira que você usa é muito legal! Essa forma é muito usada (também) em linguagens de scripts, principalmente as de console. O único empecilho é que ficaria uma “matriz” mais lenta que a usual, mas dependendo do tamanho dela e de quantas vezes ela é acessada, isso não vai interferir negativamente...

Abraço!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por Pit Bull em Qui 17 Jan 2013, 20:21

Já fiz até um tutorial sobre essas funções mais ninguém deu moral, talvez porque eu não sabia explicar a utilidade.

Não acho que ficaria lenta, pois dificilmente um jogo vai usar mais que 10 tipos de arrays, então fica até mais fácil usar variáveis para uma busca mais rápida.

Pit Bull

Número de Mensagens : 630
Idade : 21
Data de inscrição : 31/08/2010
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://leninja.com.br

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por GameMakerTutoriais em Qui 17 Jan 2013, 22:23


Pit Bull escreveu:Já fiz até um tutorial sobre essas funções mais ninguém deu moral, talvez porque eu não sabia explicar a utilidade.

Não acho que ficaria lenta, pois dificilmente um jogo vai usar mais que 10 tipos de arrays, então fica até mais fácil usar variáveis para uma busca mais rápida.

Mas são excelentes, mesmo! Um ótimo exemplo é esse que você citou: criar um “array” dentro da string. Essas funções que retornam strings de nomes de recursos e variáveis só parecem obsoletas, mas são sensacionais. A grosso modo, seria como poder usar um ponteiro pra um determinado local, só que em vez de um endereço, usa-se o nome... Uma função que eu adoro usar com as "get_name's" é a execute_string.

Um outro exemplo é poder trabalhar com um número mais extenso que o valor de double nas variáveis do GM... Apesar de ser mais lento trabalhar com strings, ainda há esse recurso de armazenar um valor numérico bem maior nelas e fazer operações (mas é só mais uma forma, nem de longe é a adequada, mas é um dos caminhos de exemplo...).

Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por Conteúdo patrocinado Hoje à(s) 20:24


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum