Script de salvamento de posição do ator MD2 - dúvida

 
   3D Game Builder - Índice » Programação
Script de salvamento de posição do ator MD2 - dúvida
Autor Mensagem
Lemos
Usuário
Usuário


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

Script de salvamento de posição do ator MD2 - dúvida
Amigos, estou tentando solucionar o problema do meu jogo que ficou pesado. Para isso, vou dividir os ambientes em mapas diferentes. O problema é o ator MD2, o robô. Ele tem um script que faz com que ele se movimente pelo cenário de batalha e só muda esse percurso se o player chega perto dele. Então, se por acaso, ele estiver no meio do percurso, e o jogador entrar em uma sala, ocorre a mudança de mapa. Nisso, o script de contagem de tempo permanece, graças ao Edirlei e às variáveis globais, consegui fazer isso bem. Bom, se o Player retorna ao cenário de batalha, o robô volta ao inicio do percurso e não para a posição onde ele se encontrava, sempre reseta e não quero isso.
para fazer os testes estou mexendo em um projeto de teste que já tem vários mapas e está bem levinho.
Pensei em adaptar o script e fiz uma coisa que corrompeu o projeto, não consigo carregar mais ele, fica tudo branco e aparece a seguinte mensagem: Invalid Pointer Operation

Fiz o seguinte: lancei uma variável global no Mainloop do mapa que muda em função da posição do robô em relação a uma árvore (perdi o script pque escrevi direto no 3Dgb) que muda de valor a retornado valores 1, 2, 3, etc..., a medida em que ele se aproxima e exibe isso não label. Bom, se ele está na posição 2 e eu mudo de mapa, neste outro mapa tem outro label com esse script:

SetLabelText('Local', IntToStr(ReadGlobalVar('LocalAtual')));

Com isso, neste segundo mapa, podemos ver que a variável não mudou, permanece em 2. Então imaginei que se eu usasse o comando translate no oncreate do PRIMEIRO mapa, na volta, eu conseguiria recolocar o robô no lugar onde estava, na posição 2. Fiz assim:

if ReadGlobalVar('LocalAtual') = 2 then
begin
TranslateObject('Actor01',-2.0,0.574,-25);
end


Bom, não deu erro no script, eu rodei o jogo, esperei o label mudar para 2 e mudei de mapa, O VALOR 2 FOI MANTIDO, mas quando voltei ao mapa anterior, o primeiro, o robô reiniciou e o label voltou a 1. Fechei o aplicativo e quando fui abrir de novo, corrompeu e apareceu a mensagem: Invalid Pointer Operation
Acho que o fato da variável gerar um efeito e ser ao mesmo tempo uma causa pode ter dado o pau.
Podem me ajudar?



_________________
Lemos
http://alemdanimacao.zip.net/
Ter Jul 28, 2009 1:08 pm Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

Olá,
Deve ser algum outro problema, pois o procedimento é exatamente esse, talvez o local em que você colocou o script ou algum erro na lógica.

As variáveis globais não mudam de valor na mudança de mapa.


Ter Jul 28, 2009 1:26 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:
Olá,
Deve ser algum outro problema, pois o procedimento é exatamente esse, talvez o local em que você colocou o script ou algum erro na lógica.

As variáveis globais não mudam de valor na mudança de mapa.


A variável que muda em relação à posição, fica no Mainloop do mapa 01. Ali eu já coloco o script de posicionamento no oncreate do mapa 1:

if ReadGlobalVar('LocalAtual') = 2 then
begin
TranslateObject('Actor01',-2.0,0.574,-25);
end


No mapa 2 não tem nenhum script para isso, só tem um label mostrando a posição com esse script (os dois labels, um em cada mapa, tem o mesmo nome, Local ):

SetLabelText('Local', IntToStr(ReadGlobalVar('LocalAtual')));

O novo valor não se altera. Teóricamente, qdo voltamos ao mapa 1, o evento oncreate iria ler o valor 2 da variável, que já estava no mapa 2. O problema é que ali tem um conflito que eu estava com medo de acontecer, pque o mapa 1 tende a forçar uma barra pro robô voltar ao início, posição 1, mas o script quer fazer ele colocar no 2, isso é algo cíclico. è como no excel, você cria uma referência circular, um valor depende de outro, mas ele modificao valor anterior...
Tive o cuidado dessa posição 2 realmente ser a posição 2 para não dar conflito, que é onde ele está mais perto da árvore.
Vou tentar de novo.

Abraço

_________________
Lemos
http://alemdanimacao.zip.net/
Ter Jul 28, 2009 1:44 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Tá acontecendo uma coisa estranha. Eu peguei o arquivo de testes e abandonei a idéia de gerar a variável em função da distância, em vez disso, gerei uma variável em função do tempo da contagem regressiva, colocado no mainloop do mapa:

//---Begin Script Builder: cria uma variável que indica a posição em função do tempo decorrido---//
if (ReadGlobalVar('Time') > 163) then
begin
WriteGlobalVar('LocalAtual', 1)
end;

if (ReadGlobalVar('Time') <= 163) then
begin
WriteGlobalVar('LocalAtual', 2)
end;
//---End Script Builder---//


Esse script mostra uma contagem regressiva que começa em 180 e vai até zero. Antes de chegar em 163 (que é o tempo que o ator leva para chegar até um determinado local), a nova variável, LocalAtual, retorna o valor 1 e qdo passa de 163 muda para 2. Coloquei nos dois mapas um label com o nome Local que mostra essa mudança de 1 para 2.

Para mostrar a posição no label dos dois mapas, eu usei esse script no Mainloop do mapa:

//---Begin Script Builder: mostra o local do robo no label---//
SetLabelText('Local', IntToStr(ReadGlobalVar('LocalAtual')));
//---End Script Builder---//


Isso começa no mapa 1, onde coloquei o seguinte script no mapa oncreate:


//---Begin Script Builder: muda o local do robo durante a criação do mapa---//
if ReadGlobalVar('LocalAtual') = 2 then
begin
TranslateObject('Actor01',-0.5,0.574,-26);
end;
//---End Script Builder---//


E ainda testei essa variação do mesmo script:

//---Begin Script Builder: muda o local do robo durante a criação do mapa---//
if ReadGlobalVar('LocalAtual') = 2 then
TranslateObject('Actor01',-0.5,0.574,-26);
//---End Script Builder---//



Ambas são aprovadas pela verificação.

A idéia é quando iniciar no mapa 1, mudar para o mapa 2 e quando voltar para o 1 de novo o robô não voltar ao início, pque a variável de localização teria mudado para 2 e permitiria a execução do script.
Bom, rodei o jogo, não houve problemas. No mapa 1 aparece a mudança de valor de 1 para 2 e em seguida eu mudo de mapa. Lá, o label continua a exibir o valor 2 e então eu retorno para o mapa 1 para ver se ocorre a mudança de lugar do Actor01. O mapa começa, a variável permanece em 2 por causa do tempo, e o robô muda de fato de lugar, mas não é o lugar que eu quero!!! Fica no meio entre a posição inicial normal e e última posição que ele chega no percurso. Coloquei ele no lugar que eu queria e copiei a posição para escrever as coordenadas na função.
Depois de testar várias coordenadas, resolvi fazer um teste simples com essa função; escolhi um objeto qualquer do cenário e escrevi essa função no onloop dele para que fosse movido em função do acionamento de teclas:

if IsKeyPress(100) then
TranslateObject('Anelar',-26,0.8,-10.Cool;
if IsKeyPress(102) then
TranslateObject('Anelar',-22,0.8,-10.Cool;


Testei tanto no on loop dele quanto no main loop do mapa e em ambos deu o mesmo resultado: o objeto ANELAR, que deveria ser movido, SUMIU!!! Shocked Shocked Shocked
se alguém puder testar esse último comando para mim, ficarei grato.

_________________
Lemos
http://alemdanimacao.zip.net/
Ter Jul 28, 2009 6:56 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Esqueci de desabilitar os smilies:


if IsKeyPress(100) then
TranslateObject('Anelar',-26,0.8,-10.8);
if IsKeyPress(102) then
TranslateObject('Anelar',-22,0.8,-10.8);

Abraço



_________________
Lemos
http://alemdanimacao.zip.net/
Ter Jul 28, 2009 7:00 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

O Edirlei resolveu de forma simples, trocar o comando translate por SetObjectPosition...

//---Begin Script Builder: muda o local do robo durante a criação do mapa---//
if ReadGlobalVar('LocalAtual') = 2 then
begin
SetObjectPosition('Actor01',-0.5,0.574,-26);
end;
//---End Script Builder---//


E com as teclas:

if IsKeyPress(100) then
SetObjectPosition('Anelar',-26,0.8,-10.8);
if IsKeyPress(102) then
SetObjectPosition('Anelar',-22,0.8,-10.8);


Não usei esse comando pque imaginei que não ambiente com vários objetos, a mudança não seria permitida, os objetos impediriam a mudança de lugar...
Mais uma vez obrigado.

_________________
Lemos
http://alemdanimacao.zip.net/
Ter Jul 28, 2009 7:30 pm Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

O problema que estava ocorrendo com TranslateObject é que ele não faz exatamente o que você queria, o TranslateObject não translada para a posição passada como parâmetro, ele translada a posição atual + a posição passada como parâmetro. Tanto é que se você colocar em um script OnLoop TranslateObject('Objeto', 0, 0, 1) ele não vai ir para a posição 0, 0, 1, ele vai transladar sempre +1 no eixo Z, como se estivesse andando.

O SetObjectPosition que altera a posição de um objeto.
Ter Jul 28, 2009 9:39 pm Exibir perfil de usuários
huntergamer
Usuário
Usuário


Registrado: 02/05/09
Mensagens: 415

Alguem sabe como criar um botao que pause o jogo?????????????????
e que eu não descobri como fazer, se puderem favor ajudar..
abraços

_________________
Não mais tão novato
Qua Ago 05, 2009 4:46 pm Exibir perfil de usuários
   3D Game Builder - Índice » Programação
Página 1 de 1