Script que tira da tela cheia com movimentos do mouse - erro

 
   3D Game Builder - Índice » Programação
Script que tira da tela cheia com movimentos do mouse - erro
Autor Mensagem
Lemos
Usuário
Usuário


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

Script q tira da tela cheia com movimentos do mouse - erro!
Os scripts a seguir foram verificados pelo programa e não tem erros:

//---Begin Script Builder: alterar a variável Configurar em função dos movimentos do mouse---//
if (ReadGlobalVar('Pausa') = 0) and (ReadGlobalVar('Configurar') = 0) then
begin
WriteGlobalVar('MouseX', GetWindowMousePositionX );
WriteGlobalVar('Pausa', 1 );
end
else if (ReadGlobalVar('Pausa') = 1) and (ReadGlobalVar('Configurar') = 0) and ((ReadGlobalVar('MouseX') > GetWindowMousePositionX + 10) or (ReadGlobalVar('MouseX') < GetWindowMousePositionX - 10)) then
begin
WriteGlobalVar('Configurar', 1 );
WriteGlobalVar('Pausa', 0 );
end;
//---End Script Builder---//

No evento OnCreate do mapa a variável Pausa está em 0 e Configurar também. Então a variável MouseX é igual ao valor da posição X do mouse. Depois disso, a variável Pausa muda para 1, de modo que a Variável MouseX não possa ser alterada. Depois, se o mouse fizer qque movimento, que deveria ser < que -10 ou maior que +10, a variável Configurar é alterada para 1. O Script a seguir faz a alternancia entre tela cheia ou não. Inicialmente eu configurei para que a variável fosse comparada apenas com um valor diferente da posição do mouse, mas mesmo com o mouse paradinho, a tela aparece cheia e logo em seguida volta à tela normal. Então imaginei que esse lance de +10 e -10 foosse criar um valor de tolerância, mas continua o problema, a tela fica cheia e em alguns segundos volta ao normal.

//---Begin Script Builder: Alternar entre Tela Normal e Tela Cheia ---//
if (ReadGlobalVar('TelaCheia') = 1) and (ReadGlobalVar('Configurar') = 1) then
begin
SetFullscreen(false);
end
else if (ReadGlobalVar('TelaCheia') = 1) and (ReadGlobalVar('Configurar') = 0) then
begin
SetFullscreen(true);
end
else if (ReadGlobalVar('TelaCheia') = 0) and (ReadGlobalVar('Configurar') = 1) then
begin
SetFullscreen(false);
end
else if (ReadGlobalVar('TelaCheia') = 0) and (ReadGlobalVar('Configurar') = 0) then
begin
SetFullscreen(false);
end;
//---End Script Builder---//


A ideia é criar depois um botão que fizesse a variável configurar voltar a 0 após um clique, o que faria a tela ficar cheia de novo, mas não está funcionando, por que??? Confused A tela enche e esvazia com o mouse parado! Pior que eu acho que ninguém ainda testou essas funções...
Testei também ao invéz de criar uma estrutura condicional no 1º script, desmembrar em 2 separados, sem usar o "else", não dá erro, mas o defeito persiste...

Abraço...




_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Fev 13, 2010 1:55 am Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

Não entendi muito bem, mas é algum problema na sua lógica.

Não sei se era exatamente isso que você queria, mas fiz aqui um script para ele entrar em tela cheia ao iniciar o jogo e sair da tela cheia quando o mouse for movido.

OnCreate do mapa:

Código:
WriteGlobalVar('MouseX', 0);
SetFullscreen(true);


OnLoop do mapa:

Código:
if (ReadGlobalVar('MouseX') <> 0) and (GetWindowMousePositionX <> 0) then
begin
  if ((ReadGlobalVar('MouseX') > GetWindowMousePositionX + 10) or (ReadGlobalVar('MouseX') < GetWindowMousePositionX - 10)) then
  begin
    SetFullscreen(false);
  end;
end;

if (ReadGlobalVar('MouseX') = 0) and (GetWindowMousePositionX <> 0) then
begin                                                       
  WriteGlobalVar('MouseX', GetWindowMousePositionX );
end;


Talvez o problema no seu script seja porque quando o programa é aberto por alguns instantes a posição do mouse é 0 porque a tela ainda não foi carregada, mas o script já esta rodando, assim o seu script sempre iniciava como se o mouse estivesse primeiro na posição 0.
Sáb Fev 13, 2010 5:58 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:

Talvez o problema no seu script seja porque quando o programa é aberto por alguns instantes a posição do mouse é 0 porque a tela ainda não foi carregada, mas o script já esta rodando, assim o seu script sempre iniciava como se o mouse estivesse primeiro na posição 0.


Obrigado pela ajuda Edirlei, mas defeito continua, mesmo com esse script... Quando inicia, mesmo com o mouse estático, a tela fica cheia e depois de 1 ou 2 segundos, volta ao normal. Mas isso que você falou, sobre o lance de haver diferença entre o tempo de carregamento e a posição real do mouse pode ajudar.
Vou fazer mais uns testes aqui e dou um retorno.

Abraço.



_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Fev 13, 2010 8:05 pm Exibir perfil de usuários
Edirlei
Administrador
Administrador


Registrado: 15/03/08
Mensagens: 760

Lemos escreveu:
Obrigado pela ajuda Edirlei, mas defeito continua, mesmo com esse script... Quando inicia, mesmo com o mouse estático, a tela fica cheia e depois de 1 ou 2 segundos, volta ao normal.


Aqui funcionou com o script que eu fiz. Tente aumentar o intervalo da sensibilidade que estava em 10.

Ou então segure o mouse para ele não andar sozinho... Laughing Laughing Laughing


Sáb Fev 13, 2010 8: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:

Aqui funcionou com o script que eu fiz. Tente aumentar o intervalo da sensibilidade que estava em 10.

Ou então segure o mouse para ele não andar sozinho... Laughing Laughing Laughing


É curioso; Confused A configuração de tela cheia ou não depende do controle de 2 variáveis, Configurar e TelaCheia. É preciso que as condições sejam atendidas:

ON CREATE

WriteGlobalVar('MouseX', 0);
WriteGlobalVar('Configurar', 0);
//---Begin Script Builder: Alternar entre Tela Normal e Tela Cheia ---//
if (ReadGlobalVar('TelaCheia') = 1) and (ReadGlobalVar('Configurar') = 1) then
begin
SetFullscreen(false);
end
else if (ReadGlobalVar('TelaCheia') = 1) and (ReadGlobalVar('Configurar') = 0) then
begin
SetFullscreen(true);
end
else if (ReadGlobalVar('TelaCheia') = 0) and (ReadGlobalVar('Configurar') = 1) then
begin
SetFullscreen(false);
end
else if (ReadGlobalVar('TelaCheia') = 0) and (ReadGlobalVar('Configurar') = 0) then
begin
SetFullscreen(false);
end;
//---End Script Builder---//


Aí, no MainLoop eu coloco o seu script e funciona perfeitamente... Confused
Antes estava dando erro porque em vez de colocar na 5ª linha do seu script o comando SetFullscreen(false); (conforme você colocou), eu estava colocando WriteGlobalVar('Configurar', 1); e o script anterior (o meu) também estava no mainloop do mapa...
A idéia era mexer o mouse e alterar a variável Configurar de 0 para 1 e sair da tela cheia.
Agora o script de cima está no oncreate e o seu está no mainloop, funcionou, mas a minha idéia é além de sair da tela cheia aparecer um menu de opções com botões, que vão desde encerrar o programa até voltar à tela cheia. Vou testar aqui ainda, mas a idéia é ao clicar na opção "CONTINUAR", volte à tela cheia e só saia se o mouse mexer, é uma ação que pode se repetir várias vezes, não sei se vai funcionar, uma vez que um script está no oncreate e outro no mainloop.
Conforme for eu te falo. Valeu mesmo, e obrigado mais uma vez! Very Happy

_________________
Lemos
http://alemdanimacao.zip.net/
Sáb Fev 13, 2010 9:38 pm Exibir perfil de usuários
Lemos
Usuário
Usuário


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

Bom, em primeiro lugar, valeu pela ajuda Edirlei. Ontem trabalhei até certa hora e a cabeça começou a esquentar e dei um tempo. Hoje, com a mente descansada, retomei o trabalho. Revisei a rotina de funcionamento do programa e lembrei que a tela estar cheia ou não não é o objetivo principal, isso poderia ser configurado por meio de botões, mas o aparecimento ou não desses botões é que são importantes! Resumindo o funcionamento:

1 - a posição do mouse deve ser gravada na variável MouseX e travada.
2 - qualquer mudança no mouse em relação à essa posição deve alterar a variável e provocar o evento (aparecimento de botões - ainda não criado)

3 - ao terminar de mexer nos botões, eles somem e o processo é resetado, de modo que a posição do mouse seja capturada de novo.

Pensei naquele lance que você disse que durante algum tempo da inicialização do mapa, a posição do mouse pode ser confusa, então, como todo o processo normal é controlado por tempo, programei para que as ações só começassem após 5 segundos da iniciação do mapa. Para ver o processo, fiz o label11 exibir a variável pausa que sofre as mudanças durante o processo:

ON CREATE:

WriteGlobalVar('Pausa', 0);
WriteGlobalVar('MouseX', 0);

MAINLOOP

//---Begin Script Builder: Travar a posição do mouse na Variável MouseX após 5 segundos do início do mapa---//
if (ReadGlobalVar('CapFinalSelecionado') = 1) and (ReadGlobalVar('Time') < 245) and (ReadGlobalVar('Pausa') = 0) then
begin
WriteGlobalVar('MouseX', GetWindowMousePositionX );
WriteGlobalVar('Pausa', 1);
end
else if (ReadGlobalVar('CapFinalSelecionado') = 2) and (ReadGlobalVar('Time') < 45) and (ReadGlobalVar('Pausa') = 0) then
begin
WriteGlobalVar('MouseX', GetWindowMousePositionX );
WriteGlobalVar('Pausa', 1);
end;
//---End Script Builder---//
//---Begin Script Builder: Alterar a variável Pausa em função dos movimentos do mouse---//

if (ReadGlobalVar('CapFinalSelecionado') = 1) and (ReadGlobalVar('Time') < 245) and (ReadGlobalVar('Pausa') = 1) and ((GetWindowMousePositionX > ReadGlobalVar('MouseX') + 10) or (GetWindowMousePositionX < ReadGlobalVar('MouseX') - 10)) then
begin
WriteGlobalVar('Pausa', 2);
end
else if (ReadGlobalVar('CapFinalSelecionado') = 2) and (ReadGlobalVar('Time') < 45) and (ReadGlobalVar('Pausa') = 1) and ((GetWindowMousePositionX > ReadGlobalVar('MouseX') + 10) or (GetWindowMousePositionX < ReadGlobalVar('MouseX') - 10)) then
begin
WriteGlobalVar('Pausa', 2);
end;
//---End Script Builder---//
SetLabelText('Label11', IntToStr(ReadGlobalVar('Pausa')));

Quando o mapa inicia, o label11 está em 0. Após 5 segundos ele muda para 1 e fica lá indefinidamente, até que o mouse seja movido; aí a variável muda para 2 e fica assim. Aí, criei um botão que faz a variável mudar para 0 e como o tempo já está abaixo do permitido, a posição do mouse é travada e a variável muda para 1, só mudando novamente para 2 se o mouse se mexer.
Bom, tudo está funcionando bem!

Abraço!

_________________
Lemos
http://alemdanimacao.zip.net/
Dom Fev 14, 2010 2:20 pm Exibir perfil de usuários
   3D Game Builder - Índice » Programação
Página 1 de 1