[Resolvido] Códigos anulando outro!?

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

[Resolvido] Códigos anulando outro!?

Mensagem por moisesBR em Ter 10 Abr 2012, 23:35

Pretendo, colocar ínumeros comandos para o player, mas reparei que ao inserir comandos, comuns, em execuçao, alguns quase passaram despercebidos! Somente o primeiro comando é reconhecido!?

Geralmente eu estava usando isto:
Código:
if (keyboard_check(vk_right)){hspeed = 5 }
    else{if (keyboard_check(vk_left)){hspeed = -5}
        else{if (keyboard_check(vk_up)){vspeed = -5}
            else{if (keyboard_check(vk_down)){vspeed = 5}
                else{vspeed = 0 hspeed = 0}}}}
Ou isso:
Código:
if (keyboard_check(vk_right)){hspeed = 5 }
if (keyboard_check(vk_left)){hspeed = -5}
if (keyboard_check(vk_up)){vspeed = -5}
if (keyboard_check(vk_down)){vspeed = 5}
mas ao manter a tecla pressionada, outra nao responde:

Estou tentando também, criar uma IA de perseguiçao e fuga, em que desejo que; algumas IAs persiga o player, e ao mesmo tempo, fujam uma das outras, enquanto outras fujam de todas, e ao estar a certa distancia parassem! Consegui isso mas, tremem ao ficar entre outras. (dá para usar algo do tipo "avoid" em gml, para a IA fujir da situaçao? E no caso das perseguidoras, parar de tremer)

o code da IA:
Código:
situacao = "fugir"
begin
if distance_to_object(i)<20 {move_towards_point(i.x,i.y,-3)}
  else
    if distance_to_object(p)<20 {move_towards_point(p.x,p.y,-3)}
        else
          if distance_to_object(i2)<10 {move_towards_point(i2.x,i2.y,-3)}
              else{speed = 0}
end

situacao = "perseguir"
if instance_exists(p) {move_towards_point(p.x,p.y,3)}
if distance_to_object(i)<10 {move_towards_point(i.x,i.y,-3)}
if distance_to_object(p)>300 {speed = 0}
Aí voce diz; O que IA tem a ver com isso?
r:porque o problema está ocorrendo na IA!

O que ocorre?


Última edição por moisesBR em Sex 23 Nov 2012, 22:25, editado 2 vez(es) (Razão : Resolvido!)

moisesBR

Número de Mensagens : 873
Idade : 40
Data de inscrição : 24/10/2009
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

Mensagem por GameMakerTutoriais em Qua 11 Abr 2012, 02:43


moisesBR, a "falha" na resposta das teclas é porque ele executa o código das duas: enquanto uma soma 5, a outra subtrai 5 e no final dá 0 em velocidade. O código é executado na ordem em que você escreve.

Já essa execução só do primeiro código é por causa da quantidade de else's que você usou. O último comando só vai ser executado se todas as condições anteriores tiverem sido "else". Se a primeira condição for atendida, as outras não serão.

Quando você usa "keyboard_check()", ela vai retornar um valor 1 (true) ou 0 (false) dizendo o estado da tecla. Tem um jeito bem prático de fazer essa movimentação usando esse retorno de 0 e 1 e multiplicando pela velocidade:

Código:

hspeed = (keyboard_check(vk_right) - keyboard_check(vk_left)) * 5;
vspeed = (keyboard_check(vk_down) - keyboard_check(vk_up)) * 5;

Com isso o objeto também vai "andar" nas diagonais.

Nessas duas linha abaixo, a sua intenção foi definir um valor pra variável "situacao"? Pelo modo que o código tá montado, a impressão que eu tive foi que o move_towards seria feito de acordo com o valor dela... Nesse caso, teria faltado um "if" e um "{}" pra montar o bloco do código.

Código:
situacao = "fugir"
situacao = "perseguir"

Às vezes é difícil falar o que fazer ou não fazer na IA em código, porque depende de como o jogo foi feito. Eu tentei criar uma solução aqui de acordo com o que eu consegui entender vendo seu código. Veja se ela vai funcionar:



Já essa "tremidinha" da move_towards foi discutida nesse tópico abaixo. Tem a solução que o saim postou lá:

http://gmbr.forumeiros.com/t21809-resolvidoduvida-com-collision_point

Abraços!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

Mensagem por saim em Qua 11 Abr 2012, 08:47

Acho que a tremidinha acontece por causa das distâncias. Num step, o objeto se move pra longe do objeto 'A', em direção ao objeto 'B'. No step seguinte, já tem uma distância suficiente pra ignorar o objeto 'A' e deve, então, fugir do objeto 'B' EM DIREÇÃO AO OBJETO 'A'. Com isso acontecendo 30 vezes por segundo, o objeto pira.
Pra visualizar melhor a situação, experimente desenhar círculos coloridos em volta dos objetos envolvidos. É uma forma de debug pra quando o erro não é em programação, mas em jogabilidade. Essa visualização, pelo menos mental, é importante pra entender o que vou descrever a seguir.

Não sei se existe solução simples pra esse caso. Uma alterntiva seria fazer a velocidade da fuga depender da distância do objeto, quanto mais perto, mais rápido.
Uma elaboração dessa primeira solução seria criar um vetor pra indicar a direção a fugir. Cada objeto, em função da distância, adiciona um vetor (uma grandeza com direção e magnitude, enfim, uma setinha com tamanho variável) e somam-se os vetores pra definir a direção da fuga. Ignora-se o tamanho do vetor resultante e move-se em velocidade constante na direção indicada.
De qualquer forma, não se deve fugir de um OU outro. Deve-se fugir de todo mundo ao mesmo tempo.

Sim, o código vai ficar meio grandinho. Deixa eu ver como eu faria...
Código:
var queroFugir, queroSeguir, i;//é importante que essas variáveis sejam "var"
var nFugir, nSeguir, magnitude, direção; //essas são "var" só pra economizar memória
i = 0;
resultante = 0;
with(cadaUmDosObjetosQueEuQueroFugir){ //podem ser vários "with"
if (distância < umValorPréDefinido){
queroFugir[i] = id;
i += 1;
}}
nFugiir = i; //número de instâncias a fugir
i = 0;
with(cadaUmDosObjetosQueEuQueroSeguir){
if (distância < outroValorPréDefinido){
queroSeguir[i] = id;
i += 1;
}}
nSeguir = i; //número de instâncias a seguir
for(i = 0; i < nFugir; i += 1){
magnitude = umValorPréDefinido - (distância entre os objetos);
direção = direção do objeto pra mim;
resultante += magnitude * direção; //isso é uma gambiarra, explico fora do código
}
for(i = 0; i < nSeguir; i += 1){
magnitude = outroValorPréDefinido - (distância entre os objetos);
direção = direção de eu pro objeto;
resultante += magnitude * direção; //parte da gambiarra acima, mesma explicação
}
resultante /= (nSeguir + nFugir);
direction = resultante;
Bom, se deu pra entender essa bagunça, o que eu fiz foi levar todo mundo em conta e calcular uma direção resultante. A gambiarra que fiquei de explicar foi o seguinte: ao invés de calcular uma resultante em x, outra em y, e somar tudo, achei que multiplicar o vator pela direção e dividir pelo número de vetores pode resultar numa média ponderada. Se falhar, o cálculo das resultantes em (x, y) deve funcionar (a direction deverá ser point_direction(0, 0, resultanteEmX, resultanteEmY))

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

Re: [Resolvido] Códigos anulando outro!?

Mensagem por moisesBR em Qua 11 Abr 2012, 11:11

-consegui fazer a IA seguir e fugir.

Deixa eu tentar explicar melhor:
Quero que algumas (serao várias (mesmo objeto?)) IAs tanto as que seguem ou que fogem, se mantenham a certa distancia tanto do player, como entre si!

Quando eu coloquei a variável situacao = "perseguir", queria apenas como marcador tipo, quando a IA estivesse em tal situaçao, e algo ocorresse; (proximidade, distancia), ela assumiria outra situaçao e vice-versa.

Eu queria que a IA fujona (portugol?):
Se está perto demais, entao sai de perto corre! mas se (esta longe) entao pare, ataque, zombe, faça careta, atire...
Já a IA perseguidora, é exatamente o contrario:
Se esta longe, entao aproxime e pare, ataque, zombe, faça careta, atire...! mas se, está perto demais sai de cima!

Queria tambem entender a diferença de formataçao e os motivos dos erros:
3 exemplos:
formato1:
se algo = isso entao faça isso
se algo = isso entao faça isso
se algo = isso entao faça isso

formato2
começo
se algo = isso entao faça isso
se algo = isso entao faça isso
fim

formato3
começo
se algo = isso entao faça isso
else
se algo = isso entao faça isso
else
se algo = isso entao faça isso
fim
Queria entrar em algum concurso com esta, mas... Quer saber? É esta!
Download:
http://www.4shared.com/rar/qabUyBbI/IA_Seguir_e_fugir_do_player_co.html?

Alguem sabe como colocar download do 4shared aqui sem ir para o Adfly?

Ninja, valeu! Os codes de movimento resolveu! Dá pra acrescentar comandos tipo direcao=1, sprite e etc? O outro já nao entendi muito bem... funcionou, mas apenas para a perseguiçao. Estou estudando o código e tentando entende-lo! Por isso no down acima, coloquei o que eu fiz antes que funcionou, mas com os erros.

moisesBR

Número de Mensagens : 873
Idade : 40
Data de inscrição : 24/10/2009
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

Mensagem por saim em Qua 11 Abr 2012, 12:24

Diferença entre os formatos
1 e 2: Nenhuma
1-2 e 3: Nos primeiros casos, o código verifica cada uma das declarações "if" e, se todas forem verdadeiras, executas todas elas.
Se a execução significa definir o valor de uma variável, essa variável pode ser definida várias vezes
No terceiro caso, o código vai procurando alguma declaração verdadeira e pára assim que encontra ela, executando o que estiver dentro dela.

Por exemplo, se estiver chovendo, você define vspeed como "+5", se estiver ventando, como "-5". Note que os eventos não estão relacionados, pode ocorrer só um, ambos ou nenhum. Agora, vejamos o comportamento dos seus códigos:

Nos primeiros casos:
se chove { vspeed = 5}
se venta { vspeed = -5}
se estiver chovendo e ventando, o valor de vspeed final será -5. Não é porque não está chovendo, é porque o código passa pela chuva, define vspeed como 5, depois olha o vento e muda o valor da variável.

No último caso:
se chove { vspeed = 5}
senão, se venta {vspeed = -5}
Agora, o código faz o seguinte: se esitver chovendo, ele define vspeed pro valor de 5 e fim. Não quer mais saber do "senão". Ele diz "hm, se está chovendo... opa, está chovendo, deixa eu obedecer aqui! Pronto, que mais? Senão... ah, quero nem saber, não é o caso!". Aí, se não estiver chovendo - se não estiver chovendo - o código prossegue e verifica se está ventando e, se estiver, define vspeed como -5.

Nos dois casos, se não estiver chovendo nem ventando, vspeed permanece como estava.

PS: Pra IA, o que você está fazendo é uma versão da máquina de estados finitos. Não é um conceito novo, sugiro dar uma lida a respeito, pode esclarecer um pouco as coisas.

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

Re: [Resolvido] Códigos anulando outro!?

Mensagem por GameMakerTutoriais em Qui 12 Abr 2012, 23:33

Cara, bem pensado! Se um objeto afasta de um e volta em direção ao outro ele vai ficar pulando mesmo... IA é parte mais difícil mas é mais legal de programar também. Essa ideia de calcular um ângulo anternativo pra fuga é excelente!

Tem um esqueminha muito doido de "atração" que também dá pra usar! É quase o mesmo raciocínio que é usado nesse sisteminha de partículas do GM! Você calcula o quanto a velocidade vertical ou horizontal do objeto vai sofrer essa "atração" de acordo com a distância em que ele tá de cada "ponto de atração" (no caso, cada instância)

Daí nem precisa calcular a direção! De acordo com vspeed e hspeed ele já se movimenta na direção certa! Eu vou tentar fazer um exemplo aqui e dou um edit! Valeu!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

Mensagem por moisesBR em Qui 12 Abr 2012, 23:46

Ok. Mas se nao for pedir muito, comente para que eu possa entender! Pode ser? ...
Só assim consigo entender e Aprender!
Nada-com-nada por exemplo:

X=e(a);y+1= 8-8*9//esse codigo é só um exemplo para mostrar o que faz: Nada.

moisesBR

Número de Mensagens : 873
Idade : 40
Data de inscrição : 24/10/2009
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

Mensagem por GameMakerTutoriais em Sex 13 Abr 2012, 01:59

Foi mal cara, eu não comentei nada lá em cima. É mau vício. Sad
Mas no exemplo aqui eu comentei tudo:

http://www.4shared.com/file/i9F6rdrG/IA_ATTRACTOR.html

Ficou bem simplesão pq eu fiz rápido só pra mostrar a minha ideia! O negócio é usar mais recursos pra ficar bem caprichado, com alarm, trigger, timeline, etc, porque nesse projeto aí eu só usei um script.

Valeu!

Talvez eu vá demorar a responder! Depois do dia 16 eu só devo entrar no fórum em julho. Sad Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Resolvido] Códigos anulando outro!?

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


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