Conectar-se
Quem está conectado
35 usuários online :: 4 usuários cadastrados, Nenhum Invisível e 31 Visitantes

gart30, rafaelviodres1, Thiago_o_programador, Willy

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

[Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:40
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:


Última edição por Ninja8086 em Sex 08 Jul 2011, 11:02, editado 2 vez(es)
avatar
Ranking : Nota A
Notas recebidas : B-A-A
Data de inscrição : 13/01/2010
Número de Mensagens : 1087
Insígnias de JAM :

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

Prêmios
   : 2
   : 1
   : 0
Ver perfil do usuáriohttp://www.mathaeuz.deviantart.com

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:43
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).
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:45
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 Smile
avatar
Ranking : Nota A
Notas recebidas : B-A-A
Data de inscrição : 13/01/2010
Número de Mensagens : 1087
Insígnias de JAM :

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

Prêmios
   : 2
   : 1
   : 0
Ver perfil do usuáriohttp://www.mathaeuz.deviantart.com

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:50
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?
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:56
Sei... Então, eu tentei isso, mas nesse caso, não seria o ponto de colisão exato, entende?
avatar
Ranking : Nota A
Notas recebidas : B-A-A
Data de inscrição : 13/01/2010
Número de Mensagens : 1087
Insígnias de JAM :

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

Prêmios
   : 2
   : 1
   : 0
Ver perfil do usuáriohttp://www.mathaeuz.deviantart.com

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 18:59
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.
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:05
É 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 Smile

O jeito vai ser tentar otimizar o código. Muito obrigado! Smile
avatar
Ranking : Nota A
Notas recebidas : B-A-A
Data de inscrição : 13/01/2010
Número de Mensagens : 1087
Insígnias de JAM :

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

Prêmios
   : 2
   : 1
   : 0
Ver perfil do usuáriohttp://www.mathaeuz.deviantart.com

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:06
Concerteza. Você está usando qual dos loops(while,repeat,for)?
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:10
mais ou menos assim:
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
avatar
Ranking : Nota A
Notas recebidas : B-A-A
Data de inscrição : 13/01/2010
Número de Mensagens : 1087
Insígnias de JAM :

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

Prêmios
   : 2
   : 1
   : 0
Ver perfil do usuáriohttp://www.mathaeuz.deviantart.com

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:11
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.
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:13
Valeu! Obrigado pela ajuda! Smile
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:14
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")
}
Tenta isso e vê se dá certo.
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:19

Boa dica!! blz blz blz blz
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!
Ranking : Nota C
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6036
Insígnias de JAM :

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

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 19:51
Cara você pode tentar isso:
Código:

if collision_line(x, y, x2, y2, objeto, 1, 1)
{
distancia=point_distance(x1, y1, objeto.x, objeto.y)
}
O problema seria a origem do sprite.
Se não der certo, vou adicionar um pequeno código.

Até mais!
avatar
Ranking : Nota A
Notas recebidas : A+A
Data de inscrição : 20/03/2010
Número de Mensagens : 1134
Insígnias de JAM :

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

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuáriohttps://www.facebook.com/seito.washiro.7

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 20:04
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));
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 20:25
@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!

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!!!
avatar
Ranking : Nota A
Notas recebidas : A+A
Data de inscrição : 20/03/2010
Número de Mensagens : 1134
Insígnias de JAM :

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

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuáriohttps://www.facebook.com/seito.washiro.7

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 20:32
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));
fazendo assim o desempenho fica maior, pq com a função dentro do bloco for, o gm desenha por exemplo 220 linhas, isso sem duvidas usa muito mais processo.
Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 20:36
Sensacional!! *-*


Última edição por brendan640 em Sab 08 Jun 2013, 20:24, editado 1 vez(es)
avatar
Data de inscrição : 23/09/2008
Número de Mensagens : 169
Insígnias de JAM :

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

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 21:18
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...
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...


Data de inscrição : 29/01/2011
Número de Mensagens : 800
Insígnias de JAM :

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

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: [Resolvido] Ponto de colisão em uma collision_line()

em Qui 07 Jul 2011, 21:55
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
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum