Aprimoramento de Script cíclico - como fazer?

 
   3D Game Builder - Índice » Programação
Aprimoramento de Script cíclico - como fazer?
Autor Mensagem
Lemos
Usuário
Usuário


Registrado: 14/04/09
Mensagens: 802
Localização: Rio de Janeiro - RJ

Aprimoramento de Script cíclico - como fazer?
Amigos, sei que a dúvida que vou postar surgiu em função da minha falta de conhecimento em programação, mas ainda não tive tempo sulficinete para estudar, mas estou estudando... Embarassed
Fiz um misto de dois scripts, que seriam o do tutorial de inteligência artificial e o algorítmo de movimentação do prório programa.
Inicialmente, se você aplica o script de inteligência artificial e depois aplica o de movimentação, os scripts ficam independentes e isso não é o que eu quero.
Bom, esse é o script (o Actor01 é o espantalho):


//---Begin Script Builder: Perseguir Jogador---//
if GetObjectDistance('Actor01','Player') < 2 then
begin
if GetObjectAnimation('Actor01') <> '08flip0' then
SetObjectAnimation('Actor01', '08flip0');
PointObjectTo('Actor01', 'Player');
end
else if GetObjectDistance('Actor01','Player')<5 then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 2500, 0, 0);
end
else if GetObjectDistance('Actor01','Player')>5 then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectToPoint('Actor01', 6, GetObjectPositionY('Actor01'), GetObjectPositionZ('Actor01'));
ApplyForce('Actor01', 1500, 0, 0);
end
else
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectToPoint('Actor01', -6, GetObjectPositionY('Actor01'), GetObjectPositionZ('Actor01'));
ApplyForce('Actor01', 1500, 0, 0);
end;
//---End Script Builder---//


Com esse scrit, ao invéz do espantalho ficar parado não canto esperando o ator principal chegar perto, ele fica correndo no eixo X. Se o personagem principal chega perto dele, ele larga a trajetória e começa a persegui-lo. Eu calculei uma força que permite que o ator principal consiga fugir dele, aumentando a distância. Quando a distância é boa, o espantalho se vira sozinho e volta a executar a trajetória inicial, mas sempre que eu chego perto, ele me persegue; até aqui tudo bem, vamos à dúvida: se eu deixo ele correndo sozinho, ele pára não determinado ponto e fica se tremendo todo, não consegue fazer o percurso para trás e no script de movimentação padrão (desde que incrementado as linhas que definem a animação 02run, que é a de correr) ele faz, fica indo e voltando, mas não me persegue.
Com a mistura eu não consegui fazer ele voltar sozinho, ele fica travado, se tremendo, mas consegue me perseguir.
Bom, o objetivo é fazer o seguinte: desenvolver um script cíclico, que o Espantalho corresse até um ponto programado, depois virasse, fosse para outro, uma animação de movimentação padrão, mas que sempre que eu chegasse perto ele largaria tudo para me perseguir. Sempre que eu conseguisse fugir, ele voltaria à sua trajetória normal.
Se vocês puderem me dizer qual o ponto do script eu devo mexer para expandir, eu ficaria grato. Para efeito de estudos, bastaria completar ele com o movimento de retornar ou virar para algum lado (todas as minhas tentatvas estão dando erro de script, nesse aí não tem erro). A partir dessa ajuda, eu faço o desenvolvimento sozinho.
Um abraço e desculpe se eu estiver pedindo muito... Embarassed



_________________
Lemos
http://alemdanimacao.zip.net/
Seg Abr 20, 2009 11:26 pm Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

Tente desta maneira, não testei ele, mas deve funcionar, como não tentei compilar ele pode ser que existam alguns erros de sintaxe:

Código:
if ReadGlobalVarDef('MoveDir', -1) = -1 then
  WriteGlobalVar('MoveDir', 0);

if (Round(GetObjectPositionX('Actor01')) <= -6) then
  WriteGlobalVar('MoveDir', 0)
else if (Round(GetObjectPositionX('Actor01')) >= 6) then
  WriteGlobalVar('MoveDir', 1); 

//---Begin Script Builder: Perseguir Jogador---//
if GetObjectDistance('Actor01','Player') < 2 then
begin
if GetObjectAnimation('Actor01') <> '08flip0' then
SetObjectAnimation('Actor01', '08flip0');
PointObjectTo('Actor01', 'Player');
end
else if GetObjectDistance('Actor01','Player')<5 then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 2500, 0, 0);
end
else if ((GetObjectDistance('Actor01','Player')>5)and(ReadGlobalVar('MoveDir') = 0)) then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectToPoint('Actor01', 6, GetObjectPositionY('Actor01'), GetObjectPositionZ('Actor01'));
ApplyForce('Actor01', 1500, 0, 0);
end
else if ((GetObjectDistance('Actor01','Player')>5)and(ReadGlobalVar('MoveDir') = 1)) then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectToPoint('Actor01', -6, GetObjectPositionY('Actor01'), GetObjectPositionZ('Actor01'));
ApplyForce('Actor01', 1500, 0, 0);
end;
//---End Script Builder---//

Ter Abr 21, 2009 12:53 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


Registrado: 14/04/09
Mensagens: 802
Localização: Rio de Janeiro - RJ

Obrigado, Edirlei! Very Happy
Na hora de salvar o Scrpt, ele achou um erro de sintaxe na linha 1, coluna 37, acho que foram os dois sinais de ==. Corrigi. Depois ele acusou erro na linha 23, coluna 81 (mesmo erro), também na linha 30, coluna 81. Aí ele aceitou!
Corrigidos esses erros, o script funcionou perfeitamente, o espantalho corre de um lado para o outro, mas se eu chego perto, ele me persegue!
Agora vou estudar as varições possíveis! Very Happy

Um abraço!

_________________
Lemos
http://alemdanimacao.zip.net/
Ter Abr 21, 2009 1:48 pm Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

Não havia percebido isso, to mais acostumado a programar em outras linguagens onde o igual é representado por ==... rss

Editei o post anterior e corrigi os erros.
Ter Abr 21, 2009 2:14 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


Registrado: 14/04/09
Mensagens: 802
Localização: Rio de Janeiro - RJ

Edirlei escreveu:
Não havia percebido isso, to mais acostumado a programar em outras linguagens onde o igual é representado por ==... rss

Editei o post anterior e corrigi os erros.


Viu, quem manda ser "poliglota" em programação, rsrsrs! Very Happy Estudei bastante o script, é bastante complexo para mim ainda... Embarassed Bom, eu testei vários algorítmos e fiquei estudando o seu script e o original de inteligência artificial (o do tutorial), tentando encontrar meios de fazer algo dentro do pouco que aprendi. Então, partindo do zero, montei esse script todo no bloco de notas e depois apliquei no personagem:

Begin Script Builder: Caminhar para a árvore e Perseguir Jogador---//
if (GetObjectDistance('Actor01','Player') > 5) and (GetObjectDistance('Actor01','Arvore') > 2) then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectTo('Actor01', 'Arvore');
ApplyForce('Actor01', 2000, 0, 0);
end
else if (GetObjectDistance('Actor01','Player') < 2) and (GetObjectDistance('Actor01','Arvore') > 2) then
begin
if GetObjectAnimation('Actor01') <> '08flip0' then
SetObjectAnimation('Actor01', '08flip0');
PointObjectTo('Actor01', 'Player');
end
else if (GetObjectDistance('Actor01','Player') <= 5) and (GetObjectDistance('Actor01','Arvore') > 2) then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 2000, 0, 0);
end
else if (GetObjectDistance('Actor01','Player') > 5) and (GetObjectDistance('Actor01','Arvore') <= 2) then
begin
if GetObjectAnimation('Actor01') <> '04pain10' then
SetObjectAnimation('Actor01', '04pain10');
PointObjectTo('Actor01', 'Arvore');
end
else if (GetObjectDistance('Actor01','Player') <= 5) and (GetObjectDistance('Actor01','Arvore') <= 2) then
begin
if GetObjectAnimation('Actor01') <> '02run0' then
SetObjectAnimation('Actor01', '02run0');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 2000, 0, 0);
end
else if GetObjectAnimation('Actor01')<>'01stand0' then
SetObjectAnimation('Actor01', '01stand0');
//---End Script Builder---//



Fiquei pensando: o script que você desenvolveu a partir do meu "tosco" limitou o personagem a correr para lá e para cá no eixo X. Minha idéia era fazer ele fazer um passeio mais complexo, mas os códigos ainda estão meio gregos para mim, então, com a sua dica e o pouco que aprendi até agora, imaginei o seguinte: se o personagem fosse direcionado para um ponto, ele poderia usar isso como ponto de referência para a caminhada. Então usei a árvore como ponto e enchi de obstáculos. O personagem desviou de todos e a única coisa que faz ele desistir do seu objetoivo é a minha aproximação. Se eu chego perto o suficiente, ele me persegue e se me alcança, levanta os braços. Se eu me afasto, ele volta a correr para a árvore. Se ele alcança a árvore, pára e executa uma outra animação. Se eu me aproximo dele, ele volta a me perseguir.
Estou começando a entender o mecanismo dos códigos. Teve um momento que ele não executou uma animação que eu queria e entendi que duas linhas estavam em conflito, mas ao invéz de dar erro, ele executava a que vinha primeiro! Então troquei a ordem dos comando e funcionou!
Já dá para começar a planejar o jogo que tenho em mente!

Um abraço, e mais uma vez, obrigado! Very Happy



_________________
Lemos
http://alemdanimacao.zip.net/
Qua Abr 22, 2009 12:21 am Exibir perfil de usuários
t7Bruno
Novato
Novato


Registrado: 10/03/09
Mensagens: 38
Localização: Ourinhos

OOi tava aqui criando joguinhos dai precisava de ajuda nisso aqui
o tipo eu queria parar um obj que esta me perseguindo tipo o
Código:
 DisablePlayerMove;

So que para parar um obj tipo um codico que parava eli tipo isso
Código:
DisableobjMove('teste');

mais o menos isso eu procurei no F1 mais nao achei vocês deve saber hehe
vocês espertos xD
mals pelos erros
ou desculpa nao queria criar um novo topic entao postei aqui se nao se enportar


Sex Abr 24, 2009 2:34 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


Registrado: 14/04/09
Mensagens: 802
Localização: Rio de Janeiro - RJ

t7Bruno escreveu:
OOi tava aqui criando joguinhos dai precisava de ajuda nisso aqui
o tipo eu queria parar um obj que esta me perseguindo tipo o
Código:
 DisablePlayerMove;

So que para parar um obj tipo um codico que parava eli tipo isso
Código:
DisableobjMove('teste');

mais o menos isso eu procurei no F1 mais nao achei vocês deve saber hehe
vocês espertos xD
mals pelos erros
ou desculpa nao queria criar um novo topic entao postei aqui se nao se enportar


Olá, t7Bruno, não sei se entendi bem o que você quer, mas veja essa parte do script:

else if (GetObjectDistance('Actor01','Player') < 2) and (GetObjectDistance('Actor01','Arvore') > 2) then
begin
if GetObjectAnimation('Actor01') <> '08flip0' then
SetObjectAnimation('Actor01', '08flip0');
PointObjectTo('Actor01', 'Player');
end


Como não existe nela o comando ApplyForce, o personagem executa a animação parado; ele vem correndo até que chega a uma distância menor que 2 (< 2) e, chegando neste valor, ele pára e fica fazendo a animação sem parar. Se eu volto a correr, ele deixa de fazer a animação e me persegue, executando a animação run. A diferença entre os comandos está apenas na aplicação ou não de força sobre ele.

Espero ter ajudado! Smile

_________________
Lemos
http://alemdanimacao.zip.net/
Sex Abr 24, 2009 2:50 pm Exibir perfil de usuários
t7Bruno
Novato
Novato


Registrado: 10/03/09
Mensagens: 38
Localização: Ourinhos

DL
Ou bem nao é isso olha to mandando um exemplo para você ver e muito tosco eu sei mais é o meu melhor

http://rapidshare.com/files/225356028/Wold_of_War.rar.html

Lemos obrigado por varias coisas cara xD a usei o seu codico aii mais so para mostra
[/url]
Sex Abr 24, 2009 9:49 pm Exibir perfil de usuários
   3D Game Builder - Índice » Programação
Página 1 de 1