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
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


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