COLISÕES
Aula 04 - Colisões circulares e de pontos
(Atualizado 08/02/2015)
Bem-vindos a quarta parte das aulas sobre colisões, aprenderemos sobre colisões circulares, que é um sistema onde se cria um circulo para detectar colisões. E colisões com pontos, que é um sistema onde se cria um ponto para detectar colisões e essas são bem mais fáceis que as colisões anteriores.
Um exemplo de colisão circular é quando queremos fazer um escudo para o personagem sem usar um objeto.
Engine, para estudarmos os seus códigos:
[GM:S] DOWNLOAD DA ENGINE
[GM8] DOWNLOAD DA ENGINE
Vá ao step do player e veja o código:
Código: Selecionar todos
//Escudo
meu_obj=collision_circle(x+16,y+16,40,inimigo,true,true)
with(meu_obj)
{
instance_destroy()
}
Código: Selecionar todos
collision_circle(x,y,radius,obj,prec,notme)
y: posição y do centro do circulo
obj: Objeto checado na colisão
radius: distância do centro do circulo até as bordas
prec: true para checagem pixel por pixel, false para retângulo
notme: desconsiderar esse objeto ao estar no circulo de colisão
Retorna: ID da instância do obj que entrar no circulo de colisão, tornando a expressão verdadeira. Caso não ocorra retorna -4, tornando a expressão falsa.
A variável meu_obj guarda a id da instância do inimigo. Caso algum inimigo entrar no raio do escudo, ele será destruído e mandado para o além. Já expliquei a função do construtor with na aula anterior. Então logicamente você sabe que o instance_destroy() vai ocorrer com o meu_obj. Ou seja, com a instância do objeto inimigo que colidiu com o escudo.
Ah mas você não tem certeza que há mesmo uma colisão circular no seu objeto? Simples, vamos desenhar um circulo com as mesmas coordenadas do circulo de colisão.
No objeto controle, no evento draw veja:
Código: Selecionar todos
//Para o player
with (player)
{
//Opacidade 50%
draw_set_alpha(0.5)
//Cor azul claro
draw_set_color(c_aqua)
//Desenha circulo nas mesmas coordenadas da colisão
draw_circle(x+16,y+16,40,false)
//Opacidade 100%
draw_set_alpha(1)
//Cor preta
draw_set_color(c_black)
}
Código: Selecionar todos
draw_circle(x,y,radius,outline)
y: posição y do centro do circulo
radius: distância do centro do circulo até as bordas
outline: desenhar somente borda
O resultado final vai ficar assim:
Agora a colisão de ponto collision_point, não precisa de muita explicação. A única coisa que muda é que vai ser uma colisão com somente um pixel.
Código: Selecionar todos
collision_point(x,y,obj,prec,notme)
y: posição y do ponto
obj: Objeto checado na colisão
prec: true para checagem pixel por pixel, false para retângulo
notme: desconsiderar esse objeto ao estar no circulo de colisão
Para testarmos, vá até o Step do objeto controle e adicione:
Código: Selecionar todos
//Se o bloco colidir na posição do mouse
with (collision_point(mouse_x,mouse_y,bloco,true,false))
{
//Destrói bloco
instance_destroy()
}
E terminamos mais uma parte. Aguardem que ainda tem mais. vlw?
Se tiver duvidas pergunte!
FLWS!