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

Esqueci-me da senha

Últimos assuntos
» Problema ao entrar por uma porta e voltar por ela
por aminaro Seg 06 maio 2024, 10:08

» Alguém aqui já ganha dinheiro com seus games?
por theguitarmester Ter 30 Abr 2024, 11:43

» Colisões não funcionando
por theguitarmester Ter 30 Abr 2024, 10:16

» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Sex 26 Abr 2024, 16:45

» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18

» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21


Pseudo-arrays, como funcionam e + exemplos de uso

4 participantes

Ir para baixo

Pseudo-arrays, como funcionam e + exemplos de uso Empty Pseudo-arrays, como funcionam e + exemplos de uso

Mensagem por GameMakerTutoriais 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)
avatar
GameMakerTutoriais

Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por PedroX 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!

_________________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:
PedroX
PedroX

Games Ranking : Nota B

Notas recebidas : C+B
Data de inscrição : 26/07/2008
Reputação : 311
Número de Mensagens : 6087
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 17 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

https://web.whatsapp.com/send?phone=5519995935953&text=Pedro

Ir para o topo Ir para baixo

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

Mensagem por Pit Bull 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
Pit Bull

Data de inscrição : 31/08/2010
Reputação : 16
Número de Mensagens : 646
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Unity
  • C#
  • Outros


https://discord.gg/ZPM2d6q

Ir para o topo Ir para baixo

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

Mensagem por Rodrigo Santiago 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
Rodrigo Santiago

Games Ranking : Nota B

Notas recebidas : C + C + B
Data de inscrição : 28/07/2012
Reputação : 73
Número de Mensagens : 1281
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 3 Prata x 1 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por GameMakerTutoriais 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!
avatar
GameMakerTutoriais

Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Pit Bull 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
Pit Bull

Data de inscrição : 31/08/2010
Reputação : 16
Número de Mensagens : 646
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Unity
  • C#
  • Outros


https://discord.gg/ZPM2d6q

Ir para o topo Ir para baixo

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

Mensagem por GameMakerTutoriais 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!
avatar
GameMakerTutoriais

Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios : Pseudo-arrays, como funcionam e + exemplos de uso Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo


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