Onde está o erro nesse Script? Ator corre sem sair do lugar

 
   3D Game Builder - Índice » Programação
Onde está o erro nesse Script? Ator corre sem sair do lugar
Autor Mensagem
Lemos
Usuário
Usuário


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

Onde está o erro nesse Script? Ator corre sem sair do lugar
Amigos

Iniciei os testes com um projeto câmera estática. Selecionei o uso de atores MD2, pque no futuro só poderei trabalhar com esse formato que é o que o Blender exporta, então não usei MD3.
Montei um piso, usando um cubo e diminuí apenas a sua altura, aumentando a escalanos eixos x e z coloquei textura de grama, coloquei a casinha padrão e uma luz mainlight. Escolhi o ator MD2 default ai.md2 (a mulher). Como nome, o Programa escolheu Actor01, não mudei.
Procurei as animações existentes nele e escolhi stand, point e run. Fui no tutorial de criação de inteligência artificial e copiei o script:

if GetObjectDistance('Objeto1','Player') < 1 then
begin
if GetObjectAnimation('Objeto1') <> '08flip0' then
SetObjectAnimation('Objeto1', '08flip0');
PointObjectTo('Objeto1', 'Player');
end
else if GetObjectDistance('Objeto1','Player')<10 then
begin
if GetObjectAnimation('Objeto1') <> '02run0' then
SetObjectAnimation('Objeto1', '02run0');
PointObjectTo('Objeto1', 'Player');
ApplyForce('Objeto1', 3000, 0, 0);
end
else if GetObjectAnimation('Objeto1')<>'01stand0' then
SetObjectAnimation('Objeto1', '01stand0');


Lembre-se que “Objeto1” é o nome do meu Ator MD2, caso o seu possua outro nome, altere o “Objeto1” para o nome do seu Ator MD2, ou então altere o nome do seu objeto no mapa para “Objeto1”.



Esse é o script que alterei para o actor 01 (evento on loop):


if GetObjectDistance('Actor01','Player') < 1 then
begin
if GetObjectAnimation('Actor01') <> 'point' then
SetObjectAnimation('Actor01', 'point');
PointObjectTo('Actor01', 'Player');
end
else if GetObjectDistance('Actor01','Player')<3 then
begin
if GetObjectAnimation('Actor01') <> 'run' then
SetObjectAnimation('Actor01', 'run');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 3000, 0, 0);
end
else if GetObjectAnimation('Actor01')<>'stand' then
SetObjectAnimation('Actor01', 'stand');



Seguindo a orientação, alterei os nomes de Object1 para Actor01. Diminuí a distância de 10 para 3 pque ele não está tão longe do ponto onde o ator principal aparece.
Na verificação de erros, nada foi encontrado. Salvei o script e o mapa e rodei. O ator md2 começa parado, com a animação stand. Quando me aproximo, ela começa a correr, mas fica correndo PARADA no mesmio lugar o tempo todo e quando eu me aproximo mais, ela não executa a ação point escolhida, só fica nas 2 etapas, stand (parada) e run (correndo) quando me aproximo. Mas ele vira na minha direção para qualquer lado em que eu vá, então o comando “PointObjectTo” está funcionando corretamente.
Tentei aumentar a força no Apply force de 3000 para 3500, coloquei também no eixo Z, etc, mas nada muda. Postei aqui o script original, mais próximo do modêlo, para que vocês analizem.
Neste tutorial, a função de cada script não está tão explicada quanto no tutorial do diálogo, então entendi que a primeira sequência de animação (flip - poit) é a animação final, a sequencia do meio é a que ser desempenhada na aproximação (run - run) e a última é o padrão quando nada ocorre (stand - stand).
Peço que me ajudem nisso pque é o ponto de partida para estudos mais avançados e se eu não conseguir passar dessa etapa simples, não poderei fazer nada.
Se precisarem do arquivo, por favor me expliquem se eu devo postar toda a pasta de criação do projeto ou apenas algum arquivo dela. Por enquanto só estou usando os modêlos padrão do programa.

Aguardo a ajuda de vocês.



_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Abr 18, 2009 3:01 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Re: Onde está o erro nesse Script? Ator corre sem sair do lu
Uma observação, que eu acho que outros membros já notaram: não está aparecendo a opção de editar a mensagem postada, apenas de responder "quote", então não podemos corrigir as mensagens postadas.
O comando “PointObjectTo” não é executado o tempo todo, apenas quando eu me aproximo, isto é, se eu mantiver uma boa distância do actor, eu posso ficar até atra´s dele sem que ele me perceba. Quando chego na distância programada, 3, ele se vira para mim, já executando a animação "ru", correndo, acho que isso é normal.

No agurado.

_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Abr 18, 2009 3:08 pm Exibir perfil de usuários
Mililo
Usuário
Usuário


Registrado: 05/12/08
Mensagens: 366
Localização: Santo Antônio de Pádua / RJ

Sei objeto deve ser dinâmico, o ApplyForce não funciona em objetos estáticos.
É só ir na parte de 'Collision' e trocar o 'Type' para 'Dynamic'.

Mais uma coisa, você não precisa ir no tutorial para copiar o script, este script pode ser feito automaticamente pelo Script Builder, é só clicar em 'Script Builder->Inteligência Artificial->Algoritmo de Perseguição' o programa vai te pedir o nome do objeto, nome das animações, a força e vai criar o script sozinho.

Te explicando sobre o script:
Código:
if GetObjectDistance('Objeto1','Player') < 1 then

Se a distância entre eles for menor que 1.
Código:
begin
if GetObjectAnimation('Objeto1') <> '08flip0' then
SetObjectAnimation('Objeto1', '08flip0');

Checa se animação não está sendo executada e executa(se não fosse checado a animação ficaria recomeçando sem parar(travada))
Código:
PointObjectTo('Objeto1', 'Player');
end

Direciona o objeto para o player.
Código:
else if GetObjectDistance('Objeto1','Player')<10 then
begin

Se a distância entre eles for menor que 10(e maior que 1, porque se for menor o outro código será executado pois este código está depois do else)
Código:
if GetObjectAnimation('Objeto1') <> '02run0' then
SetObjectAnimation('Objeto1', '02run0');

Checa e executa a animação de correr.
Código:
PointObjectTo('Objeto1', 'Player');

Aponta o objeto para o player(teve que ser repetido aqui porque os dois códigos são distintos(os if's estão separados um do outro, cada um tem seu begin e seu end)
Código:
ApplyForce('Objeto1', 3000, 0, 0);
end

Aplica força no eixo X, para o objeto se mover(se ele for dinâmico, objetos estáticos só se movem com SetObjectPosition).
Código:
else if GetObjectAnimation('Objeto1')<>'01stand0' then
SetObjectAnimation('Objeto1', '01stand0');

Esse código está no último else, ou seja, será executado se nenhum dos outros dois for, o que significa, se a distância não for menor que 1 nem menor que 10(consequentemente será maior que 10).
Ele muda a animção para stand(parado).

É isso, espero que entenda a explicação.


Sáb Abr 18, 2009 4:24 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Mililo

Muito obrigado por suas explicações! Very Happy Um pouco antes de ter lido a sua mensagem, eu tinha imaginado que o problema seria causado por ese problema nas propriedades, então eu alterei de Static pata Dynamic. Mexi em alguns parâmetros como a distância para executar a 3ª animação, mudei de 1 para 2 e aumentei a distância de início do Script de 3 para 5 e ficou assim:


if GetObjectDistance('Actor01','Player') < 2 then
begin
if GetObjectAnimation('Actor01') <> 'point' then
SetObjectAnimation('Actor01', 'point');
PointObjectTo('Actor01', 'Player');
end
else if GetObjectDistance('Actor01','Player')<5 then
begin
if GetObjectAnimation('Actor01') <> 'run' then
SetObjectAnimation('Actor01', 'run');
PointObjectTo('Actor01', 'Player');
ApplyForce('Actor01', 3000, 0, 0);
end
else if GetObjectAnimation('Actor01')<>'stand' then
SetObjectAnimation('Actor01', 'stand');



Agora o problema: o ator md2 continua correndo sem sair do lugar, mas pelo menos agora, quando chego perto ele executa a 3ª animação, point. Agora executa as 3, stand, run e point, melhor assim, mesmo sem sair do lugar. O parâmetro aplly force, de 3000, eu testei desde 120 até 30000 sem resultado! Para ilustrar isso, postei um vídeo do problema, mostrando as propriedades de ator md2 já como dynamic. Esté nesse link, por favor, dê uma olhada:

http://www.4shared.com/file/100090787/9d7cdf0c/Teste-jogo-01.html

Eu já coloquei skybox, aumentei o piso e coloquei uma árvore (to impressionado com essa facilidade para colocar objetos, skybox, etc...! Shocked )
Qdo você falou do algorítimo de perseguição, eu me lembrei que antes desse script eu já tinha usado e deu o mesmo defeito, de correr sem sair do lugar! Sad
Um coisa: eu ainda testei um ooutro script que substituia o aplly force pelo get object position, o do tutorial nº 11, de criação de eventos, e coloquei o +0.01 no eixo X e depois também no eixo Z; isso funcionou, só que não parava mais e notei que a direção é feita em função dos eixos globais, isto é, a boneca segue na direção predeterminada e não na direção em que está virada, que seria a do ator principal. Parecia um caranguejo, correndo de lado! Mr. Green
Isso me fêz pensar uma coisa: digamos que esse script que postei tivesse funcionad; nesse script de aply force, a força de 3000 está apenas sobre o eixo de x, então, se no momento a boneca estiver virada para o eixo z (ela vira para o lado do ator principal), quando ela começar a se mexer, vai correder de lado como caranguejo! Eu até pensei em esquecer o aplly force (to acostumado a contornar bugs em programas...) e usar algo como o get object position, mas queria que funcionasse na direção do ator principal. Tem algum comando assim?

Aguardando!

_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Abr 18, 2009 5:36 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

To começando a achar que é um bug... E do meu Pc, sei lá. Criei um novo projeto, novo nome, novo cenário. Escolhi o ator md2 cabeça de abóbora e usei o script. Depois toquei os nomes e as animações. Ele começa parado, qdo chego perto corre no mesmo lugar, não se move, mas qdo chego perto ele faz a careta. Também consegue se virar na minha direção. É só o Aplly force que não funciona...

Que tristeza... Sad

_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Abr 18, 2009 6:09 pm Exibir perfil de usuários
Mililo
Usuário
Usuário


Registrado: 05/12/08
Mensagens: 366
Localização: Santo Antônio de Pádua / RJ

Não provavelmente não é bug.
Deve ser porque o collision scale está muito grande e ele está ficando preso no chão, não lembrei que poderia ser isso Laughing

Tenta mover ele um pouco para cima(eixo Y) e veja se ele se move, se der certo diminua o collision scale Y.


Sáb Abr 18, 2009 9:13 pm Exibir perfil de usuários
Mililo
Usuário
Usuário


Registrado: 05/12/08
Mensagens: 366
Localização: Santo Antônio de Pádua / RJ

Ah, quanto aquela sua outra pergunta, o ApplyForce vai fazer ele se mover para frente sim, pois quando você usa o PointObject ele vira e o eixo dele também vira junto(eu acho Smile) o que tenho certeza é que ele vai continuar se movendo para frente independente da direção para onde estiver virado.
Sáb Abr 18, 2009 9:19 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Mililo, tu matou a pau!!! Very Happy Very Happy Very Happy Very Happy Very Happy
Valeu mesmo, diminuí o scale colision e começou a funcionar! E não é só isso, ele vira na minha direção e me persegue! Tive que diminuira a força aplicada para 2500 senão não conseguia ganhar dele na corrida! Agora eu consigo me afastar e ele desliga, fica na dele. Quando me aproximo, ele vem na minha direção, chegando perto ele pára e levanta os braços! Muito maneiro, dá para viajar nas possibilidades!

Mais uma vez, obrigado! Wink

_________________
Lemos
http://alemdanimacao.zip.net/
Dom Abr 19, 2009 12:15 am Exibir perfil de usuários
   3D Game Builder - Índice » Programação
Página 1 de 1