Página 1 de 1

[PROG]#COL Aula 04 - Colisões circulares e de pontos

Enviado: Sex Abr 29, 2016 4:38 pm
por All-x

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)
x: posição x do centro do circulo
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)
x: posição x do centro do circulo
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:

Imagem

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)
x: posição x do ponto
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()
}
Veja que usamos a função collision_point diretamente com o with sem usar uma variável como apoio. Assim é mais eficaz, eu só havia feito de outra forma para a didática ficar mais fácil.

E terminamos mais uma parte. Aguardem que ainda tem mais. vlw?

Se tiver duvidas pergunte!

FLWS!