Parede isométrica transparência (Resolvido)

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

Resolvido Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Sab 24 Maio 2014, 22:12

Como eu poderia deixar uma parede isométrica transparente quando o player passar por trás dela?

Obrigado pela ajuda.


Última edição por generalzero em Qua 28 Maio 2014, 22:26, editado 2 vez(es)

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Zero. em Sab 24 Maio 2014, 22:29

mude a image_alpha do objeto isometrico qndo o jogador passar por ela

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Sab 24 Maio 2014, 22:32

E como eu sei que o player passou pelo objeto?
E como muda o alpha da imagem pelo código?

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por MissingNo em Sab 24 Maio 2014, 22:39

Código:
if place_meeting(x,y,obj_player) then image_alpha=0.4 else image_alpha=1

é só por isso no step da parede amigo  flw

MissingNo

Ranking : Nota C
Número de Mensagens : 134
Idade : 16
Data de inscrição : 03/06/2013
Notas recebidas : C
Reputação : 22
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Zero. em Sab 24 Maio 2014, 22:57

O place_meeting checa se o objeto está colidindo com o outro objeto (definido na função), nas posições x e y, que neste caso é toda a mascara de colisão do objeto (a imagem do objeto). image_alpha é a opacidade da imagem que vai de 0 a 1.

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Dom 25 Maio 2014, 00:14

A pergunta que fica é:
Como é um objeto isométrico, a máscara de colisão está só na base da parede.
Testei agora e não deu certo.

Será que é porque o place_meeting testa a colisão pela máscara?

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Gabreel em Dom 25 Maio 2014, 00:25

Sim, mas você pode deixar a máscara de colisão com o formato da parede se isso não for atrapalhar suas colisões!

Gabreel

Número de Mensagens : 2227
Idade : 20
Data de inscrição : 02/10/2009
Reputação : 52
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Dom 25 Maio 2014, 00:35

Se eu botar a máscara de colisão em todo o objeto então não seria mais um objeto isométrico, não?

Parede:


Máscara da parede:

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Dotted Chaos em Dom 25 Maio 2014, 00:57

Não é a forma mais técnica, mas se você comparar a posição x e y do personagem com a da parede em um evento do tipo Step, pode deduzir se ele está atrás dela ou não.

Desse modo não importa o tipo de máscara ou colisão, já que será apenas uma leitura de coordenadas.

Dotted Chaos

Número de Mensagens : 241
Data de inscrição : 27/11/2012
Reputação : 42
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Zero. em Dom 25 Maio 2014, 09:49

vc pode por um obj com a mascara da parede mna posição da parede.
vc cria um obj_mascara no create e vinvula este obj criado a pare e neste obj_mascara vc põe o código de place_meeting e muda o image_alpha do obj que criou o obj_mascara. é um caminho.

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Kabeção em Dom 25 Maio 2014, 09:54

O código executa de acordo com o que está definido até aquela linha.
Você pode mudar a mascara em um linha e voltar para a normal depois, por exemplo:

Código:
var temp_mask;
temp_mask = mask_index;

mask_index = -1; // remover mascara e usar a sprite do objeto para colisão

if place_meeting....

mask_index = temp_mask;

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Dom 25 Maio 2014, 15:16

Não deu muito certo.
Os códigos da parede estão assim:

CREATE:
depth=-x-y

var temp_mask;
temp_mask = mask_index;

mask_index = -1;

if place_meeting(x,y,obj_player) then image_alpha=0.4 else image_alpha=1;

mask_index = temp_mask;

Bom, as imagens acima são as imagens que eu uso para a parede e para a máscara.

Isso é o que eu gostaria de fazer:

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Seg 26 Maio 2014, 13:35

Galera, tive avanços.
Após consultas alterei algumas linhas.

1) Alterei a máscara do sprite da parede para assumir como sendo toda a parede.
2) Ao invés de colocar o código no objeto da parede, eu coloquei o código dentro do sprite do player, ficando assim:

Código:
if keyboard_check(vk_right) {x+=8}
if keyboard_check(vk_left) {x-=8}
if keyboard_check(vk_down) {y+=8}
if keyboard_check(vk_up) {y-=8}

var temp_mask;
temp_mask = mask_index;

mask_index = -1;

if place_meeting(x,y,obj_wall) then obj_wall.image_alpha=0.4 else obj_wall.image_alpha=1;

mask_index = temp_mask;

Não checo colisão porque eu verifico isso no place_meeting.


E o resultado foi este:


Muito próximo do que eu queria.
Como podem ver, a bolinha azul simboliza o player, que ao passar por traz da parede, ela ganha transparência.
Mas, ainda tenho algumas ressalvas:

1) Como é um objeto isométrico, a colisão dele teria que se dar apenas na área vermelha ilustrada na base do sprite. Os outros pontos de colisão teoricamente não existem pois ele não está colidindo com a parede, mas passando por ela. De repente será que não tem como colocar duas máscaras no mesmo objeto? Dai tem uma máscara de colisão e outra apenas para verificar se o player está atrás da parede. O correto é que o game veja isso:


2) Eu consegui colocar alpha em todos os sprites que tem wall. Funciona em partes, mas eu gostaria que fosse apenas na parede que o player está.

3) Como deu alpha em todo algumas paredes ficaram "acavaladas". Existe algum ajuste fino para que eu possa colocar uma parede do lado da outra sem que elas fiquem sobrepostas?

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Dotted Chaos em Seg 26 Maio 2014, 14:08

Quanto à 2° e 3° questões:

- Para afetar apenas a instância da parede em que o personagem está, aplique o código de transparência para o id específico desta instância. Pesquise sobre id no help do programa;

- Quando você aplica alpha em 2 ou mais objetos sobrepostos é normal que a sobreposição contenha uma opacidade maior, afinal são 2 camadas que estão ali. Você pode contornar isso usando paredes intermediárias semelhantes à isto:

Dotted Chaos

Número de Mensagens : 241
Data de inscrição : 27/11/2012
Reputação : 42
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Kabeção em Ter 27 Maio 2014, 12:29

Como já disse, mude a mascara no momento antes de testar a colisão e você pode usar milhares de máscaras diferentes até no mesmo script.

Tem algum outro motivo para não ter funcionado.
Tente também mask_index = sprite_index.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Qua 28 Maio 2014, 13:31

E ai galera, como estão?
Bom, depois das dicas valiosas tive muitos avanços.
Obrigado a todos!

Em resumo:
1) Apesar da experiência de sumir com todas as paredes ser bem interessante eu acabei descobrindo o que estava fazendo de errado. Me desculpem, é que sou muito iniciante no game maker, mas eu tinha colocado o código do alpha no create do obj, e no no step. Ajustando isso o efeito foi bem o que eu procurava:


2) Como podem observar, depois da dica do @scratchware_dev e alguns ajustes finos, consegui deixar o efeito o alpha bem mais bonito, sem as sobreposições de imagens. Usei como obj_wall padrão a imagem da parede recortada e criei um obj_wall_canto para fazer o acabamento, e ficou bem legal.

3) Em relação ao mapeamento da imagem, me desculpem, mas não consegui fazer entrar na minha cabeça as explicações acima. Atualmente a máscara dos objetos está como todo o sprite. Isso funciona para fazer o efeito de transparência. Mas como eu faria para ele se comportar como na imagem abaixo e manter o place_meeting da transparência?

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Dotted Chaos em Qua 28 Maio 2014, 17:21

General, como o Kabeção lhe disse no outro post, você pode trabalhar a máscara do objeto independentemente para cada ação que for executar.

Não importa que na linha anterior do seu código a máscara atribuída ao objeto parede era a própria sprite, você pode simplesmente fazer isto:

Código:
mask_index = máscara de checagem de transparência;
< ações de checagem de transparência aqui >
mask_index = máscara de colisão;
< ações de colisão aqui >

Compreende o conceito? Você pode alterar uma definição do objeto SOMENTE para a ação seguinte e então RETORNAR ela pra condição original na linha posterior.

Dotted Chaos

Número de Mensagens : 241
Data de inscrição : 27/11/2012
Reputação : 42
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Qua 28 Maio 2014, 21:30

Pessoal, após a grande ajuda de vocês todos consegui chegar o ponto que desejava.
Ficou muito legal.
Então apenas para deixar registrado aqui para quem mais tiver dúvidas o procedimento que eu fiz foi o seguinte.

1) Criei um sprite vazado chamado spr_wall com as seguintes configurações:
- Precise collision checking
- Separate collision masks
[Modify Mask:]
- Bounding box: Automatic
- Shape: Precise
[Sprite] 


2) Criei um sprite com o canto da parede chamado spr_wall_canto com as mesmas configurações, mudando apenas a imagem do sprite:
- Precise collision checking
- Separate collision masks
[Modify Mask:]
- Bounding box: Automatic
- Shape: Precise
[Sprite] 


3) Criei um sprite chamado msk_wall com as seguintes configurações:
- Precise collision checking
[Modify Mask:]
- Bounding box: Automatic
- Shape: Precise
[Sprite] 


4) Criei um objeto chamado obj_wall com as seguintes configurações:
- Solid
- Sprite: spr_wall
- Mask: msk_wall
[Create]
Código:
depth=-x-y

[Step]
Código:
var temp_mask;
temp_mask = mask_index;

mask_index = -1;

if place_meeting(x,y,obj_player) then image_alpha=0.4 else image_alpha=1;

mask_index = temp_mask;


5) Criei um objeto chamado obj_wall_canto com as seguintes configurações:
- Solid
- Sprite: spr_wall_canto
- Mask: msk_wall
[Create]
Código:
depth=-x-y

[Step]
Código:
var temp_mask;
temp_mask = mask_index;

mask_index = -1;

if place_meeting(x,y,obj_player) then image_alpha=0.4 else image_alpha=1;

mask_index = temp_mask;


6) Criei um objeto chamado obj_player com as seguintes configurações:
- Sprite: spr_player
- Mask: same as sprite
[Step]
Código:
if keyboard_check(vk_right) && place_free(x+8,y) {x+=8}
if keyboard_check(vk_left) && place_free(x-8,y) {x-=8}
if keyboard_check(vk_up) && place_free(x,y-8) {y-=8}
if keyboard_check(vk_down) && place_free(x,y+8) {y+=8}


Agora só criar a room e adicionar os elementos. Tudo funcionando.

Então pra finalizar, ficou só duas perguntas:
1) Existe algum ajuste fino para colocar elementos na room? Achei aquele grid do game maker um tanto quanto grande. Ele me obrigou a cortar uma boa parte da imagem pra poder montar a parede. Se fosse menor, tipo, pixel por pixel, seria melhor.

2) Como eu trabalho com HTML, CSS e Javascript, no front-end da pra setar classes e IDs para os elementos. Eu posso dizer que eu quero UM elemento com o ID x e posso também pegar todos os elementos que possuem a classe y. Tem como fazer isso no game maker? Pergunto isso porque no efeito de alpha da parede ele da um place_meeting passando o nome do player. Imagina se eu tiver 200 players, vai ser uma confusão. Então se eu disser pra ele que todos os elementos que possuírem tal classe ele deve executar esta função. 

É possível?

Abraços!

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Dotted Chaos em Qua 28 Maio 2014, 21:34

1) Você pode ajustar o "tamanho" do grid. Há dois campos com o valor pros espaçamentos em x e y no editor de rooms (na parte superior).

2) Pesquise sobre objetos "parent" no Game Maker.

Dotted Chaos

Número de Mensagens : 241
Data de inscrição : 27/11/2012
Reputação : 42
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por generalzero em Qua 28 Maio 2014, 21:40

Obrigado galera por tudo.
Como eu faço pra dar como resolvido este tópico?

generalzero

Número de Mensagens : 9
Data de inscrição : 24/05/2014
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Dotted Chaos em Qua 28 Maio 2014, 21:42

generalzero escreveu:Como eu faço pra dar como resolvido este tópico?

Você pode mudar o ícone do primeiro post deste tópico (use o botão editar) ou apenas pedir para um moderador trancar =]

Dotted Chaos

Número de Mensagens : 241
Data de inscrição : 27/11/2012
Reputação : 42
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Parede isométrica transparência (Resolvido)

Mensagem por Conteúdo patrocinado Hoje à(s) 12:36


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