Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odliczanie czasu
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
JustHuman4
Witam. Pilnie potrzebuję licznik napisany w JS lub AJAX odliczający mi jakiś czas np 8 minut i 15 sekund. Po dojściu do zera zapytanie PHP dodające cyfry do bazy danych.
Mówiąc jaśniej, potrzebuję skrypt na grę, budowanie budynku, po wybudowaniu dodanie punktów.
Bardzo dziękuję za każdy ułamek* kodu
Pozdrawiam

*proszę nie brać tego dosłownie ;P
zdemotywowany
  1. <script type="text/javascript">
  2. var c=0;
  3. var t;
  4. var timer_is_on=0;
  5. d='0:00';
  6.  
  7. function timedCount()
  8. {
  9. document.getElementById('txt').value=d;
  10. c=c+1;
  11. m=Math.round((c/60)-0.5);
  12. s=c%60;
  13. d=m+':'+s;
  14. t=setTimeout("timedCount()",100);
  15. }
  16.  
  17. function doTimer()
  18. {
  19. if (!timer_is_on)
  20. {
  21. timer_is_on=1;
  22. timedCount();
  23. }
  24. }
  25.  
  26. function stopCount()
  27. {
  28. clearTimeout(t);
  29. timer_is_on=0;
  30. }
  31. </head>
  32.  
  33. <input type="button" value="Start count!" onclick="doTimer()" />
  34. <input type="text" id="txt" />
  35. <input type="button" value="Stop count!" onclick="stopCount()" />
  36. </form>
  37. <p>
  38. Click on the "Start count!" button above to start the timer. The input field will count forever, starting at 0. Click on the "Stop count!" button to stop the counting. Click on the "Start count!" button to start the timer again.
  39. </p>
  40. </body>
  41. </html>


Tutaj masz drobną przeróbkę kodu z W3Schools. --> Oryginał
ShadowD
Głupota, głupota - masz wielki błąd zamysłowy, co powiesz na usera który wybuduje budynek i wyłączy przeglądarkę? Wchodząc ponownie ma znów zacząć go budować?

Takie rozwiązanie jest błędne, tworzysz tabelę w bazie "budowane" i gdy ktoś zacznie budować budynek zapisujesz do niej rekord z czasem w jakim budynek zostanie ukończony, cronem sprawdzasz co minutę czy czas aktualny jest równy z tym z bazy i jeśli tak dodajesz punkty. Jeśli chcesz licznik w js - pobierasz z tabeli "budowane" czas zakończenia i odliczasz od aktualnego. Najlepiej zapisywać czas typu time(), do obliczeń separatory - i +, zamiana na datę - date(), drugi argument.

Jeśli chcesz bardziej profesjonalnie, tabela budujemy może mieć rekord "zbudowane", cron odświeża się co 1 min, a budynek może wybudować się w jej połowie więc user może mieć na liczniku 0, a cron odpali się za 30sec, w takim przypadku można ręcznie odświeżyć (po kliku od usera) jeśli czas ==0 dodajesz punkty i w tabele przy wpisie dodajesz zbudowane=1, do tego do crona potrzebujesz jeszcze jednego warunku by budynek nie skoczył o 2lvl do góry sprawdzający właśnie zbudowane=1. Cron może usuwać wpisy, ręczne odświeżanie też może usuwać zamiast dodawać =1.

Opis działania masz, posługiwanie się if, time(), date() i proste polecenia mysql w sieci. ;-)
zdemotywowany
Cytat(ShadowD @ 21.01.2012, 14:44:46 ) *
Głupota, głupota - masz wielki błąd zamysłowy, co powiesz na usera który wybuduje budynek i wyłączy przeglądarkę? Wchodząc ponownie ma znów zacząć go budować?

Takie rozwiązanie jest błędne, tworzysz tabelę w bazie "budowane" i gdy ktoś zacznie budować budynek zapisujesz do niej rekord z czasem w jakim budynek zostanie ukończony, cronem sprawdzasz co minutę czy czas aktualny jest równy z tym z bazy i jeśli tak dodajesz punkty. Jeśli chcesz licznik w js - pobierasz z tabeli "budowane" czas zakończenia i odliczasz od aktualnego. Najlepiej zapisywać czas typu time(), do obliczeń separatory - i +, zamiana na datę - date(), drugi argument.

Jeśli chcesz bardziej profesjonalnie, tabela budujemy może mieć rekord "zbudowane", cron odświeża się co 1 min, a budynek może wybudować się w jej połowie więc user może mieć na liczniku 0, a cron odpali się za 30sec, w takim przypadku można ręcznie odświeżyć (po kliku od usera) jeśli czas ==0 dodajesz punkty i w tabele przy wpisie dodajesz zbudowane=1, do tego do crona potrzebujesz jeszcze jednego warunku by budynek nie skoczył o 2lvl do góry sprawdzający właśnie zbudowane=1. Cron może usuwać wpisy, ręczne odświeżanie też może usuwać zamiast dodawać =1.

Opis działania masz, posługiwanie się if, time(), date() i proste polecenia mysql w sieci. ;-)


Po co tutaj crona wpychać. Można przecież zrobić to jeszcze łatwiej. Otóż tak jak napisałeś robi sobie tą tabelę budowane i przy ładowaniu strony te dane są pobierane, a JS odlicza czas do 0, gdy dojdzie do 0 po prostu odświeża przeglądarkę. Nawet jeżeli użytkownikowi komp zmuli to i tak nie wpłynie to na wynik budowy, bo czas zakończenia jest zapisany, a przy odświeżaniu strony można sprawdzać czy zakończona została budowa użytkownika o tym ID.
IceManSpy
Cytat(zdemotywowany @ 21.01.2012, 15:05:18 ) *
Po co tutaj crona wpychać. Można przecież zrobić to jeszcze łatwiej. Otóż tak jak napisałeś robi sobie tą tabelę budowane i przy ładowaniu strony te dane są pobierane, a JS odlicza czas do 0, gdy dojdzie do 0 po prostu odświeża przeglądarkę. Nawet jeżeli użytkownikowi komp zmuli to i tak nie wpłynie to na wynik budowy, bo czas zakończenia jest zapisany, a przy odświeżaniu strony można sprawdzać czy zakończona została budowa użytkownika o tym ID.

Ale budenk w grach on-line buduje się po to, aby mieć profit np. +10/h surowca. A tak to dostanę +10 dopiero jak się zaloguje.
ShadowD
Dokładnie tak jak pisze @zdemotywowany cron zapewnia dokładność 0-60sec co jest niskim błędem, a przy odświeżeniu ręcznym (rozwiązanie zaawansowane) ograniczamy go do minimum - częstsze odświeżenia są bez sensu, a i cron ich nie obsługuje na normalnych hostingach. Więc Twoja rozwiązanie jest poprawne lecz kompletnie nie efektywne w tym przypadku.
zdemotywowany
Racja, zapomniałem o tym czynniku. Chociaż mimo wszystko elementy jak surowce mogłyby być dodawane na podstawie ostatnich operacji podczas nowej operacji. Oczywiście cron jest tutaj lepszy, ale teoretycznie można by zapisywać ilość surowców po ostatniej akcji, zapisywać godzinę, a w momencie ataku czy ponownego odświeżenia znów wykonać operację dodającą surowce, a następnie wykonać to co się stało. Takie coś zapewniałoby mniejsze zużycie serwera, ale jednocześnie skrypt wykonywałby się trochę dłużej. No i oczywiście użycie tego byłoby zauważalne dopiero przy grze z wieloma graczami, a nie w małej gierce. Po prostu wszystkie akcje byłyby wykonywane w momencie nowej operacji na 'przedmiocie'.
ShadowD
Za dużo wyzwalaczy, a każda dodawana funkcjonalność musiała by mieć ten moduł i na darmo za każdym razem pytać, lepiej wykonać zapytanie "komu dodać punkty" raz na minutę niż co kilka sec * ilość graczy.
mazyl
Witam!

odświerzam temat, ponieważ również jest mi potrzebne coś takiego, tylko ze u mnie byłaby prosta zasada działania.

Dynamiczne odiczanie z np 2h 40min 14sek do 0. i gdy dojdzie do tego 0 i ktos odświeży strone, aby poszło zapytanie do mysql dodający do budynku + 1, nie trzeba u mnie sprawdzania co minute itp ( u mnie za to żadne surowce nic nie przybywa smile.gif )

Czy posiada ktoś cos takiego ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.