Entenda as funções de colisão

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

Qualidade Entenda as funções de colisão

Mensagem por PedroX em Dom 22 Maio 2011, 15:17

Nesse tutorial vou mostrar como usar as funções de colisão.
Essas funções são muito úteis para quem sabe usá-las.
Antes de começar, vamos para os requisitos:

- Game Maker (qualquer versão recente)
- Noção básica de GML


Vamos dividir o tutorial em duas partes:

- Funções de Colisão simples: Place e Position.
- Funções de Colisão avançadas: Retângulo, Circulo, Linha e Ponto.


Funções de Colisões simples: Place e Position



place_free: Essa função checa se o objeto (sprite) está livre de colisões (com objetos sólidos) na posição indicada.
Código:
if place_free(x,y+1)
{//espaço livre (de sólidos) um pixel abaixo}

place_meeting: É quase a mesma coisa que a função anterior. Essa checa se a sprite está colidindo com um objeto específico, na posição indicada.
Código:
if place_meeting(x+5,y,obj_parede)
{//tem uma parede na minha frente}

place_empty: Parece com a primeira. Essa checa se a sprite está livre de colisões, na posição indicada, com qualquer objeto, mesmo que este não seja sólido.
Código:
if place_empty(x,y+1)
{//espaço livre um pixel abaixo}
------------------------------------------------------------------------------
position_empty: Essa função verifica se, na posição indicada, não há nenhum objeto.
Código:
if position_empty(100,100)
{//na posição (100,100) não há nenhum objeto}

position_meeting: Checa se o objeto especificado está na posição determinada.
Código:
if position_meeting(mouse_x,mouse_y,obj_botao)
{//no local que o mouse está, tem um botão}
------------------------------------------------------------------------------
instance_place: Checa se tem um objeto na posição indicada, retornando o id da instância ou noone. Ambos os objetos precisam de um sprite.
Código:
if instance_place(x+5,y,all)
{//tem um objeto na minha frente}

instance_position: Checa se tem um objeto na posição indicada, retornando seu id.
Código:
if instance_position(x+5,y,all)
{//tem um objeto na minha frente, possivelmente dentro de mim (se meu sprite tiver mais que 5 pixels)}

Funções de Colisão avançadas

Colisão retangular:
Essa função usa um retângulo para detectar as colisões.
Em todos os exemplos abaixo, a origem do sprite deve estar no começo.
O sprite deve ter o tamanho 32x32 em todos os exemplos citados.
Código:
if collision_rectangle(x+30,y,x+34,y+32,obj_parede,1,0)
{
//Colidi no meu lado direito com a parede.
// O numero 1 significa precisão.
}

Colisão circular:
Essa função detecta a colisão atraves de um circulo.
Código:
if collision_circle(x,y,16,obj_parede,1,0)
{
//estou colidindo com o objeto parede na minha esquerda
//o ponto central do circulo sera no começo do meu sprite
//o circulo tera 16 pixels de raio e a colisão será precisa
}

Colisão por Linha:
Essa função detecta uma colisão de maneira bem diferente, checando se entre sua posição e outra posição há um objeto, como uma parede.
Código:
if collision_line(x+30,y+16,x+64,y+16,obj_parede,1,0)
{
//tem uma parede na minha direita
}

Colisão por Ponto:
Checa se um objeto está colidindo com determinado ponto.
É bem semlhante com place_meeting.
Código:
if collision_point(x+40, y+16, obj_parede, 1, 0)
{
//tem uma parede na minha direita
}

DICAS ADICIONAIS

Você pode usar algumas técnicas interessantes nessas funções.
Vamos ver um exemplo:

Código:

obj = collision_point(x+40, y+16, obj_parede, 1, 0)
with(obj) instance_destroy();

Isso destroi a parede, quando o objeto vai na direção dela (da esquerda para a direita). Você pode usar essa técnica com todas as funções mostradas.

Conclusão do tutorial

Espero que tenham entendido para que serve cada uma das funções.
Qualquer dúvida, podem me perguntar neste tópico.
Qualquer sugestão será bem-vinda.
Esse tutorial será um manual das colisões, em português.

Talvez farei esses exemplos:

- Invencibilidade: Ao colidir com um inimigo, destruir ele.
- Inteligência artificial: Ao passar por um buraco, o inimigo pula, usando a funcão place_empty ou place_free.
- Entre outros. São inúmeras as coisas que se pode fazer.

Até mais!


Última edição por Pedro Henrique em Seg 17 Out 2011, 18:06, editado 6 vez(es)

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

Qualidade Re: Entenda as funções de colisão

Mensagem por Thopson1m em Dom 22 Maio 2011, 20:52

Ótimo tutorial, bem explicado e detalhado,e como vc é uma pessoa legal, acrescentei +1 em sua reputação. Continue assim: ajudando os outros! Happy


Última edição por Zignaw em Dom 22 Maio 2011, 23:29, editado 2 vez(es)

Thopson1m

Número de Mensagens : 624
Idade : 26
Data de inscrição : 21/05/2011
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gnbr.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por .:Allison:. em Dom 22 Maio 2011, 21:13

Nuss, muito bom, daí eu só sabia os 3 primeiros, básicos, pratiquei tanto que está tudo decorado, Laughing

Ótimo tutorial, bem explicativo e com muitos exemplos, do jeito que eu gosto, também dei reputação.

.:Allison:.

Ranking : Nota B
Número de Mensagens : 630
Idade : 19
Data de inscrição : 25/07/2010
Notas recebidas : B
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://clubmaker.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por sonic luan em Dom 22 Maio 2011, 21:56

muito bom tem umas funções ai que eu nem conhecia.

sonic luan

Ranking : Nota C
Número de Mensagens : 1003
Idade : 17
Data de inscrição : 28/01/2011
Notas recebidas : C-D-A-C
Reputação : 18
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://sonicmaker.forumeiros.com/memberlist

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por Thopson1m em Dom 22 Maio 2011, 22:07

Eu tbm não, sonic luan, por isso é tão importante que pessoas, como o Pedro Henrique, dividam seus extensos conhecimentos conosco.

Thopson1m

Número de Mensagens : 624
Idade : 26
Data de inscrição : 21/05/2011
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gnbr.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por PedroX em Seg 23 Maio 2011, 10:47

Valeu gente!
Estou feliz por ajudá-los.
Eu acho que o nome do tópico está meio incoerente com o assunto.
Vão pensar que é aqueles função: collision_circle, collision_rectangle etc.
Alguem sugere um novo titulo?

Até mais!

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

Qualidade Re: Entenda as funções de colisão

Mensagem por Thopson1m em Seg 23 Maio 2011, 10:50

Acredito que o nome está perfeito, mas já que vc pediu uma sugestão, ponha algo como: "Entenda as funções de colisão entre obojetos.", ou algo nesse estilo. Happy


Última edição por Zignaw em Seg 23 Maio 2011, 10:54, editado 1 vez(es)

Thopson1m

Número de Mensagens : 624
Idade : 26
Data de inscrição : 21/05/2011
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gnbr.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por MatheusReis em Seg 23 Maio 2011, 10:53

Você não precisa nem mudar o título, apenas faça um edit explicando as funções de colisão por área.
(collision_point, collision_line, collision_circle, collision_rectangle, collision_ellipse)

Que são quase tão simples quanto as outras.

Assim será um tutorial completo de colisões 8D.

MatheusReis

Ranking : Nota A
Número de Mensagens : 1087
Idade : 23
Data de inscrição : 13/01/2010
Notas recebidas : B-A-A
Reputação : 30
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 0

http://www.mathaeuz.deviantart.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por PedroX em Seg 23 Maio 2011, 11:59

Atendendo ao pedido do Mathaeuz, eu coloquei outras funções.
Agora o tutorial está bem mais completo.

Atualizado.

Até mais!

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

Qualidade Re: Entenda as funções de colisão

Mensagem por Thopson1m em Seg 23 Maio 2011, 12:09

WOW, que maravilha! Ficou melhor que antes! Vlw por essa bem-vinda atualização, Pedro Henrique! Happy

Thopson1m

Número de Mensagens : 624
Idade : 26
Data de inscrição : 21/05/2011
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gnbr.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por Rhino em Seg 23 Maio 2011, 13:24

Muito bom, Pedro! Eu mesmo tinha algumas dúvidas em relação ao código place_empty e alguns outros ai citados. Parabéns pelo tutorial! =D

Rhino

Ranking : Nota C
Número de Mensagens : 136
Idade : 24
Data de inscrição : 17/04/2010
Notas recebidas : C-B
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por saim em Seg 23 Maio 2011, 13:52

Olá, Pedro Henrique! Parabéns pela iniciativa!
Gostaria de acrescentar umas informações que você pode incluir no tutorial:
- é possível armazenar a id retornada por algumas dessas funções numa variável e usar isso para inserir linhas de código dentro dela. Exemplo:
Código:
var colidido;
colidido=instance_place(x, y, all)
with (colidido)
instance_destroy()
Código:
var colidido;
colidido=collision_circle(x,y,all)
colidido.gravity=0.5

- essas mesmas funções te retornam apenas a id de uma das instâncias, não sei se aquela de menor ou maior id (mas sei que isso independe da posição da instância). É importante saber disso, porque às vezes o programador quer inserir códigos em todas as instâncias que cumprem determinados requisitos. Por exemplo, "na hora a torre de veneno que atirar, quero que todos os zumbis próximos dela mudem a variável 'envenenado' para 'true', então vou usar collision_circle". Isso não funciona, só um dos zumbis será envenenado, não necessariamente aquele mais próximo da torre (no caso, infelizmente, o código de checar a distância da torre tem que correr em TODOS os zumbis, tipo "with(obj_zombie); if distance_to_object...").

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por PedroX em Seg 23 Maio 2011, 14:59

@saim

Obrigado pela sugestão.
Pesquisei em alguns sites para ver quais funções apresentam essa tecnica.
Sua sugestão foi adicionada ao tópico.

Quem tiver sugestões, pode colocar aqui.
Eu vou avaliar e colocar.

Até mais!

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

Qualidade Re: Entenda as funções de colisão

Mensagem por fredcobain em Qua 25 Maio 2011, 10:14

Excelente tutorial. Eu estava pensando em postar um tutorial sobre colisões, mas felizmente vc me poupou do trabalho. =)

Parabéns, ficou excelente.

Só faça uma correção por favor (coisa de cunho conceitual).

As funçoes que começam com position (tipo position_empty), elas checam se existe algum objeto em um determinado ponto(x,y) que é a menor porção possível do espaço (não usaria o termo posição).

Acho que vc pode até ilustrar a figura abaixo no seu tutorial, pro pessoal diferenciar o que é place (sprite) de position (ponto).

Veja:




fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por PedroX em Qua 25 Maio 2011, 10:45

Eu vi esse tutorial, que me serviu de base para fazer o meu próprio.
Eu pensei em colocar mais detalhes assim.

Pensei nisso:

Pedro Henrique escreveu:O place_meeting checa se naquela posição qualquer parte do sprite colide com o outro objeto. Já o position_meeting, checa se determinado ponto está colidindo com um objeto.

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

Qualidade Re: Entenda as funções de colisão

Mensagem por fredcobain em Qua 25 Maio 2011, 11:15

Pedro Henrique escreveu:Eu vi esse tutorial, que me serviu de base para fazer o meu próprio.
Eu pensei em colocar mais detalhes assim.

Pensei nisso:

Pedro Henrique escreveu:O place_meeting checa se naquela posição qualquer parte do sprite colide com o outro objeto. Já o position_meeting, checa se determinado ponto está colidindo com um objeto.

Pois é, apenas sugiro que vc troque a palavra posição por ponto(x,y), ou mesmo pixel.

Acho que vale a pena adicionar a imagem ao tutorial pra dar uma noção ainda melhor da diferença.

Aquela parte de usar a ID que o Saim falou tbm é interessantíssima, eu sugiro que vc adicione no seu tutorial. (p.s: os comentários do Saim geralmente são brilhantes mesmo, o cara é fera!).

=)

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Entenda as funções de colisão

Mensagem por PedroX em Qua 25 Maio 2011, 11:56

Eu adicionei a imagem ao tutorial (antes de você postar novamente).
A parte do saim está lá também, só que quase no final.
Obrigado pelas sugestões, e podem fazer mais...

Até mais!

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

Qualidade Re: Entenda as funções de colisão

Mensagem por Conteúdo patrocinado Hoje à(s) 05:42


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