Mover para ponto mais proximo : preferencia

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

Resolvido Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 13:31

Bem em meu jogo a criatura se move para comer a comida(objeto) mais proximo e uso desta forma :

if distance_to_object(obj_lipid or obj_glico or obj_amino)
with instance_nearest(x,y,obj_lipid) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }

with instance_nearest(x,y,obj_glico) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }

with instance_nearest(x,y,obj_amino) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }

todos os 3 objs sao comidas.
entao oq acontece é o seguinte:
a criatura da preferencia ao obj_amino por ele ter sido colocado por ultimo ou seja se tiver um lipidio ou um glico mais proximo dele e um amino mais longe ele vai atras do amino --' entendem?

então como fazer para ele seguir o mais proximo independe de qual seja ?

Obg ai xD

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Carlos L. em Qua 27 Abr 2011, 14:11

Opa beleza tenta fazer algo mais ou menos assim.
Código:
d[1] = distance_to_object(object1);
d[2] = distance_to_object(object2);
d[3] = distance_to_object(object3);
o1xx = object1.x;
o2xx = object2.x;
o3xx = object3.x;
o1yy = object1.y;
o2yy = object2.y;
o3yy = object3.y;

if (d[1]) < d[2] && d[3] then
{
    move_towards_point(o1xx,o1yy,3);
}
if (d[2]) < d[1] && d[3] then
{
    move_towards_point(o2xx,o2yy,3);
}
if (d[3]) < d[1] && d[2] then
{
    move_towards_point(o3xx,o3yy,3);
}
Obs: Não testei esse código. flw

Carlos L.

Ranking : Nota C
Número de Mensagens : 270
Data de inscrição : 26/09/2010
Notas recebidas : C
Reputação : 8
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 14:19

n entendi nada *---*
se podesse explicar e usar os obj que uso ficaria mais claro

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Carlos L. em Qua 27 Abr 2011, 14:48

Opa amigo não tem segredo, presta atenção.
Código:
d[1] = distance_to_object(obj_lipid);
d[2] = distance_to_object(obj_glico);
d[3] = distance_to_object(obj_amino);
o1xx = obj_lipid.x;
o2xx = obj_glico.x;
o3xx = obj_amino.x;
o1yy = obj_lipid.y;
o2yy = obj_glico.y;
o3yy = obj_amino.y;
Nessa Parte eu simplesmente armazenei o valor das funções.
Código:
if (d[1]) < d[2] && d[3] then // se a distancia do obj_lipid for menor que a do obj_glico e obj_amino faça algo.
{
    move_towards_point(o1xx,o1yy,3);
}
if (d[2]) < d[1] && d[3] then
{
    move_towards_point(o2xx,o2yy,3);
}
if (d[3]) < d[1] && d[2] then
{
    move_towards_point(o3xx,o3yy,3);
}
E nessa parte mandei ele ir para o objeto que estiver mais próximo, não tem segredo.

Obs :. Você está fazendo alguma coisa relacionado com biologia certo.
Código:
obj_lipid = Lipidio;
obj_glico = Glicose;
obj_amino = Aminoacido.
flw

Carlos L.

Ranking : Nota C
Número de Mensagens : 270
Data de inscrição : 26/09/2010
Notas recebidas : C
Reputação : 8
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Willy em Qua 27 Abr 2011, 14:56

Deu bastante trabalho, mas consegui o que você quer!
Coloque isso no step do objeto que vai comer:
Código:
lipid=instance_nearest(x,y,obj_lipid)
glico=instance_nearest(x,y,obj_glico)
amino=instance_nearest(x,y,obj_amino)
Aqui sabemos qual “lipid” esta mais perto, qual “glico” esta mais perto e também o “amino” que esta mais perto.

Código:
alvo_1=distance_to_object(lipid)
alvo_2=distance_to_object(glico)
alvo_3=distance_to_object(amino)
Aqui estamos pegando a distancia dos objetos para que possamos saber qual deles está mais perto e assim fazer o comilão encher a pança.

Até agora já sabemos qual são as comidas próximas e a distancia delas do faminto.
Agora, vamos fazer o código saber qual das três refeições está mais próxima:
Código:
mais_perto=min(alvo_1,alvo_2,alvo_3)
Nesse código, usamos a função min para saber qual esta mais próximo, usando como valores a distancia das comidas.

E finalmente, vamos descobrir qual comida a criatura vai seguir:
Código:
if mais_perto=alvo_1{
alvo=lipid
}else if mais_perto=alvo_2{
alvo=glico
}else if mais_perto=alvo_3{
alvo=amino
}
Checamos qual é o valor mais próximo, logo, definimos qual será o nosso “alvo”.

Agora tudo que tem que fazer é criar o código para fazer a criatura faminta ir atrás da comida. Usarei algo simples apenas para testar.
Código:
move_towards_point(alvo.x,alvo.y,3)
Isso faz o objeto seguir o seu alvo, que no caso, é o que estiver mais perto do jogador. Não é necessário declarar nenhuma variável, mas se preferir, use! Use “alvo.x” e “alvo.y” para determinar a direção do objeto.

Espero ter ajudado!
blz

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

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

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 15:09

Kkkkkkkkk' Achei uma forma MTOO!! MAIS FACIL xD

Olha nem precisa destes codigos tudo ai kk'

if distance_to_object(obj_lipid)<200 or
distance_to_object(obj_glico)<200 or
distance_to_object(obj_amino)<200{
if distance_to_object(obj_lipid)and distance_to_object(obj_lipid){with instance_nearest(x,y,obj_lipid) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }}

if distance_to_object(obj_glico)and distance_to_object(obj_glico){with instance_nearest(x,y,obj_glico) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }}

if distance_to_object(obj_amino)and distance_to_object(obj_amino){with instance_nearest(x,y,obj_amino) { other.speed=1;
other.direction=point_direction(other.x,other.y,x,y) }}}


pra mim assim ficou bem mais simple xD

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por vinians em Qua 27 Abr 2011, 15:11

Observei os codigos acima e verifiquei que funcionam. Porém caso haja mais de um destes objetos, você nao pode se referir com o nome do objeto diretamente como obj_glico, assim pra funcionar em qualquer numero de objetos fica assim:
Código:

in = noone; //instancia a procurar
d  = 9999999;  //valor alto de inicializacao
//Verifica qual o objeto mais perto dentre os quais vc precisa
with (all)
{
    if (object_index == obj_lipid or object_index == obj_glico or object_index == obj_amino)
    {
            if (distance_to_point(other.x, other.y) < other.d)
            {
                  other.d = distance_to_point(other.x, other.y);
                  other.in = id;
            }
    } 
}
if (in != noone)
{
  move_towards_point(in.x, in.y, 2); //Move para o objeto caso ele tenha sido encontrado
}
Basicamente seria isso ai!
Flws

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 15:26

Não eu colekei varios objetos e deu tudo certo e não ira haver mais de 3 tipos de comida para esta criatura não

Como não estou conseguindo postar umn novo topico vou perguntar poraqui msm :
Decimais
Olha se eu tiro 0.50 de dano em um bixo e eu ataco de novo e tiro 0.50 de dano o dano total sera de 1.00 mas no GM n aparece 1.00 e sim 1 quero que apareça 1.00 tem como ?

obg xD

mais uma coisa esta msm criatura ela aumenta o nivel de co2 em 0.50% e o obj que define que esta variavel(global.co2) existe não funciona é como se esta criatura aumentasse o nivel de co2 em 0.50% antes do outro obj declarar que ela exista ajuda ai nisso tb xD vo ir tentando aqui
( o erro que ocorre é unknow variable co2 --' )

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por saim em Qua 27 Abr 2011, 16:12

Pra 1.00, acho que você procura pela função "string_format".
Quanto ao co2, se ele é global sem ter sido declarado como globalvar, SEMPRE será necessário usar o "global.", antes.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 16:35

sim eu sempre uso mas msm assim não funciona *---*
como usar string format ?

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por vinians em Qua 27 Abr 2011, 16:46

saim escreveu:Pra 1.00, acho que você procura pela função "string_format".
Quanto ao co2, se ele é global sem ter sido declarado como globalvar, SEMPRE será necessário usar o "global.", antes.
Não necessariamente. Nas versões mais novas do Game Maker, a partir da 7 se não me engano, você pode usar
Código:

globalvar xxxx;
Onde xxx é a variável global, assim não há necessidade de usar global.xxxx, ou seja o GM vai trata-la como global a partir daquela declaração.
@Topico
Use string_format como o nosso amigo saim disse acima. Exemplo:
Código:

draw_text(x, y, string_format(valor, 5, 2)); //mostra com duas casas decimais num total de 5 digitos.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por saim em Qua 27 Abr 2011, 16:52

Ô, vinians, foi o que eu disse. Razz "...se ele é global sem ter sido declarado como globalvar..."
kiklin123, os dois objetos fazem as ações descritas no create event? Se for o caso, pode ser mesmo que um esteja aumentando uma variável que o outro ainda não criou. Se não for, vou te pedir pra mostrar o código de declaração da variável e de aumento, com o evento em que ocorrem.


Última edição por saim em Qua 27 Abr 2011, 16:55, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por Zero. em Qua 27 Abr 2011, 16:53

VLW ! xD
Resolvido tudo ai!

Zero.

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

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

Mensagem por vinians em Qua 27 Abr 2011, 17:01

saim escreveu:Ô, vinians, foi o que eu disse. Razz "...se ele é global sem ter sido declarado como globalvar..."
kiklin123, os dois objetos fazem as ações descritas no create event? Se for o caso, pode ser mesmo que um esteja aumentando uma variável que o outro ainda não criou. Se não for, vou te pedir pra mostrar o código de declaração da variável e de aumento, com o evento em que ocorrem.
Puxa é mesmo amigão! Isso é que dá ler tudo rapido demais Very Happy
@Topico
Como foi resolvido, tópico trancado.


vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Resolvido Re: Mover para ponto mais proximo : preferencia

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


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