Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

[PROG]#COL Aula 01 - Colisões simples

Tutoriais, videoaulas, guias e downloads para te ajudar nos estudos.
Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 620
Localização: Dourados-MS

Contato:

[PROG]#COL Aula 01 - Colisões simples

Mensagem por All-x » Sex Abr 29, 2016 4:28 pm

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".

Imagem

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();
}
As funções que usaremos são:

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:

Imagem

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);
x: Posição horizontal a ser checada.
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
}
Nesse código a caixa de colisão é criada 1 pixel para baixo do objeto. Dessa forma ela evita que o objeto afunde no chão. Isso, pois ela colide com o chão antes do objeto, por estar adiantada 1 pixel. Caso não estiver livre de colisão com sólidos a gravidade é zerada e se estiver livre a gravidade é 1.

É 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
}
Se não estiver livre de colisão com sólidos (Ou seja, colidindo) e teclar a tecla espaço, a velocidade vertical sera -10 (para cima). Lembrando que not antes de uma função significa não. Assim você pede o resultado inverso.

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);
x: Posição horizontal a ser checada.
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);
x: Posição horizontal a ser checada.
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*/}
O obj_1 é o objeto com que vai checar a colisão.

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);
x: Posição horizontal a ser checada.
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);
x: Posição horizontal a ser checada.
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;
}
position_meeting

Código: Selecionar todos

position_meeting(x, y, obj);
Esta função não utiliza a mascara de colisão da sprite do objeto como as anteriores. Ela usa apenas um ponto (x,y) retornando true caso haja colisão, e false caso não. Ideal para usar no clique do mouse.

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!!!");
}
Até aqui você pode entender bem esse código. Nem precisa de explicação detalhada. São funções muito semelhantes.

Qualquer duvida perguntem! vlw?

FLWS!
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes