[Resolvido] Profundidade do Desenho

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

Resolvido [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Ter 28 Out 2014, 20:05

Boa noite pessoa. Meu problema é o seguinte:

Tenho um objeto que desenha o sprite do meu jogador usando a função with. O problema  é que preciso desenhar a "sombra" que fica em cima dele, depois vem o comando de iluminação e depois desenho o sprite dele. Mas, preciso que esse último desenho fique em baixo do primeiro (não é uma opção inverter a ordem das funções por causa da iluminação).

Resumindo:

with (jogador)
{
  draw sombra
}

repeat (x)
{
  *função de iluminação*
}

with (jogador)
{
  draw sprite
}

Como faço pro sprite ser desenhado em baixo da sombra?


Última edição por matheusco em Sex 31 Out 2014, 11:52, editado 1 vez(es)

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por WellingtonBecker em Ter 28 Out 2014, 20:10

Tente assim:

Código:
with (jogador)
{
draw sprite
depth=1 // quanto maior, mais baixo.
}

WellingtonBecker

Ranking : Nota D
Número de Mensagens : 820
Idade : 35
Data de inscrição : 09/05/2013
Notas recebidas : D
Reputação : 105
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Ter 28 Out 2014, 20:25

WellingtonBecker escreveu:Tente assim:

Código:
with (jogador)
{
draw sprite
depth=1 // quanto maior, mais baixo.
}

Não deu. Aproveitei e tentei mudando a depth do próprio objeto que chama a função with, não rolou também.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Gonçalves em Ter 28 Out 2014, 20:39

Desenhar um no Draw e outro no Draw End (que acontece depois, logo vem por cima)?

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Ter 28 Out 2014, 20:46

Gonçalves escreveu:Desenhar um no Draw e outro no Draw End (que acontece depois, logo vem por cima)?

O que eu queria deu certíssimo, muito obrigado. Mas aconteceu alguns bugs. Os objetos que não se desenham ficaram transparentes, o que era luz virou gerador de trevas durante o dia (lol) e a luz não funciona durante a noite, haha. Mas já é alguma coisa, vou ver se consigo resolver isso e qualquer coisa volto pra pedir ajuda. Obrigado.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Ter 28 Out 2014, 22:42

Gonçalves escreveu:Desenhar um no Draw e outro no Draw End (que acontece depois, logo vem por cima)?

Então, fiz tudo certinho aqui e funcionou Very Happy Maaaas, tem algumas coisas que não entendi bem por quê acontecem.

Meu objeto que desenha tem depth 0, e como me disse lá na GMC, não importa a depth, o Draw End Event vem por cima, a menos que dois objetos usem Draw End.

Mas no meu caso, se eu tenho um objeto com depth menor que 0, ele escurece mais devagar (na mesma velocidade que os sprites desenhados pelo objeto) do que os objetos que tem depth maior (que estão acima da surface). Porém, a função que uso para escurecer a tela é essa:

draw_clear_alpha(day_color, day_alpha)

Sendo day_color basicamente preto e day alpha eu controlo pra aumentar ou diminuir a escuridão, e isso tá no Draw End Event. O mesmo acontece com o background. Se eu uso colocando lá nas opções da room, ele escurece mais rápido que os sprites desenhados pelo objeto; se coloco o objeto pra desenhar o background, ele passa a escurecer na mesma velocidade.

Draw Event:

surface_set_target(surface_light)

draw_background(back_01, view_wview[0]/2, view_hview[0]/2)

with (obj_shadowcaster_short)
{
draw_sprite_ext(sprite_index, image_index, (x - other.shadow_distance) - view_xview[0] + other.shadow_displacement, (y - other.shadow_distance) - view_yview[0], image_xscale, image_xscale, image_angle, c_black, other.shadow_alpha);
draw_sprite_ext(sprite_index, image_index, x - view_xview[0], y - view_yview[0], image_xscale, image_yscale, image_angle, -1, 1);
}

with (obj_player)
{
draw_sprite_ext(sprite_index, image_index, (x - other.shadow_distance) - view_xview[0] + other.shadow_displacement, (y - other.shadow_distance) - view_yview[0], image_xscale, image_xscale, image_angle, c_black, other.shadow_alpha);
draw_sprite_ext(sprite_index, image_index, x - view_xview[0], y - view_yview[0], image_xscale, image_yscale, image_angle, -1, 1);
}

with (obj_shadowcaster_tall)
{
draw_sprite_ext(sprite_index, image_index, (x - other.shadow_distance)- view_xview[0] + other.shadow_displacement, (y - other.shadow_distance) - view_yview[0], image_xscale, image_xscale, image_angle, c_black, other.shadow_alpha);
draw_sprite_ext(sprite_index, image_index, x - view_xview[0], y - view_yview[0], image_xscale, image_yscale, image_angle, other.color_tall_objects, 1);
}

surface_reset_target()

// Fool Proof

if surface_exists(surface_light)
{
draw_surface(surface_light,view_xview[0],view_yview[0])
}
else
{
surface_light = surface_create(view_wview[0],view_hview[0])
}

Draw End Event:

surface_set_target(surface_light)

draw_clear_alpha(day_color, day_alpha)

with (obj_lighter)
{
var i = center;
draw_set_alpha(bright)
repeat (circles)
{
draw_circle(x-view_xview[0], y-view_yview[0], i, false)
i += loop_factor
}
}

draw_set_alpha(1)
surface_reset_target()

// Fool Proof

if surface_exists(surface_light)
{
draw_surface(surface_light,view_xview[0],view_yview[0])
}
else
{
surface_light = surface_create(view_wview[0],view_hview[0])
}

Tem ideia do que tá acontecendo? Se ficou muito confuso eu posta um print.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Gonçalves em Ter 28 Out 2014, 22:46

Posta um print aí. XD

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Ter 28 Out 2014, 22:56



A parte que mostra o chão mais claro (sem ser no círculo, aquilo é a luz), está sendo desenhada pelo objeto que tem todos Draw, assim como os objetos azuis e metade dos amarelos (que são os mesmo objetos, com profundidades diferentes).

O que está dentro da profundida da surface ou acima, fica do jeito que eu quero. O que está abaixo fica escuro mais rápido. Só que meu código de escurecer está no Draw End Event, então não sei o que tá acontecendo.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Qui 30 Out 2014, 20:15

Se alguém souber qual o problema, ainda não consegui resolver.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Pai véi em Sex 31 Out 2014, 00:21


Eu sugeriria que você usasse uma surface, mas como você já está fazendo isso, tente usar duas. Desenhe tudo na primeira, desenhe o sprite que fica por baixo na segunda e desenhe a primeira por cima da segunda.

Na verdade, essa é uma alternativa que cabe muito mais como um "remendo" do que como solução, pois tem um erro no seu código que vai gerar bugs estranhos. É esse:

Draw Event:

surface_set_target(surface_light)

Você não deve usar uma função de troca de surface dentro do evento Draw. Isso está detalhado no help. É possível que muitos dos bugs estejam vindo daí.

Boa sorte.

Pai véi

Número de Mensagens : 14
Data de inscrição : 27/02/2014
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Sex 31 Out 2014, 00:36

Pai véi escreveu:
Eu sugeriria que você usasse uma surface, mas como você já está fazendo isso, tente usar duas. Desenhe tudo na primeira, desenhe o sprite que fica por baixo na segunda e desenhe a primeira por cima da segunda.

Na verdade, essa é uma alternativa que cabe muito mais como um "remendo" do que como solução. Além disso, tem um erro no seu código que vai gerar bugs estranhos. É esse:

Draw Event:

surface_set_target(surface_light)

Você não deve usar uma função de troca de surface no evento Draw. Isso está detalhado no help. É possível que muitos dos bugs estejam vindo daí.

Boa sorte.

Os withs é porque as instâncias têm alguns valores randômicos (escala e rotação), portanto preciso do with.

Quanto ao surface set target, onde devo colocar? No Draw Begin?

EDIT: Tem certeza sobre não poder usar no Draw Event? Li o help http://docs.yoyogames.com/source/dadiospice/002_reference/surfaces/surface_set_target.html e não tem nada sobre isso.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Pai véi em Sex 31 Out 2014, 00:40


matheusco escreveu:Quanto ao surface set target, onde devo colocar? No Draw Begin?

Não. Ele não deve entrar em nenhum evento Draw. A diferença entre Draw Begin, Draw e Draw End é só a ordem.

Some care must be taken when using these functions. In particular please notice the following:

You should never change the drawing target while you are actually drawing on the screen, that is, never use it in drawing events. This will cause serious problems with the projection and viewport.

Pai véi

Número de Mensagens : 14
Data de inscrição : 27/02/2014
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Sex 31 Out 2014, 00:46

Pai véi escreveu:
matheusco escreveu:Quanto ao surface set target, onde devo colocar? No Draw Begin?

Não. Ele não deve entrar em nenhum evento Draw. A diferença entre Draw Begin, Draw e Draw End é só a ordem.

Some care must be taken when using these functions. In particular please notice the following:

You should never change the drawing target while you are actually drawing on the screen, that is, never use it in drawing events. This will cause serious problems with the projection and viewport.

De onde é isso? Não tem no link que mandei. Onde coloco então? Porque no final do código tenho que resetar o target.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Pai véi em Sex 31 Out 2014, 00:56


matheusco escreveu:De onde é isso? Não tem no link que mandei. Onde coloco então? Porque no final do código tenho que resetar o target.

Isso é do manual do Game Maker 8, mas essa função existe desde o Game Maker 6, portanto, está tanto no manual antigo quanto no manual novo. Você deve colocar essa função fora do evento Draw, não importando qual evento seja.

Talvez, se você transferir todo esse código do evento Draw para o evento End Step, dê certo (pelo que eu pude ver, aparentemente você só usou o código pra desenhar dentro da surface).

Mas, quando você quiser desenhar a surface, obviamente você deve fazer isso no evento Draw.

Grande abraço.

Pai véi

Número de Mensagens : 14
Data de inscrição : 27/02/2014
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Sex 31 Out 2014, 01:09

Pai véi escreveu:
matheusco escreveu:De onde é isso? Não tem no link que mandei. Onde coloco então? Porque no final do código tenho que resetar o target.

Isso é do manual do Game Maker 8, mas essa função existe desde o Game Maker 6, portanto, está tanto no manual antigo quanto no manual novo. Você deve colocar essa função fora do evento Draw, não importando qual evento seja.

Talvez, se você transferir todo esse código do evento Draw para o evento End Step, dê certo (pelo que eu pude ver, aparentemente você só usou o código pra desenhar dentro da surface).

Mas, quando você quiser desenhar a surface, obviamente você deve fazer isso no evento Draw.

Grande abraço.

Hum, entendi agora. Beleze, vou ver se é isso que tá causando o problema, se não, volto aqui pra perguntar. Abraço.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por matheusco em Sex 31 Out 2014, 11:45

Pai véi escreveu:
matheusco escreveu:De onde é isso? Não tem no link que mandei. Onde coloco então? Porque no final do código tenho que resetar o target.

Isso é do manual do Game Maker 8, mas essa função existe desde o Game Maker 6, portanto, está tanto no manual antigo quanto no manual novo. Você deve colocar essa função fora do evento Draw, não importando qual evento seja.

Talvez, se você transferir todo esse código do evento Draw para o evento End Step, dê certo (pelo que eu pude ver, aparentemente você só usou o código pra desenhar dentro da surface).

Mas, quando você quiser desenhar a surface, obviamente você deve fazer isso no evento Draw.

Grande abraço.

Consegui resolver usando mais surfaces em diferentes objetos, pra controlar melhor onde vai ser desenhado o que. Mais simples do que ficar usando Draw End Event. Mas quanto ao evento que deve ser feito, perguntei no fórum GMC e essa especificação, de não desenhar no Draw era válida só pras versões antes do GM:S.

Obrigado pela ajuda.

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

Resolvido Re: [Resolvido] Profundidade do Desenho

Mensagem por Conteúdo patrocinado Hoje à(s) 19:31


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