Bug em tower defense

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

Bug em tower defense

Mensagem por Lukbebalduke em Qua 02 Out 2013, 18:36

Eae pessoal, hoje tava fazendo aqui um código para meu jogo de tower defense e montei um script para escolher qual o inimigo a mais tempo vivo dentro do alcance.

Código:
if modo=2{
for(i=1;i<=instance_number(obj_inimi);i+=1){
select=instance_find(obj_inimi,i);
if point_distance(x,y,select.x,select.y)<distancia
{
if ! instance_exists(selfhylander)
select=selfhylander;
if select.tempodevida>selfhylander.tempodevida or ! instance_exists(selfhylander) or point_distance(x,y,selfhylander.x,selfhylander.y)>distancia{select=selfhylander};
};
};
};
Primeiro ele verifica o modo da torre (isso não importa) ali ele faz um loop passando por todos os inimigos, checa se eles estão dentro da área e roda um olho código, que verifica se tem um inimigo a mais tempo vivo, se o tempo de vida do inimigo por qual estou passando tem o tempodevida maior do que o inimigo com maior tempodevida, se o inimigo com mais tempodevida ainda esta vivo e dentro do alcance. As variáveis são:

Torre escreveu:modo - Serve para nada
select - Inimigo por qual o código esta passando
selfhylander - Inimigo com maior tempodevida
tempodevida - Tempo de vida do inimigo
distancia - Alcance
O problema é o seguinte, mesmo o inimigo com maior tempo de vida estando fora do alcance ele ainda é escolhido como o inimigo com maior tempo de vida dentro do alcance. Já tentei de tudo e não funcionou.

Lukbebalduke

Ranking : Nota B
Número de Mensagens : 764
Data de inscrição : 06/07/2011
Notas recebidas : B - B - A - B
Reputação : 30
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 2

Voltar ao Topo Ir em baixo

Re: Bug em tower defense

Mensagem por Alex FC em Qua 02 Out 2013, 21:07

Bom, não consegui entender muito bem seu código. Então tentei me basear no que tu escreveu e refiz tudo:

Código:
//Guarda quem tem o maior tempo de vida. Suponhamos que o primeiro já seja o maior de todos.
var sou_maior;sou_maior = instance_find(obj_inimi,0);

//Se está no modo 2
if (modo == 2)
{
    //Loop para caçar cada "obj_inimi"
    for(i=1; i < instance_number(obj_inimi); i+=1)
    {
        //Guarda ID do objeto
        var _sel;_sel = instance_find(obj_inimi,i);
        
        //Caso este tenha "tempodevida" maior do que o de quem era maior antes
        if (_sel.tempodevida > sou_maior.tempodevida)
        {
            //Define quem é o novo maior "vivedor"
            sou_maior = _sel;
        }
        
        //Se a minha distancia do selecionado for menor que a var "distancia"
        if (point_distance(x,y,_sel.x,_sel.y) < distancia)
        {  
            //Define "selfhylander" como o que tem mais tempo de vida
            selfhylander = sou_maior;
        }
    }
}

/*Obs: Lembre-se de executar esse código somente quando existirem inimigos.
Dessa maneira esse código dá à variável selfhylander o ID do obj_inimi dentro do alcance de distancia com a variável tempodevida maior.

Tente deixar seus códigos mais organizados, tava tudo muito junto e havia bastante redundância em certas partes.

Não sei se vai resolver, mas caso não detalhe um pouco mais tua dúvida. Valeu?

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: Bug em tower defense

Mensagem por Lukbebalduke em Qua 02 Out 2013, 21:54

Sim, mas até ai faz o mesmo do meu código, ele tem o mesmo erro, quando o selfhylander sai do range ele continua tentando atirar nele, ele teria que escolher outro dentro do range, nesse parte que o meu código não funcionava, tentei resolver de forma simples só verificando com um point_distance até o selfhylander, mas por raios de motivo ele não funciona direito.

Lukbebalduke

Ranking : Nota B
Número de Mensagens : 764
Data de inscrição : 06/07/2011
Notas recebidas : B - B - A - B
Reputação : 30
Insignia 1 x 1 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 2

Voltar ao Topo Ir em baixo

Re: Bug em tower defense

Mensagem por PedroX em Qua 02 Out 2013, 23:08

Pinpi, embora seu código esteja muito confuso, tentei o seguinte:
Código:
if (modo == 2)
{
var vitPrio; vitPrio = ds_priority_create();
with(obj_inimi){
  ds_priority_add(vitPrio, id, point_distance(x, y, other.x, other.y));
      }

v = ds_priority_delete_min(vitPrio);

repeat(ds_priority_size(vitPrio))
{
vv = ds_priority_delete_min(vitPrio); //pega o valor e deleta
if (point_distance(vv.x, vv.y, x, y) > permitida)
{break;}
else
{
if (vv.tempo_de_vida > v.tempo_de_vida)
{v = vv;}
}
}
ds_priority_destroy(vitPrio);

// v = instancia mais velha e que está dentro da distância permitida.
}
Engine: http://www.mediafire.com/?3z7p6icfa9b2e28

Obs: o segundo point_distance assegura que se não houver uma instância dentro do raio permitido a mais próxima não seja usada.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Bug em tower defense

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


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