#COL Aula 02 - Colisões retangulares

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

#COL Aula 02 - Colisões retangulares

Mensagem por Alex FC em Ter 11 Ago 2009, 18:40

COLISÕES



Aula 02 - Colisões retangulares



(Atualizado 08/02/2015)

Bem-vindos a segunda parte das aulas sobre colisões, nesta aula aprenderemos sobre colisões retangulares, que é um sistema onde se cria um retângulo para detectar as colisões. Mas primeiro você precisa saber o seguinte:

1-Você deve saber a altura e a largura da sprite.

Vou usar uma sprite de 32 (altura)x32 (largura).



2-Saber como localizar cada pixel usando o editor de imagem do GM:

-Passe o mouse no pixel que você quer identificar e veja as posições na parte inferior da janela:



3-Entender o que é posição relativa e posição absoluta:

x+5 e y-5 representam posições relativas ao objeto à ela atribuida.
x=5 e y=5 representam posições absolutas ao objeto atribuido.
x+=5 e y-=5 representam mudança de posição.

Vão ser dois objetos principais: o player e o inimigo. Estudaremos o código da engine abaixo:





Começaremos com uma colisão na lateral direita do player. Va ao evento Create do player:

Código:
//Guarda na variável a ID do inimigo que ficar na área de colisão
colide_inimigo = collision_rectangle(x+31, y, x+46, y+32, inimigo, 0, 0)

O mesmo código está presente no step, para checarmos a colisão em tempo real.

Explicação de cada parte:

Como você deve estar vendo há duas posições x e duas y. Cada uma delas é um lado do retângulo (por isso o nome collision_rectangle):


x+31: Lado esquerdo do retângulo;

y: Parte de cima do retângulo;

x+46: Lado direito do retângulo;

y+31: Parte de baixo do retângulo;



obj: Objeto que checaremos se está na área de colisão;

true: Colisão precisa checa cada pixel da sprite do inimigo (Caso a sua máscara de colisão seja precisa). Deixando false ele usa um retângulo para detectar a colisão;

notme:
Caso você esteja checando a colisão de um objeto com instâncias dele mesmo e queira que a colisão não pegue essa instancia emissora, coloque como true. Caso contrário coloque false.

A função collision_rectangle retorna dois valores:

- -4 quando não há nenhuma instância do obj (Objeto que colocamos na função) na área de colisão;

- A ID (Número que identifica cadainstância de um objeto) quando há uma instância do obj na área de colisão.

Ela é considerada uma expressão verdadeira sempre que houver uma instância do obj na área de colisão, pois o número retornado é maior que zero:

Código:
//Desenha a frase se estiver colidindo com o inimigo
if player.colide_inimigo
{
    draw_text(4,4,"Esse bicho feio tá na área de colisão, sua ID é:"+string(player.colide_inimigo))
}

Veja que para ter certeza de que a área de colisão está correta, nós desenhamos um retângulo vermelho no evento Draw do objeto controle:

Código:
//Desenha retângulo nas mesmas coordenadas dadas no collision_rectangle
draw_rectangle(player.x+31, player.y, player.x+46, player.y+31, 0)

Ainda esta com dúvida? Então pergunte que eu respondo! XD



FLWS!


Última edição por Alex FC em Seg 09 Fev 2015, 20:20, editado 15 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 02 - Colisões retangulares

Mensagem por SIGILOSO em Ter 11 Ago 2009, 18:49

parabéns cara,ótimo tuto,vai me ajudar bastante!!
afro

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 02 - Colisões retangulares

Mensagem por Alex FC em Ter 11 Ago 2009, 18:52

@Tópico

Algum administrador mova o tópico para "Tutoriais da equipe GMBR" fazendo um favor, me esqueci que tinha uma área só pra staff.

@SIGILOSO

Obrigado! É isso mesmo que eu quero, que ajude muita gente. XD

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 02 - Colisões retangulares

Mensagem por André Gustavo em Ter 11 Ago 2009, 19:17

muito bom vai ajuda muito Very Happy

André Gustavo

Número de Mensagens : 278
Data de inscrição : 16/06/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: #COL Aula 02 - Colisões retangulares

Mensagem por Ruan em Ter 11 Ago 2009, 22:38

Oo ótimo tuto. nem sabia q dava pra fazer isso...
esperando a segunda parte afro

Ruan

Número de Mensagens : 184
Idade : 23
Data de inscrição : 10/06/2008
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 02 - Colisões retangulares

Mensagem por Naut2006 em Qua 12 Ago 2009, 22:32

Otimo tutorial, assim como os outros.

Uma pergunta: o que significa aquele zero depois de true? Alterar ele muda alguma coisa?

Goodbye Happy

Naut2006

Número de Mensagens : 213
Idade : 20
Data de inscrição : 11/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 02 - Colisões retangulares

Mensagem por Alex FC em Qui 13 Ago 2009, 00:00

Ah é mesmo. Essa parte nem eu sei direito. É algo como checar se esta a coledir com ele mesmo. Mas eu sempre deixo em 0. Se alguém souber explicar por favor poste aqui 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 02 - Colisões retangulares

Mensagem por Naut2006 em Qui 13 Ago 2009, 00:05

Blz então =D

Mais uma pergunta, tem como colocar no lugar do objeto colocar solid, para que ele perceba quando encostou em algo marcado como solido?

Goodbye Happy

Naut2006

Número de Mensagens : 213
Idade : 20
Data de inscrição : 11/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 02 - Colisões retangulares

Mensagem por Alex FC em Qui 13 Ago 2009, 00:25

Para isso existe um código mais simples:
Código:

if not(place_free(x+5,y)){função}///se não estiver livre de colisão com sólidos na direita, função acontece.

Agora nos próximos tutus eu colocarei as colisões mais simples.

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 02 - Colisões retangulares

Mensagem por Pratagy em Dom 16 Ago 2009, 16:19

Fale mestre Alex FC...
po o papo é o seguinte comecei a fazer o tal jogo stealth e talz, dai fiz o seguinte:
Código:
if collision_rectangle(x+31,y+31,x,y+131,pinkchar,brick,true,0)
a ideia foi de que um retangulo com 100 pixels no rosto do inimigo, colidir com o player (pinkchar), com o bloco (brick) impedindo de ser visto e talz, mas ai, deu erro (eu coloquei uma função qualquer, mas o q ele falou que da erro é essa parte, entoa nem postei a função q acontece)...
no que eu errei ai?
outra coisa: como faço para que a cada sprite tenha um retangulo de colisao diferente? por exemplo um cara de frente nao tem o mesmo retangulo de colisao do q um cara de costas...
vlw, espero q tenha dado pra entender...

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 02 - Colisões retangulares

Mensagem por Alex FC em Dom 16 Ago 2009, 16:43

Para começar você colocou dois objetos:

if collision_rectangle(x+31,y+31,x,y+131,pinkchar,brick,true,0)

é só um:

if collision_rectangle(x+31,y+31,x,y+131,pinkchar,true,0)

Assim funciona, mas me explica o que você quer fazer que eu ajudo. vlw?

E pra muda o dependendo da imagem é só fazer isso:

Código:
if sprite_index=spr_direita
{if collision_rectangle(x,y,x+36,y+31,pinkchar,true,0){função}}

if sprite_index=spr_esquerda
{if collision_rectangle(x,y,x-5,y+31,pinkchar,true,0){função}}

Bom se eu entendi direito é assim, caso ele colida para destruir um objeto que é mais de um é outro código. 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 02 - Colisões retangulares

Mensagem por vareta-maker em Qui 27 Ago 2009, 21:29

uma pequena pergunta
eu sei que ja sou veterano nesse site mas eu
sou tão lesado que não consegui faze aquele trem la dos fantasminhas sim eu sei fase o personagens move alias a unicacoisa que sei sei ate gravidade e salto mas só

enfim vcs acham que é aconselhavel que eu comece dessa lição? se não for muita lesalidade da minha parte

vareta-maker

Número de Mensagens : 7
Idade : 21
Data de inscrição : 29/05/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://www.orkut.com/Home.aspx

Voltar ao Topo Ir em baixo

Re: #COL Aula 02 - Colisões retangulares

Mensagem por Alex FC em Qui 27 Ago 2009, 21:53

Recomendo você ver primeiro as aulas do reddragon e do joão neto. Mas se você acha que ja é bom o bastante...

Recomendo você ver a 4ª parte deste tutorial. São as colisões simples, depois você ve esta e as outras duas. 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 02 - Colisões retangulares

Mensagem por Henrique_GJ em Seg 04 Jan 2010, 15:43

mto massa... assim ajuda a fazer jogo de plataforma tipo mário

Henrique_GJ

Número de Mensagens : 1344
Idade : 19
Data de inscrição : 30/12/2009
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://sitedosjogos.forumeiros.com

Voltar ao Topo Ir em baixo

Re: #COL Aula 02 - Colisões retangulares

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

ótimo tutorial ! e bastante funcional ! Smile

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 02 - Colisões retangulares

Mensagem por Alex FC em Seg 22 Out 2012, 21:32

Aula atualizada - 22/10/12:

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

Ps: As próximas aulas serão atualizadas em breve.

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 02 - Colisões retangulares

Mensagem por Conteúdo patrocinado Hoje à(s) 17:14


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