COLISÕES
Aula 01 - Colisões simples
(Atualizado 08/02/2015)
Bem-vindos a primeira parte das aulas de colisões, nesta aula aprenderemos sobre colisões simples e essas são bem fáceis.
Evento de colisão
O método mais simples de detectar colisões é usando o evento "Collision".
A vantagem em relação às funções que veremos abaixo é que você poder usar o objeto especial "other" pra se referir à instância a qual está colidindo.
Exemplo: Pular em cima do Goomba no Super Mario:
Código: Selecionar todos
// Se os pés estão acima do goomba e está caindo
if bbox_bottom <= other.bbox_top and vspeed > 0
{
// Destrói o goomba
with(other) instance_destroy();
}
place_free(x,y)
place_empty(x,y)
place_meeting(x,y,obj)
instance_place(x,y,obj)
instance_position(x,y,obj)
position_meeting(x,y,obj)
Essas funções criam uma nova "caixa de colisão" idêntica a do objeto que as chamou para detectar a colisão (Com exceção das duas últimas que criam apenas um ponto). Olhe para o esquema:
As caixas são diferentes caso a colisão seja precisa ou não. A área contornada em vermelho será usada para detectar a colisão. Em resumo, a caixa precisa desconsidera áreas com transparência. Para saber como é a área de seu objeto, abra a sprite do objeto e veja em sua configuração se a caixa "Precise Collision Checking" está marcada. Se sim, ela é precisa. Para mais detalhes veja esta aula:
#DGM Aula 03 - Sprites
place_free
Vamos em sequência, a função place_free é usada para detectar colisões com objetos sólidos (todos os objetos sólidos). Sólidos são objetos marcados com a opção solide/ou que estejam com a variável solid com valor true.
Código: Selecionar todos
place_free(x, y);
y: Posição vertical a ser checada.
Retorna 1 caso colidir com algum objeto sólido, caso não retorna 0.
O exemplo mais simples dessa função esta no código de gravidade, nos jogos de plataforma:
Código: Selecionar todos
//Gravidade
if place_free(x,y+1)
{
gravity = 1
}
else
{
gravity = 0
}
É como se fosse uma previsão: "Se o objeto estivesse na posição tal, haveria colisão com sólidos?"
Outro exemplo é no código de pulo:
Código: Selecionar todos
//Pula
if not place_free(x,y+1) and keyboard_check_pressed(vk_space)
{
vspeed=-10
}
A função place_empty, detecta colisão com qualquer objeto. Essa é a única diferença que ela tem do place_free.
place_empty
Código: Selecionar todos
place_empty(x, y);
y: Posição vertical a ser checada.
Retorna 1 caso colidir com algum objeto, caso não retorna 0.
Agora vamos a função place_meeting. Nela você pode escolher o objeto que será checado na colisão, independente se ele for sólido ou não.
place_meeting
Código: Selecionar todos
place_meeting(x, y, obj);
y: Posição vertical a ser checada.
obj: Nome do objeto a ser checado ou ID de instancia.
Retorna 1 caso colidir com o objeto selecionado, caso não retorna 0.
Vamos ver como funciona:
Código: Selecionar todos
if place_meeting(x+1,y,obj_1){/*algo acontece aqui*/}
Mas digamos que você queira que a função retorne a id da instância que está colidindo na caixa. Então apenas troque por instance_place.
instance_place
Código: Selecionar todos
instance_place(x, y, obj);
y: Posição vertical a ser checada.
obj: Nome do objeto a ser checado ou ID de instancia.
Retorna ID do objeto caso colidir com o objeto selecionado, caso não retorna -4 que é o mesmo que nada.
instance_position
Código: Selecionar todos
instance_position(x, y, obj);
y: Posição vertical a ser checada.
obj: Nome do objeto a ser checado ou ID de instancia.
Aqui temos uma diferença importante em relação a anterior. A instance_place usa a mascara de colisão do objeto atual como área de colisão. Já está usa apenas um ponto (x,y). Veja num exemplo prático:
Código: Selecionar todos
//Guarda a instancia que está sobre a posição do mouse.
var tocado = instance_position(mouse_x, mouse_y, obj_inimigo);
//Muda a cor da instância
if tocado
{
tocado.image_blend = c_red;
}
Código: Selecionar todos
position_meeting(x, y, obj);
Código: Selecionar todos
if position_meeting(mouse_x, mouse_y, obj_inimigo) and mouse_check_button_pressed(mb_left)
{
show_message("Tem um inimigo aqui!!!");
}
Qualquer duvida perguntem! vlw?
FLWS!