[PROG] Entenda as funções de colisão
Enviado: Sex Abr 29, 2016 11:55 am
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: Selecionar todos
if place_free(x,y+1)
{//espaço livre (de sólidos) um pixel abaixo}
Código: Selecionar todos
if place_meeting(x+5,y,obj_parede)
{//tem uma parede na minha frente}
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}
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}
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)}
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.
}
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
}
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
}
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
}
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();
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!