Jump to content
Nordi

Espécie de Countdown

Recommended Posts

Nordi

Boa noite a todos os membros do P@P,

É o meu primeiro post, apesar de ser leitor assiduo do fórum só agora perdi o raio da preguiça de me registar. E muito se deve a esta dúvida que tenho e por isso já serviu para alguma coisa ter-la.

Mas indo ao que interessa.

Estou num projecto e preciso do seguinte, um jogador abre uma página "Dar uma tacada" por exemlo, lá dentro tem um form com as várias opções depois de enviar a opção preciso que aquela página só possa ser acedida 1 minuto depois.

Ou seja, depois de dar a tacada o jogador só pode dar outra tacada passados 60 segundos.

Estive a ver por aqui no fórum mas não consegui encontrar nada para aplicar neste caso  :happybday:

Alguma sugestão ?

Boa noite,

Nordi

Share this post


Link to post
Share on other sites
Nordi

  var num = 60;
  var timer;

  function countdown(){
     if(num < 1){
        if(timer)
           clearTimeout(timer);
        document.getElementById('countdown_ele').innerHTML = 'Pronto para um novo crime !';
        setFormDisabed(false);
     }else{
        document.getElementById('countdown_ele').innerHTML = "Tens de esperar " + num + " segundos, antes de fazer um novo crime.";
        num--;
        if(!timer)
           timer = setInterval("countdown()",1000);
     }
  }
  function setFormDisabed( disabled ){
    var form = document.getElementById('CrimesForm');
    for(var n=0;n < form.length;n++){
      if(form[n].tagName == 'INPUT' && (form[n].type == 'button' || form[n].type == 'submit')){
        form[n].disabled = disabled;
      }
    }
  }
  
  setFormDisabed(true);
  countdown();

<?
echo "
<form name=\"CrimesForm\" method=\"POST\" action=\"crimes.php\">
<span id=\"countdown_ele\"></span><br>
<table class=\"crimes\" cellspacing=\"0\">
<tr>
<td class=\"crimetitulo\" colspan=\"3\">Dar uma tacada:</td>
</tr>
<tr>
<td class=\"crime\" width=\"27%\">Dificuldade: x</td>
<td class=\"crime\" width=\"76%\">blabla.</td>
<td class=\"crime\" width=\"7%\"><input type=\"radio\" name=\"crime\" value=\"crime1\" checked ></td>
</tr>
<tr>
<td class=\"crime\">Dificuldade: x</td>
<td class=\"crime\">blabla.</td>
<td class=\"crime\"><input type=\"radio\" name=\"crime\" value=\"crime2\" ></td>
</tr>
<tr>
<td class=\"crime\">Dificuldade: x</td>
<td class=\"crime\">blabla.</td>
<td class=\"crime\"><input type=\"radio\" name=\"crime\" value=\"crime3\" ></td>
</tr>
<tr>
<td class=\"crime\">Dificuldade: x</td>
<td class=\"crime\">blabla.</td>
<td class=\"crime\"><input type=\"radio\" name=\"crime\" value=\"crime4\" ></td>
</tr>
<tr>
<td class=\"crime\">Dificuldade: x</td>
<td class=\"crime\">blabla.</td>
<td class=\"crime\"><input type=\"radio\" name=\"crime\" value=\"crime4\" ></td>
</tr>
</table>
<br>
<input type=\"hidden\" name=\"feito\" value=\"1\">
<input type=\"submit\" id=\"idofmybutton\"  >
</form>";

Estou a tentar com este código, mas não está a resultar. Alguém consegue ajudar ?  🤔

Share this post


Link to post
Share on other sites
bLACKLOTUS90

Isso é uma espécie de crimes do omerta (www.barafranca.com.pt)?

Porque não tentas antes adicionar uma tabela à base de dados que controla esse tipo de coisas? Sempre que ele fizer um crime, fazes update ao respectivo campo (cada registo é para cada user) que controla o tempo desse crime e depois quando ele tentar fazer outro crime, verificas se a data actual é maior que a data do ultimo crime mais um minuto.

Secalhar não é o melhor exemplo, mas digo isto porque já tive ideias de fazer um MMORPG, e foi assim que acabei por fazer essas questões do tempo... Tinha uma espécie de agência de viagens (no omerta por exemplo, a viagem é instantânea, mas no que queria fazer, ia demorar algum tempo conforme as distâncias e tipo de avião) onde compravas um bilhete da cidade x para y. Depois tinha um cronjob a rodar todo o minuto que verificava se nessa hora havia partidas de viagens, e todos os users que iriam começar a viajar, não podiam fazer nada a não ser ver as estastiticas do jogo. É um bocado diferente, mas parte da mesma ideia.

Fica a minha ideia  🤔 

Cumps


# Catholic programmingif(!defined('GOD')) die();

Share this post


Link to post
Share on other sites
brunoais

Peguei no teu código e acrescentei anotações para te ajudar:

  var num = 60;
  var timer;

  function countdown(){
     if(num < 1){
        if(timer)
           clearTimeout(timer); // Não encontro o setTimeout(). Será que querias aplicar ao setInterval()?
        document.getElementById('countdown_ele').innerHTML = 'Pronto para um novo crime !';
        setFormDisabed(false);
     }else{
        document.getElementById('countdown_ele').innerHTML = "Tens de esperar " + num + " segundos, antes de fazer um novo crime.";
        num--;
        if(!timer)
           timer = setInterval("countdown()",1000); // Usar strings no setInterval ou no setTimeout é, geralmente, má ideia. Usa um apontador para uma função.
     }
  }
  function setFormDisabed( disabled ){
    var form = document.getElementById('CrimesForm');
    for(var n=0;n < form.length;n++){
      if(form[n].tagName == 'INPUT' && (form[n].type == 'button' || form[n].type == 'submit')){ // Existe um: getElementsByTagName(). Seria melhor se o usasses no document.getElementById('CrimesForm'). Seria um código melhor e mais rápido. Depois só tinhas q executar a 2ª parte do if.
        form[n].disabled = disabled;
      }
    }
  }
  
  setFormDisabed(true);
  countdown();

<?php
// Isto é um atentado à performance!!! Deixa 'tar q eu corrijo. Aproveito para o tornar legível.
?>

<form name="CrimesForm" method="POST" action="crimes.php">
<span id="countdown_ele"></span><br>
<table class="crimes" cellspacing="0">
	<tr>
		<td class="crimetitulo" colspan="3">Dar uma tacada:</td>
	</tr>
	<tr>
		<td class="crime" width="27%">Dificuldade: x</td><!-- width n existe em HTML4. Ele tem q saír para n ter erros. Confiares no sistema de correção de erros do browser é muito má ideia, cada um faz como lhe apetecer-->
		<td class="crime" width="76%">blabla.</td>
		<td class="crime" width="7%"><input type="radio" name="crime" value="crime1" checked ></td>
	</tr>
	<tr>
		<td class="crime">Dificuldade: x</td>
		<td class="crime">blabla.</td>
		<td class="crime"><input type="radio" name="crime" value="crime2" ></td>
	</tr>
	<tr>
		<td class="crime">Dificuldade: x</td>
		<td class="crime">blabla.</td>
		<td class="crime"><input type="radio" name="crime" value="crime3" ></td>
	</tr>
	<tr>
		<td class="crime">Dificuldade: x</td>
		<td class="crime">blabla.</td>
		<td class="crime"><input type="radio" name="crime" value="crime4" ></td>
	</tr>
	<tr>
		<td class="crime">Dificuldade: x</td>
		<td class="crime">blabla.</td>
		<td class="crime"><input type="radio" name="crime" value="crime4" ></td>
	</tr>
</table>
<br>
<input type="hidden" name="feito" value="1">
<input type="submit" id="idofmybutton"  >
</form>


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Nordi

brunoais, desde já obrigado pela ajuda.

No entanto se o javascript está correcto porque raio não me aparece nada ?  🤔

Share this post


Link to post
Share on other sites
brunoais

Pode ter erro de sintaxe algures escondido.

O código pode estar colocado num local errado.

O código pode estar a correr no head sem esperar que a página acabe de ler...


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Nordi

brunoais, exactamente. Está resolvido. Obrigado.

Só ando às  :wallbash: é que se eu carregar na página crimes.php ele volta o tempo aos 60 segundos iniciais  :down:

Alguma ideia/sugestão ? Se conseguires explicar agradecia.

Share this post


Link to post
Share on other sites
brunoais

Usa o servidor para indicar o tempo q ainda falta. O javascript toma conta da contagem decrescente


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Nordi

brunoais, sem querer abusar podes ser mais especifico ?!  ;)

Estou a apreender e uns exemplos seria óptimo. Se não tiveres tempo agradeço na mesma a ajuda prestada.

Share this post


Link to post
Share on other sites
brunoais

  var num = <?php echo $timeLeft ?>;
  var timer;

  function countdown(){
     if(num < 1){
        if(timer)
           clearTimeout(timer); // Não encontro o setTimeout(). Será que querias aplicar ao setInterval()?
        document.getElementById('countdown_ele').innerHTML = 'Pronto para um novo crime !';
        setFormDisabed(false);
     }else{
        document.getElementById('countdown_ele').innerHTML = "Tens de esperar " + num + " segundos, antes de fazer um novo crime.";
        num--;
        if(!timer)
           timer = setInterval("countdown()",1000); // Usar strings no setInterval ou no setTimeout é, geralmente, má ideia. Usa um apontador para uma função.
     }
  }
  function setFormDisabed( disabled ){
    var form = document.getElementById('CrimesForm');
    for(var n=0;n < form.length;n++){
      if(form[n].tagName == 'INPUT' && (form[n].type == 'button' || form[n].type == 'submit')){ // Existe um: getElementsByTagName(). Seria melhor se o usasses no document.getElementById('CrimesForm'). Seria um código melhor e mais rápido. Depois só tinhas q executar a 2ª parte do if.
        form[n].disabled = disabled;
      }
    }
  }
  
  setFormDisabed(true);
  countdown();

Se tiveres todo o js num ficheiro externo tb se arranja com facilidade usando closures


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
brunoais

Pões tudo dentro de uma função e pões parâmetros de modo a executares o de fora usando dados dados pelo php.

Isto tb é usado para currying. Procura por "javascript currying" no google e deves obter ideias sobre o funcionamento.

O objetivo é poderes ter todo o js num ficheiro à parte e poderes, ao mesmo tempo, usar funções/objetos javascript que usam valores dados pelo servidor num ficheiro à parte.

Nota extra: Eu lembro-me que haskell usa muito mais o currying que o javascript. Podes tb ver como se faz em hasckell para tirar ideias para o javascript.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Nordi

Acabei por não fazer assim.

Registei o tempo do crime + 60 segundos na bd e depois subtrai esse tempo a hora actual.

Mediante o resultado acções diferentes.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.