Conectar-se

Esqueci minha senha

Últimos assuntos
» [Duvida] O que aprender
Hoje à(s) 00:17 por Fubukki

» Nota de esclarecimento - GMBR voltou!
Sex 23 Jun 2017, 20:33 por Willy

» Regras do Fórum
Sex 23 Jun 2017, 19:02 por GMBR

» Retorno da GMBR!!!
Ter 24 Jan 2017, 15:43 por GMBR

» Jogo Dengue HTML
Seg 30 Nov 2015, 16:17 por guga

» Criando IA Simples para inimigos
Qua 25 Nov 2015, 19:22 por DJDAVYD

» Ordenar variavel em ordem decrescente
Sex 28 Ago 2015, 21:09 por Kodained

» colisão de queda após outra colisão dando problema
Qui 27 Ago 2015, 13:51 por manobrother

» Crio Trilha Sonora para Games!
Qui 27 Ago 2015, 13:50 por Isaias Malafaia

» Problema com Colisão
Qui 27 Ago 2015, 12:30 por The_Game

» Quem quer Uma Engine, e de Quê?
Qui 27 Ago 2015, 09:22 por theguitarmester

» [RESOLV]Como adicionar 2 objetos na mesma posição?
Qua 26 Ago 2015, 11:38 por Bhryenno Kelvyn Carlson

» Sistema de porta!!!
Ter 25 Ago 2015, 21:29 por theguitarmester

» Venda de objetos em Inventário - Multiplicado
Seg 24 Ago 2015, 18:33 por AG Hydra

» Atirar na direção certa
Seg 24 Ago 2015, 09:03 por theguitarmester

» Western Duels
Seg 24 Ago 2015, 07:47 por theguitarmester

» Problemas na compilação android
Dom 23 Ago 2015, 23:43 por Zero.

» Dúvida sobre strings, lendo txt
Sab 22 Ago 2015, 20:31 por Pai véi

» Como estabilizar um som
Sab 22 Ago 2015, 19:03 por Isquilo_Roedor

» Janela Modal
Sab 22 Ago 2015, 09:23 por Pai véi

» Sobre instance Creation Code
Sab 22 Ago 2015, 08:39 por Pai véi

» LudumDare #33
Sex 21 Ago 2015, 21:17 por WellingtonBecker

» Como fazer um temporizador
Sex 21 Ago 2015, 19:02 por Isquilo_Roedor

» GMS sempre salva projeto ao compilar?
Sex 21 Ago 2015, 12:32 por Pai véi

» Tipo de Draw que dê melhor fps...
Sex 21 Ago 2015, 12:25 por Pai véi

Quem está conectado
26 usuários online :: 2 usuários cadastrados, Nenhum Invisível e 24 Visitantes

jonnyall, Kapoty

[ Ver toda a lista ]


O recorde de usuários online foi de 324 em Ter 05 Out 2010, 13:36

#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)
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6034
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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
avatar
Pratagy

Data de inscrição : 03/08/2009
Número de Mensagens : 23
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário

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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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?
avatar
falbo

Data de inscrição : 01/08/2009
Número de Mensagens : 52
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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!
avatar
falbo

Data de inscrição : 01/08/2009
Número de Mensagens : 52
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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
avatar
gfreaks

Data de inscrição : 29/08/2009
Número de Mensagens : 24
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário

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!
avatar
everlast

Data de inscrição : 28/07/2009
Número de Mensagens : 76
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário

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 =/
avatar
SIGILOSO

Ranking : Nota A
Notas recebidas : A+A+A+A+A+A+A
Data de inscrição : 06/06/2009
Número de Mensagens : 2264
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 4
   : 2
   : 1

Ver perfil do usuário

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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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...
avatar
Adriel

Data de inscrição : 18/07/2009
Número de Mensagens : 922
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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
avatar
Assassino

Data de inscrição : 13/08/2010
Número de Mensagens : 390
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 0
   : 0
   : 0

Ver perfil do usuário 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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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.
avatar
theguitarmester

Ranking : Sem avaliações
Notas recebidas : B
Data de inscrição : 28/02/2012
Número de Mensagens : 1908
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1

Prêmios
   : 2
   : 2
   : 1

Ver perfil do usuário 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!
avatar
Alex FC

Ranking : Nota A
Notas recebidas : B A
Data de inscrição : 20/12/2008
Número de Mensagens : 2503
Insígnias de JAM :

Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 2
   : 1
   : 1

Ver perfil do usuário 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.
avatar
theguitarmester

Ranking : Sem avaliações
Notas recebidas : B
Data de inscrição : 28/02/2012
Número de Mensagens : 1908
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1

Prêmios
   : 2
   : 2
   : 1

Ver perfil do usuário 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


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