 |
 |
 |
Autor |
Mensagem |
Lemos
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 |
 |
 |
Edirlei
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 |
 |
 |
Lemos
Usuário


Registrado: 14/04/09 Mensagens: 802 Localização: Rio de Janeiro - RJ |
|
|
|
 |  | 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 |
 |
 |
Lemos
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. ;
if IsKeyPress(102) then
TranslateObject('Anelar',-22,0.8,-10. ;
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!!!
se alguém puder testar esse último comando para mim, ficarei grato.
_________________ Lemos
http://alemdanimacao.zip.net/
 |
|
Ter Jul 28, 2009 6:56 pm |
 |
 |
Lemos
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 |
 |
 |
Lemos
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 |
 |
 |
Edirlei
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 |
 |
 |
huntergamer
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 |
 |
 |
|
|
 |
 |
 |
|