depth in draw

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

depth in draw

Mensagem por Isaque Onix em Qui 04 Set 2014, 13:44

ola, gostaria de saber como desenhar varios sprites um em cima do outro, apenas variando o depth (do draw)

bom, pra explicar melhor, eu estou armazenando as informaçoes de um "objeto" que e baseado em varios sprites, e essas informaçoes estao armazenadas em arrais.
mais, as veses, o sprite que esta em baixo tambem precisa ser desenhado em cima, tem como fazer isso?

eu tentei algo assim:

Código:
depth=arr[0,4]//aqui, arr = -100
draw_sprite(arr[0,0],arr[0,1],arr[0,2],arr[0,3])
depth=arr[1,4]//aqui, arr = 99
draw_sprite(arr[1,0],arr[1,1],arr[1,2],arr[1,3])
//E SO UM EXEMPLO!!!


Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por DieBoy em Qui 04 Set 2014, 13:56

Olá, os "draw's" já seguem a mesma depth do objeto que a está desenhando...
Ou seja, se um objeto com 1 de depth desenhar um sprite no mesmo local que outro com 0...O sprite desenhado pelo que está com depth 0, ficará por cima!

Mas, caso deseje que um mesmo objeto desenhe 2 sprites...Fique sabendo que no caso segue a ordem de desenho...
Ou seja, o 1° sprite a ser desenhado, ficará embaixo do 2° e assim em diante.

Veja exemplo:

Código:

draw_sprite(50, 50, spr_1); //Esse ficará embaixo de todos os sprites seguintes
draw_sprite(50, 50, spr_2); //Esse ficará em cima do spr_1 e embaixo do spr_3
draw_sprite(50, 50, spr_3); //Esse ficará por cima de todos os anteriores

DieBoy

Número de Mensagens : 91
Data de inscrição : 22/08/2014
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Isaque Onix em Qui 04 Set 2014, 14:04

isso eu sei meu amigo, nao sou um iniciante.
oque eu quero, e variar o depth no draw do mesmo objeto, intende...

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por matheusco em Qui 04 Set 2014, 14:07

Isaque Onix escreveu:isso eu sei meu amigo, nao sou um iniciante.
oque eu quero, e variar o depth no draw do mesmo objeto, intende...

Talvez trocando a própria depth do objeto que está desenhando, durante o desenho. Meio difícil sincronizar isso, dependendo do que você quer fazer, mas talvez dê certo. Só testando mesmo.

matheusco

Número de Mensagens : 395
Idade : 23
Data de inscrição : 10/08/2014
Reputação : 51
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://www.tutoriaisgamemaker.com.br

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por DieBoy em Qui 04 Set 2014, 14:12

o.O então...Como eu acabei de falar, a ordem do desenho e blabla...Faria isso.

Mas como eu acabei de falar também...A depth do draw, é a mesma do objeto...Portanto basta mudar a variável depth do objeto...Segue exemplo:

Código:

depth = 0;
draw_sprite(50, 50, spr_1); //Por cima de todos
depth = 1;
draw_sprite(50, 50, spr_2); //Por cima de spr_3
depth = 2;
draw_sprite(50, 50, spr_3); //Embaixo de todos

DieBoy

Número de Mensagens : 91
Data de inscrição : 22/08/2014
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por dharrison em Qui 04 Set 2014, 14:20

Mudar o depth não adianta, pois a cada novo Frame/Step o depth ficará sendo alterado.

O depth influencia na layer que o Objeto está, não o Draw que ele cria.

Basta fazer da mesma forma que o DieBoy explicou, mas sem usar as linhas Depth.
Por padrão o draw é feito na ordem que ele é colocado, quando mais para baixo, mas acima ficará o desenho

dharrison

Ranking : Nota B
Número de Mensagens : 1243
Idade : 25
Data de inscrição : 04/02/2009
Notas recebidas : A - B
Reputação : 89
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 0
   : 1
   : 0

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Isaque Onix em Qui 04 Set 2014, 14:42

nossa...

DieBoy, o código que você me passou e igual ao que eu coloquei no tópico explicando que eu ja tentei...

e, dharrison, como disse no tópico, sao muitas arrais que sao desenhadas juntas criando um personagem, mais as veses uma fica por baixo, as veses por cima, etc... por isso, nao da pra desenhar uma-a-uma. seria mais de 1000 linhas de codigos e ainda sim nao daria certo, pois algo que deveria ficar por cima, ao ser trocado, poderia ficar por baixo...

andei pesquisando e me deparei com um topico, que, ate deu certo, mais nao 100%...
o topico: http://gmc.yoyogames.com/index.php?showtopic=495251
meu teste:
Código:
d3d_start()
d3d_set_depth(-100)
draw_sprite_ext(sprite3,0,x,y-16,1,1,0,c_red,1) draw_text(x+52,y-16,-100)
d3d_set_depth(100)
draw_sprite_ext(sprite3,0,x,y,1,1,0,c_white,1) draw_text(x+52,y,100)
d3d_set_depth(-100)
draw_sprite_ext(sprite3,0,x,y+16,1,1,0,c_blue,1) draw_text(x+52,y+16,-100)
d3d_end()

@offtopic Sain no ingles fluente... uau ksks

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por dharrison em Qui 04 Set 2014, 14:49

acontece essas funções que você usou são em 3D.
As suas Arrays são desenhadas em sequencia, tipo 1, 2, 3...

porque se sim, você pode usar um laço de FOR para o Draw

fora isso não muito como solucionar esse problema...

dharrison

Ranking : Nota B
Número de Mensagens : 1243
Idade : 25
Data de inscrição : 04/02/2009
Notas recebidas : A - B
Reputação : 89
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 0
   : 1
   : 0

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por DieBoy em Qui 04 Set 2014, 14:58

o.O não entendi(Tbm não entendi a do d3d funfa...mas não estou falando disso)...De qualquer forma você fazendo assim não vai desenhar de 1 em 1?

Bom, deixa pra lá. Mas avise se isso funcionou para você. Para que possam trancar o tópico.

Caso não tenha funcionado, já que vai desenhar de 1 em 1 mesmo, faça do jeito que já falei:

eu escreveu:
Mas, caso deseje que um mesmo objeto desenhe 2 sprites...Fique sabendo que no caso segue a ordem de desenho...
Ou seja, o 1° sprite a ser desenhado, ficará embaixo do 2° e assim em diante.

Veja exemplo:

Código:

draw_sprite(50, 50, spr_1); //Esse ficará embaixo de todos os sprites seguintes
draw_sprite(50, 50, spr_2); //Esse ficará em cima do spr_1 e embaixo do spr_3
draw_sprite(50, 50, spr_3); //Esse ficará por cima de todos os anteriores

Caso não der certo desse jeito também, fora os já apresentados, não existe outro modo!

DieBoy

Número de Mensagens : 91
Data de inscrição : 22/08/2014
Reputação : 49
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Isaque Onix em Qui 04 Set 2014, 15:36

pois e, Na verdade, estou usando os codigos aqui como exemplos, nao sao os codigos reais do meu game... e as arrais sao desenhadas em sequencia e ja utilizam o loop FOR... mais como disse, dependendo do sprite que e desenhado ele deve ficar por cima, e dependendo, por baixo...
mais pode deixar... vou estudar um outro modo...

e eu sei que os codigos sao 3D, por isso o d3d_start() e o d3d_end()... mais foi um teste devido um encontrado em uma de minhas pesquisas...
agradeço a vocês por tentarem!

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Igor KinGamer em Qui 04 Set 2014, 23:45

Inevitavelmente, os draws precisam ser chamados na ordem certa. Você pode tentar usar uma priority queue pra isso. Nunca usei uma no GM (pra ser sincero, nem em nenhum outro lugar), mas parece ser ideal (digamos assim...) para o seu caso.

Basicamente, você coloca cada informação na fila usando a prioridade para definir quem deve ser desenhado primeiro. Então, num laço, vai desenhando em ordem conforme a prioridade (como, pelo que vi, o único jeito de pegar um valor da fila é pegar o de maior ou menor prioridade, você teria que fazer uma cópia da fila e ir retirando dessa cópia, enquanto ela não estivesse vazia, o valor de maior (menor) prioridade e desenhando).

Os valores na fila seriam os de primeiro índice da array (arr[x,y]), usando como prioridade o depth (no seu exemplo, o valor guardado em arr[x,4]). Quando quisesse alterar o depth para um sprite, há uma função para alterar a prioridade associada a um valor. Para desenhar os sprites em ordem, seria necessário, como falei ali em cima, um laço tirando os valores em ordem de uma cópia da fila, usando então esses valores pra desenhar. Algo assim:
Código:
var cop, i;
cop = ds_priority_create(); //*
ds_priority_copy(cop, fila_original); // Faz uma cópia da fila, para não destruir a original
while (ds_priority_size(cop) > 0)
{
    i = ds_priority_delete_max(cop); // Pega o valor de índice com maior prioridade (depth) na fila
    draw_sprite(arr[i,0],arr[i,1],arr[i,2],arr[i,3]);
}
ds_priority_destroy(cop); // Pra não ficar ocupando a memória *

// * Na verdade, não é necessário ficar criando e destruindo a fila "cop".
// Como isso é feito várias vezes (o tempo todo), dá pra criar uma fila só
// e usar sempre a mesma.

E é isso, acho que dá pra fazer assim. Se não ficou muito claro o que eu quis dizer, eu tento explicar melhor. Talvez haja outro jeito mais simples, mas, se não houver...

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Isaque Onix em Sex 05 Set 2014, 00:03

boom, obrigado por responder, mais eu li, reli, mais ainda nao intendi tudo...

1: como defino a prioridade de cada sprite
2: essa variavel fila_original vem de onde? e oque coloco nela? (deduzi que fosse a arr[0,4], mais aqui nao rolou...

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por PedroX em Sex 05 Set 2014, 00:07

Você deve criar uma ds_priority salvando o id na variável fila_original. A prioridade é definida adicionando o valor desejado (que seria o depth).

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: depth in draw

Mensagem por Isaque Onix em Sex 05 Set 2014, 00:13

huum acho que intendi... vou testar aqui, e, logo respondo...

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Igor KinGamer em Sex 05 Set 2014, 00:18

1) Na verdade, a prioridade estaria associada ao índice da array. Por exemplo, arr[0,0], ..., arr[0, 3] são as informações de um sprite. Então o 0 seria colocado na fila com a prioridade igual ao que seria o depth desse sprite (digamos, 10). arr[1,0], ... arr[1, 3] são as informações de outro sprite. Então, o 1 iria para a fila com o depth correspondente como prioridade (digamos, 9).

Logo, com esses dois sprites, você teria dois valores na fila (cada um representando o primeiro índice da array para acessar os dados do sprite): 0, com prioridade 10, e 1, com prioridade 9.

2) fila_original seria a fila onde estão guardados os valores com suas prioridades. Ou seja, (como o PedroX falou) uma fila já criada. Quando você fosse alterar o depth de um sprite, na verdade, você alteraria a prioridade do valor de índice da array referente ao sprite nessa fila.

Se estivesse lá o valor 4 com prioridade 0 (lembre-se que o 4 seria usado então em arr[4, ...) e você quisesse mandar mais pra trás (desenhado primeiro), com prioridade 20, você faria ds_priority_change_priority(fila_original, 4, 20).

Seria bom você ler a parte de DS Priority Queues no help do GM para ver as funções e saber como usar. Tenho que ir dormir, então depois, qualquer coisa, tento responder.

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Isaque Onix em Sex 05 Set 2014, 00:25

okok, fiz diversas tentativas desde que criei esse topico, mais uma nao faria mal... valeu ai! logo comento novamente...

Isaque Onix

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

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: depth in draw

Mensagem por Conteúdo patrocinado Hoje à(s) 00:43


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