#COL Aula 01 - Colisões simples

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

#COL Aula 01 - Colisões simples

Mensagem por Alex FC em Qui 27 Ago 2009, 19:18

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.

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:


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

Vamos em sequência, a função place_free é usada para detectar colisões com objetos sólidos (todos os objetos sólidos).

Código:
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:
//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.

Outro exemplo é no código de pulo:

Código:
//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.

Código:
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.

Código:
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:
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.

Código:
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.

Código:
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:
//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:
position_meeting(x, y, obj);

Idêntica a função acima. A diferença é que está não retorna uma ID, mas sim apenas se há uma instância do objeto naquela posição:

Código:
if position_meeting(mouse_x, mouse_y, obj_inimigo)
{
    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!


Última edição por Alex FC em Qua 25 Fev 2015, 17:35, editado 17 vez(es) (Razão : Atualização)

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por PedroX em Qui 27 Ago 2009, 21:46

muito bom pra quem comeco agora

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Pratagy em Sex 28 Ago 2009, 19:15

Fala rapa, como sempre seu tutorial ta otimo, tu é o cara.
Seguinte, vo te pedir umas informações adicionais sobre pulo, sei que nao tem muito haver com o que tu tas falando aqui mas enfim.
Resolvi fazer as paradas sozinho, parar de pegar engines e tal, achno isso chato.
Entao resolvi tentar fazer o pulo eu mesmo (ou quase isso)... Entao como faço pra o objeto quando chegar a certa distancia no ar voltar para o chao?
Ir eu ja sei, ja ta explicado aqui, mas o obj vai ate o infinito Happy

Pratagy

Número de Mensagens : 23
Data de inscrição : 03/08/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sex 28 Ago 2009, 20:16

Bom, se eu entendi bem você quer o pulo né? Vamos passo-a-passo para você poder entender.

1-Crie 2 objetos: Player e o Chao.

2-marque a opção "solid" no obj_chao ou coloque isso no create dele:

Código:
solid=true

2-Va ao step do player e coloque:
Código:

if place_free(x,y+2){gravity=1}
else
gravity=0

if vspeed>15{vspeed=15}

if keyboard_check_pressed(vk_up)
{
if !place_free(x,y+2){vspeed=-10}
}

3-va na colisão do player com o bloco e coloque:

Código:
move_contact_solid(direction,15)
speed=0

Assim é o pulo, se quiser mais detalhes me mande uma MP. Vlw?

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por falbo em Sex 28 Ago 2009, 20:43

Estou com um problema!
Tipo quando minha boneca bate na lateral do chão se eu ficar apertando as setas direita ou esquerda ela nao cai!
Alguem pode me ajudar?

falbo

Número de Mensagens : 52
Idade : 23
Data de inscrição : 01/08/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sex 28 Ago 2009, 20:51

Claro! É simples, não sei se você esta usando hspeed ou x, então vou mostrar as duas formas:

1- A com x, o código é assim:
Código:

//esquerda
if place_free(x+5,y){x+=5}
//direita
if place_free(x-5,y){x-=5}

2- A com hspeed, o código é assim:

Código:
//esquerda
if place_free(x+5,y){hspeed+=5}
//direita
if place_free(x-5,y){hspeed-=5}

Não sei se você esta usando movimentação pelo step ou por eventos das teclas, por isso coloquei só isso. Vlw?

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por falbo em Sex 28 Ago 2009, 20:55

Oi sei que a pergunta que vou fazer agora e boba mais estou com duvida ainda em uma coisa!
Onde eu coloko esse codigo?
no step do player ou na colisão entre o player e o chão?
Tipo eu uso movimentação pelo step que aprendi aqui no forum com as aulas do reddragon!

falbo

Número de Mensagens : 52
Idade : 23
Data de inscrição : 01/08/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sex 28 Ago 2009, 21:22

Por exemplo onde você colou hspeed+5 ou x+=5 você coloca if place_free(x+5,y){x+=5}. É só trocar. vlw?

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por gfreaks em Sab 29 Ago 2009, 01:22

e tudo a mema coisa
esses cara so da ctrl c ctrl v e depois fica fazendo essas pergunta
com x, o código é assim:
com hspeed, o código é assim:
ae brow nem precisava mostra isso por que tava obvio

gfreaks

Número de Mensagens : 24
Data de inscrição : 29/08/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por everlast em Sab 29 Ago 2009, 16:00

se num viu q o kra é iniciante, dexa o kra perguntar, só perguntando que ele vai tirar a dúvida dele, até agora só vi vc postando coisas ignorantes e sem educação, agente ta aqui pra aprender tbm, e perguntar, mesmo que uma coisa óbvia( que não é tão óbvia assim, já que ele não conseguiu entender) faz parte, vc com certeza devve ser um desses garotos novinhos, que acham que só pq aprenderam, são mais inteligêntes do que os outros, vê se cresce rapaz, ta na hora néh!

everlast

Número de Mensagens : 76
Idade : 24
Data de inscrição : 28/07/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por SIGILOSO em Sab 29 Ago 2009, 16:12

everlast says:
se num viu q o kra é iniciante, dexa o kra perguntar, só perguntando que ele vai tirar a dúvida dele, até agora só vi vc postando coisas ignorantes e sem educação, agente ta aqui pra aprender tbm, e perguntar, mesmo que uma coisa óbvia( que não é tão óbvia assim, já que ele não conseguiu entender) faz parte, vc com certeza devve ser um desses garotos novinhos, que acham que só pq aprenderam, são mais inteligêntes do que os outros, vê se cresce rapaz, ta na hora néh!

calma cara,desse jeito ninguem vai a lugar nenhum,msm eu concordando 100% com vc =/

SIGILOSO

Ranking : Nota A
Número de Mensagens : 2264
Idade : 23
Data de inscrição : 06/06/2009
Notas recebidas : A+A+A+A+A+A+A
Reputação : 39
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 4
   : 2
   : 1

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sab 29 Ago 2009, 17:14

É verdade. E eu também não tive nenhum incomodo em responder. Não postem mais sobre isso aqui, vocês sabem que os tópicos podem ser trancados por causa de brigas né?. Não quero ver meu tópico trancado e nem usuarios banidos. vlw?

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Adriel em Ter 04 Maio 2010, 14:00

Poxa, não consigo até hoje parar com essa droga dele grudar na lateral do cubo Sad ...

Já tentei fazer :

Código:
if place_free(x+5,y){hspeed+=5}

E não deu...

Adriel

Número de Mensagens : 922
Idade : 18
Data de inscrição : 18/07/2009
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Assassino em Qua 01 Set 2010, 16:13

Vlw aê cara, to acompanhando e aprendendo o máximo que posso em todos os seus Tutos ! blz

Assassino

Número de Mensagens : 390
Idade : 20
Data de inscrição : 13/08/2010
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://rockstarfamilies.blogspot.com/

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sex 30 Nov 2012, 22:50

Aula atualizada - 30/11/12:

- Melhora na grafia e explicação;
- Atualização das imagens.

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por theguitarmester em Sab 22 Dez 2012, 21:57

Adriel escreveu:if place_free(x+5,y){hspeed+=5}
Ele Não Frequenta mais o Fórum, mas ajuda Outros que tenham a Mesma Questão.
isso fará com que ele sete o hspeed em 5 enquanto nenhum Sólido Existir, mas quando existir, ele não irá mais Setar, porém ele já está setado, Então ele Continuará andando, para Resolver isto você pode Fazer Assim:
if place_free(x+5,y){hspeed+=5}else{hspeed=0}

_______________________________________
Alex FC Sei que Você está fazendo este Tutorial Voltado a Iniciantes, mas se Você tem Conhecimento Grande em Colisões, podia fazer um Tutorial de Colisão mais Real, Colisão com Física Aplicada.

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Alex FC em Sab 22 Dez 2012, 22:14

Alex FC Sei que Você está fazendo este Tutorial Voltado a Iniciantes, mas se Você tem Conhecimento Grande em Colisões, podia fazer um Tutorial de Colisão mais Real, Colisão com Física Aplicada.
Tenho outros projetos. Um deles vai ajudar muito quem está começando, para ter ideia do total funcionamento do Game Maker.

Vou dar prioridade a esses projetos. Caso eu termine e ninguém tenha criado conteúdo relevante sobre o assunto, eu faço.

FLWS!

Alex FC

Ranking : Nota A
Número de Mensagens : 2503
Idade : 23
Data de inscrição : 20/12/2008
Notas recebidas : B A
Reputação : 174
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://redscreensoft.blogspot.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por theguitarmester em Sab 22 Dez 2012, 22:28

Tenho outros projetos. Um deles vai ajudar muito quem está começando, para ter ideia do total funcionamento do Game Maker.

Vou dar prioridade a esses projetos. Caso eu termine e ninguém tenha criado conteúdo relevante sobre o assunto, eu faço.
Ou Seja, Se Sair, Vai Demorar Muito!

Mas é Importante ter Conteúdo para Iniciantes, porque ele Ajuda os Iniciantes(obvio!), e Tambem ajuda os Que já tem uma Experiências, mas Sempre há Coisas Que Não sabemos, ou não Dominamos, eu Por Exemplo, Não sei Sobre a área de Partículas, e recentemente aprendi a usar ds_list, ainda Não sei fazer um Jogo em 3D(mas Não quero me Aprofundar com isto no GM, apenas Saber o Básico).

A Gente Vai Aprendendo de Pouco em Pouco, se caso sair o Tutorial, ou Explicações, eu Querei Ver.

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: #COL Aula 01 - Colisões simples

Mensagem por Conteúdo patrocinado Hoje à(s) 02:23


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum