Entrar
Últimos assuntos
» Retorno da GMBR!!!por theguitarmester Ter 19 Mar 2024, 22:38
» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56
» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49
» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21
» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21
» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39
» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16
» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05
» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55
» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39
» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28
» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01
[Resolvido] Ponto de colisão em uma collision_line()
+3
Markituh
MatheusReis
GameMakerTutoriais
7 participantes
Página 1 de 2
Página 1 de 2 • 1, 2
[Resolvido] Ponto de colisão em uma collision_line()
Beleza pessoa? Então, quebrei a cabeça aqui de todo jeito, tentei várias alternativas e não consegui um jeito eficaz!
Minha dúvida é o seguinte... Quando eu uso a função collision_line() ela testa se há colisão com algum objeto no segmento de dois pontos que fazem a linha, certo? Até aí tudo bem, mas será que tem como pegar o exato ponto de colisão dessa linha? Eu até consegui fazer usando loop e ir conferindo as coordenadas pelo ângulo com lengthdir_x e lengthdir_y... mas dependendo da quantidade de loops fica lento!
Dá uma olhada nessa imagem:
Minha dúvida é o seguinte... Quando eu uso a função collision_line() ela testa se há colisão com algum objeto no segmento de dois pontos que fazem a linha, certo? Até aí tudo bem, mas será que tem como pegar o exato ponto de colisão dessa linha? Eu até consegui fazer usando loop e ir conferindo as coordenadas pelo ângulo com lengthdir_x e lengthdir_y... mas dependendo da quantidade de loops fica lento!
Dá uma olhada nessa imagem:
Última edição por Ninja8086 em Sex 08 Jul 2011, 11:02, editado 2 vez(es)
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Bem, a perfeição custa processamento(por consequência a velocidade), mas basta quebrar a perfeição com intervalos. Ao invés de mover a pixel a pixel o ponto de checagem, mova de 5 em 5 por exemplo(usando uma linha, para cobrir a extensão dos 5 pixels).
Re: [Resolvido] Ponto de colisão em uma collision_line()
Eu também tentei isso, na verdade o problema maior não é o valor do salto, mas a quantidade de loops em um todo, na abertura do ângulo, dá uma olhada na imagem que eu postei que vc vai perceber o que eu digo
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Então, o que eu quiz dizer foi aumentar o salto para reduzir o numero de loops e acelerar o jogo. Ou ainda não entendi o problema?
Re: [Resolvido] Ponto de colisão em uma collision_line()
Sei... Então, eu tentei isso, mas nesse caso, não seria o ponto de colisão exato, entende?
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Entendo, mas ai entra o que eu disse: a precisão custa memória de processamento. Eu ainda acho que vale a pena. Algo com em média 5 pixels de imprecisão não seria tão ruim.
Re: [Resolvido] Ponto de colisão em uma collision_line()
É acho que vou tentar ter que fazer assim mesmo. A menos que apareça alguém com uma solução mirabolante... Bem que poderia ser possível, achava que a própria collision_line funcionava mais ou menos por aí.. mas tudo bem
O jeito vai ser tentar otimizar o código. Muito obrigado!
O jeito vai ser tentar otimizar o código. Muito obrigado!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Concerteza. Você está usando qual dos loops(while,repeat,for)?
Re: [Resolvido] Ponto de colisão em uma collision_line()
mais ou menos assim:
daí quando ele acha o ponto tem um break pra sair do loop
- Código:
for (ponto = 0; ponto <= distancia/salto; ponto += 1)
{
confere = ponto * salto;
if tal tal tal
}
daí quando ele acha o ponto tem um break pra sair do loop
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Hmm...
for para mim já é o limite de aceleração de um loop, então só optimizando o resto mesmo. =/
Bem, boa sorte com seu jogo, e que a força esteja contigo.
for para mim já é o limite de aceleração de um loop, então só optimizando o resto mesmo. =/
Bem, boa sorte com seu jogo, e que a força esteja contigo.
Re: [Resolvido] Ponto de colisão em uma collision_line()
Valeu! Obrigado pela ajuda!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Talvez um loop não seja necessário. O que você pode fazer é um lengthdir que aumente o argumento len a cada Step se não encontrar uma colisão com o objeto em questão.
- Código:
var sight;
if !colision_line(x,y,x+lengthdir_x(sight,direction),y+lengthdir_y(sight,direction),obj_parede,1,1)
{
sight+=1
}
else
{
show_message("Encontrou colisão")
}
Markituh- Games Ranking :
Data de inscrição : 11/10/2009
Reputação : 106
Número de Mensagens : 2184
Prêmios :
x 0 x 1 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Boa dica!!
Vou tentar aqui, já que a collision_line é mais rápida que a instance_position, ou place_meeting!
Valeu Markituh!
---- Edit ----
Sua dica foi ótima, eu não usei exatamente isso mas me levou a mudar o raciocínio para uma coisa: vou basear o loop diminuindo ou aumentando de acordo com a distância. Se eu usar uma linha de 500 pontos e houver colisão eu uso a distance_to_point pra ter uma base, e se for próxima de 500 , não há por que fazer um loop do 0 à 500 e sim de 500 a zero e sair do loop quando achar!
Valeu de novo! Podem trancar o tópico!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Cara você pode tentar isso:
Se não der certo, vou adicionar um pequeno código.
Até mais!
- Código:
if collision_line(x, y, x2, y2, objeto, 1, 1)
{
distancia=point_distance(x1, y1, objeto.x, objeto.y)
}
Se não der certo, vou adicionar um pequeno código.
Até mais!
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: [Resolvido] Ponto de colisão em uma collision_line()
- Código:
direction=point_direction(x,y,mouse_x,mouse_y);
for (i=0;i<400 && !collision_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction),OBJETO,0,0);i+=1;)
draw_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction));
Re: [Resolvido] Ponto de colisão em uma collision_line()
@Pedro Henrique
Então Pedro, o problema é esse mesmo, no caso o ponto de colisão não é o pivô do sprite, mas obrigado por postar!
@Jiraya
Legal esse esquema de condicionar a collision_line dentro do for... nunca tinha tentado isso! Eu entendi seu código, vou dar uma adaptada em todas as dicas, ver o que é possível incorporar aqui e posto pra vocês o resultado.
Muito obrigado!
De antemão, mesmo que não funcione, obrigado aí moçada! Com esse esquema e a ajuda de vocês desenvolvi um raciocínio novo aqui, acho que vai dar certo! Depois eu posto aí pra vcs verem!
Flws!!!
Então Pedro, o problema é esse mesmo, no caso o ponto de colisão não é o pivô do sprite, mas obrigado por postar!
@Jiraya
Legal esse esquema de condicionar a collision_line dentro do for... nunca tinha tentado isso! Eu entendi seu código, vou dar uma adaptada em todas as dicas, ver o que é possível incorporar aqui e posto pra vocês o resultado.
Muito obrigado!
- Código:
direction=point_direction(x,y,mouse_x,mouse_y);
for (i=0;i<400 && !collision_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction),OBJETO,0,0);i+=1;)
draw_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction));
De antemão, mesmo que não funcione, obrigado aí moçada! Com esse esquema e a ajuda de vocês desenvolvi um raciocínio novo aqui, acho que vai dar certo! Depois eu posto aí pra vcs verem!
Flws!!!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
s, ainda da para melhorar.
- Código:
direction=point_direction(x,y,mouse_x,mouse_y);
for (i=0;i<400 && !collision_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction),OBJETO,0,0);i+=1;){/*nenhuma função é executada, apenas a checagem*/};
draw_line(x,y,x+lengthdir_x(i,direction),y+lengthdir_y(i,direction));
Re: [Resolvido] Ponto de colisão em uma collision_line()
Sensacional!! *-*
Última edição por brendan640 em Sáb 08 Jun 2013, 20:24, editado 1 vez(es)
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
O grande problema de um code deste tipo é se a distancia for muito grande vai lerdear tudo...
Assim trago algo muito melhor...
Crie um Script e bote isso... Eu usei esse nome 'collision_line2', ele retorna a distância entre o ponto(x1,x2) até colidir...
Belezinha agora tente isso pra testar...
Achei o efeito tão legal... Agora quero fazer algo com isso...
Té...
PS: Eu usei um repeat de 20 mas acho que pode ser menor...
PS2: Foi feito usando o método da bissecção...
Assim trago algo muito melhor...
Crie um Script e bote isso... Eu usei esse nome 'collision_line2', ele retorna a distância entre o ponto(x1,x2) até colidir...
- Código:
//
// dis = collision_line2(x1,y1,x2,y2,obj,prec,notme)
//
__dir = point_direction(argument0,argument1,argument2,argument3);
__dis = point_distance(argument0,argument1,argument2,argument3);
__dislast = __dis;
repeat(20)
{
__dislast = __dislast/2;
if collision_line(argument0,argument1,argument0+lengthdir_x(__dis,__dir),argument1+lengthdir_y(__dis,__dir),argument4,argument5,argument6)
__dis -= __dislast
else
__dis += __dislast
}
return min(__dis,point_distance(argument0,argument1,argument2,argument3))
Belezinha agora tente isso pra testar...
- Código:
dis = collision_line2(x,y,mouse_x,mouse_y,objeto,0,0)
dir = point_direction(x,y,mouse_x,mouse_y)
draw_line(x,y,x+lengthdir_x(dis,dir),y+lengthdir_y(dis,dir))
Achei o efeito tão legal... Agora quero fazer algo com isso...
Té...
PS: Eu usei um repeat de 20 mas acho que pode ser menor...
PS2: Foi feito usando o método da bissecção...
ricaun- Data de inscrição : 23/09/2008
Reputação : 9
Número de Mensagens : 169
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Resolvido] Ponto de colisão em uma collision_line()
Boa dica ricaum!
Então, eu to usando esse raciocínio também, igual eu comentei com o Markituh... ele tinha dado a dica de incrementar o lenght da collision_line até achar o ponto, dai eu dividi pela metade e comparei como vc fez!
Realmente é um ganho significativo dentro de loops
Então, eu to usando esse raciocínio também, igual eu comentei com o Markituh... ele tinha dado a dica de incrementar o lenght da collision_line até achar o ponto, dai eu dividi pela metade e comparei como vc fez!
Realmente é um ganho significativo dentro de loops
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Página 1 de 2 • 1, 2
Página 1 de 2
Permissões neste sub-fórum
Não podes responder a tópicos
|
|