quinta-feira, 5 de janeiro de 2012

[Pedrø] Entenda as funções de colisão

Qualidade
Nome: Entenda as funções de colisão
Blogueiro: Pedrø
Descrissao: Nesse tutorial vou mostrar como usar as funções de colisão.
Versao: Lite e Pro
Foto(s): [nao necessario]


Tutorial:
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.
if place_free(x,y+1)
{//espaço livre (de sólidos) um pixel abaixo}


place_meeting: É quase a mesma coisa que a função anterior. Essa checa se a sprite está colidindo com um objeto específico, na posição indicada.
if place_meeting(x+5,y,obj_parede)
{//tem uma parede na minha frente}


place_empty: Parece com a primeira. Essa checa se a sprite está livre de colisões, na posição indicada, com qualquer objeto, mesmo que este não seja sólido.
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.
if position_empty(100,100)
{//na posição (100,100) não há nenhum objeto}


position_meeting: Checa se o objeto especificado está na posição determinada.
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.
if instance_place(x+5,y,all)
{//tem um objeto na minha frente}


instance_position: Checa se tem um objeto na posição indicada, retornando seu id.
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)}






Funções de Colisão avançadas


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


Colisão circular:
Essa função detecta a colisão atraves de um circulo.
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
}


Colisão por Linha:
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.
if collision_line(x+30,y+16,x+64,y+16,obj_parede,1,0)
{
//tem uma parede na minha direita
}


Colisão por Ponto:
Checa se um objeto está colidindo com determinado ponto.
É bem semlhante com place_meeting.
if collision_point(x+40, y+16, obj_parede, 1, 0)
{
//tem uma parede na minha direita
}






DICAS ADICIONAIS


Você pode usar algumas técnicas interessantes nessas funções.
Vamos ver um exemplo:

obj = collision_point(x+40, y+16, obj_parede, 1, 0)
with(obj) instance_destroy();


Isso destroi a parede, quando o objeto vai na direção dela (da esquerda para a direita). Você pode usar essa técnica com todas as funções mostradas.

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.
Creditos: Pedrø

Nenhum comentário:

Postar um comentário