Página 1 de 1

[PROG] Entenda as funções de colisão

Enviado: Sex Abr 29, 2016 11:55 am
por Tutoriais & Aulas
Autor original: PedroX
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

Imagem

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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!