Problema de colisão

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

Problema de colisão

Mensagem por peixoto em Sab 26 Abr 2014, 18:32

Eu estou com problemas na colisão do player e a parede no meu jogo(que é estilo TopDown Shooter).

Uso uma mask Redonda no player( que possui um sprite 32x32)e uso x=xprevious e y=yprevious no evento de colisão com a parede.No entanto ao colidir o player não só não consegue se mover, mas sua arma(que é um obj a parte, cujo qual programei para ficar no ponto x e y exato do player) vai um pouco a frente dele, na direção em que ele andava(EX: se ele andar para direita e colidir com uma parede a direita dele, a arma vai um pouco para a direita e fica lá até o player deixar de colidir com ela).

Procurei alguns tutoriais e engines para corrigir isso, mas em sua grande maioria eles são complicados e exigiam uma grande quantidade de mudanças no meu projeto para serem implementados.

Logo, alguém sabe como resolver isso sem precisar de dezenas de modificações no meu jogo?(Ele ja está quase no fim, e uma alteração poderia implicar em uma grande quantidade de coisas que precisariam ser adaptadas, logo me traria um trabalho imenso)

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por vinians em Sab 26 Abr 2014, 18:57

Centralize o seu sprite, coloque o "Origin" dele com o X estando no meio e o Y estando no pé. Vê se resolve!
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por peixoto em Sab 26 Abr 2014, 19:02

vinians escreveu:Centralize o seu sprite, coloque o "Origin" dele com o X estando no meio e o Y estando no pé. Vê se resolve!
Flws!
Não entendi esse "Y estando no pé" mas imagino que seja colocar o origin x=16 e y=16.
Só que ja está assim.

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por vinians em Sab 26 Abr 2014, 19:08

Entao o próximo passo seria criar uma máscara para o sprite essa mascara garante uma colisão padrão para o objeto, também desmarque (se já não estiver) "Precise collision check". Crie uma mascara retangular ou oval isso garante que ao virar por exemplo ele mantenha o mesmo padrão de colisão.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por peixoto em Sab 26 Abr 2014, 21:45

vinians escreveu:Entao o próximo passo seria criar uma máscara para o sprite essa mascara garante uma colisão padrão para o objeto, também desmarque (se já não estiver) "Precise collision check". Crie uma mascara retangular ou oval isso garante que ao virar por exemplo ele mantenha o mesmo padrão de colisão.
Flws!
Eu disse no topico que usou uma mask Circular(Elipse)
e essa opção de Precise collision check ja está desmarcada.

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por PedroX em Sab 26 Abr 2014, 22:50

O jeito mais fácil é esse:

STEP

Código:
hspeed = (keyboard_check(vk_right)-keyboard_check(vk_left))*5;
vspeed = (keyboard_check(vk_down)-keyboard_check(vk_up))*5;

if (place_free(x+hspeed, y+vspeed))
{
x+=hspeed;
y+=vspeed;
}
else
move_contact_solid(direction, speed);

hspeed=0;
vspeed=0;

O que eu fiz? Usei um truque para a partir de hspeed e vspeed calcular o speed e a direction. Assim podemos saber se o movimento será possível. Se não for, então ele move até o sólido, apenas encostando. No final, zeramos hspeed e vspeed para que ele não se mova sozinho.

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: Problema de colisão

Mensagem por peixoto em Sab 26 Abr 2014, 23:04

PedroX escreveu:O jeito mais fácil é esse:

STEP

Código:
hspeed = (keyboard_check(vk_right)-keyboard_check(vk_left))*5;
vspeed = (keyboard_check(vk_down)-keyboard_check(vk_up))*5;

if (place_free(x+hspeed, y+vspeed))
{
x+=hspeed;
y+=vspeed;
}
else
move_contact_solid(direction, speed);

hspeed=0;
vspeed=0;

O que eu fiz? Usei um truque para a partir de hspeed e vspeed calcular o speed e a direction. Assim podemos saber se o movimento será possível. Se não for, então ele move até o sólido, apenas encostando. No final, zeramos hspeed e vspeed para que ele não se mova sozinho.
A colisão entre o player e objetos sólidos ficou bem mais suave(continua travando as vezes na parede, mas está bem melhor).

No entando agravou o problema da arma ficar andando a frente da direção em que o player está andando

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por PedroX em Sab 26 Abr 2014, 23:23

Coloque +1 na frente, assim:

if (place_free(x+hspeed+1, y+vspeed+1))

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: Problema de colisão

Mensagem por peixoto em Dom 27 Abr 2014, 10:39

PedroX escreveu:Coloque +1 na frente, assim:

if (place_free(x+hspeed+1, y+vspeed+1))
A colisão agora está quase perfeita(só fica preso na parede se o player realmente for de encontro a ela,e se esforçar para se prender a ela)
No entando agora(desde o código que usei acima, só que esqueci de dizer) a arma anda um pouco atraz do player(como se estivesse seguindo ele) e em alguns casos, ao colidir com a parede o player se "teleporta" para outra posição(não aleatória)

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por PedroX em Dom 27 Abr 2014, 11:07

É que ele se movia para dentro do sólido só por estar encostado.
Código:
hspeed = (keyboard_check(vk_right)-keyboard_check(vk_left))*5;
vspeed = (keyboard_check(vk_down)-keyboard_check(vk_up))*5;

if (speed>0)
{
if (place_free(x+hspeed+1, y+vspeed+1))
{
x+=hspeed;
y+=vspeed;
}
else
move_contact_solid(direction, speed);
speed = 0;
}

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: Problema de colisão

Mensagem por peixoto em Dom 27 Abr 2014, 11:29

O problema dos teleports sumiu mas ainda continua o problema com as armas

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por Thyago em Dom 27 Abr 2014, 12:03

tente colocar o código da posição da arma no draw.

Thyago

Ranking : Nota B
Número de Mensagens : 1092
Idade : 30
Data de inscrição : 24/08/2009
Notas recebidas : D+B+B+C+A
Reputação : 31
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 1
   :

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por PedroX em Dom 27 Abr 2014, 12:10

A arma está indo atrás? Coloque o código de seguir no End Step.

Isso porque o Game Maker internamente faz algo assim:

Código:
for(var i=0; i<total_objetos; i++)
{
objeto(i).step();
}

atualiza posições

for(var i=0; i<total_objetos; i++)
{
objeto(i).end_step();
}

for(var i=0; i<total_objetos; i++)
{
objeto(i).draw();
}

O GM atualiza a posição dos objetos só depois do Step e antes do End Step.

Ou seja, como você move o player no Step e a arma atualiza a posição no Step, ela não irá para a nova posição dele, mas sim para a antiga.

Colocando no End Step ou ainda no Draw, como o Thyago sugeriu, mas aí precisará usar draw_self() [no GM:S], ou draw_sprite() [no GM.x], o player já definiu a sua posição e então ela irá para a posição certa.

Depois vem o Draw, e desenha tudo perfeitamente.

Mais informações:
http://gmbr.forumeiros.com/t6785-xcreator-tutorial-sobre-o-funcionamento-dos-eventos
http://gmbr.forumeiros.com/t20443-mini-tuto-instance-creation-code
http://gmc.yoyogames.com/index.php?showtopic=394983 (bem completo)

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: Problema de colisão

Mensagem por peixoto em Dom 27 Abr 2014, 17:48

Obrigado pela ajuda.
A colisão ainda não está 100% mas está 85% e isso ja me foi uma ajuda imensa!

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por Willy em Dom 27 Abr 2014, 18:21

Procurei alguns tutoriais e engines para corrigir isso, mas em sua grande maioria eles são complicados e exigiam uma grande quantidade de mudanças no meu projeto para serem implementados.
Apesar disso, não vou deixar de recomendar minha engine, Movimento Limpo. A principio ela deve parecer um pouco complicada (isso se você olhar os scripts), mas, o uso dela não é. Dê uma olhada lá!
Flws... blz

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por peixoto em Dom 27 Abr 2014, 18:27

Willy escreveu:
Procurei alguns tutoriais e engines para corrigir isso, mas em sua grande maioria eles são complicados e exigiam uma grande quantidade de mudanças no meu projeto para serem implementados.
Apesar disso, não vou deixar de recomendar minha engine, Movimento Limpo. A principio ela deve parecer um pouco complicada (isso se você olhar os scripts), mas, o uso dela não é. Dê uma olhada lá!
Flws... blz
Eu dei uma olhada nela(foi a primeira inclusive).Mas como quero participar desse CQ(que será em pouco tempo, sendo que já não tenho muito tempo disponivel para o Game Maker), não tem como eu estudar ela.

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Problema de colisão

Mensagem por Conteúdo patrocinado Hoje à(s) 06:11


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