|
|
|
Autor |
Mensagem |
Lemos
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...
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...
_________________ Lemos
http://alemdanimacao.zip.net/
|
|
Seg Abr 20, 2009 11:26 pm |
|
|
Edirlei
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:
| | 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 |
|
|
Lemos
Usuário
Registrado: 14/04/09 Mensagens: 802 Localização: Rio de Janeiro - RJ |
|
|
|
Obrigado, Edirlei!
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!
Um abraço!
_________________ Lemos
http://alemdanimacao.zip.net/
|
|
Ter Abr 21, 2009 1:48 pm |
|
|
Edirlei
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 |
|
|
Lemos
Usuário
Registrado: 14/04/09 Mensagens: 802 Localização: Rio de Janeiro - RJ |
|
|
|
| | 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! Estudei bastante o script, é bastante complexo para mim ainda... 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!
_________________ Lemos
http://alemdanimacao.zip.net/
|
|
Qua Abr 22, 2009 12:21 am |
|
|
t7Bruno
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 | | DisablePlayerMove; |
So que para parar um obj tipo um codico que parava eli tipo isso | | 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 |
|
|
Lemos
Usuário
Registrado: 14/04/09 Mensagens: 802 Localização: Rio de Janeiro - RJ |
|
|
|
| | OOi tava aqui criando joguinhos dai precisava de ajuda nisso aqui
o tipo eu queria parar um obj que esta me perseguindo tipo o | | DisablePlayerMove; |
So que para parar um obj tipo um codico que parava eli tipo isso | | 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!
_________________ Lemos
http://alemdanimacao.zip.net/
|
|
Sex Abr 24, 2009 2:50 pm |
|
|
t7Bruno
Novato
Registrado: 10/03/09 Mensagens: 38 Localização: Ourinhos |
|
|
Sex Abr 24, 2009 9:49 pm |
|
|
|
|
|
|
|
|