Autor Wątek: Odliczanie czasu po wylogowaniu  (Przeczytany 4073 razy)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Czerwiec 11, 2015, 18:26:15
Witam.

Jestem w trakcie pisania gry przeglądarkowej (HTML + CSS (+ Bootstrap) + PHP + JS).

Doszedłem do funkcji budowy budynków. Oczywiście budynki mają się budować określony czas. Jak zrobić, by ten czas był cały czas odejmowany, nawet po wylogowaniu z gry?

Ja to widzę tak, że w momencie rozpoczęcia budowy zapisuje w bazie danych aktualny czas (tylko jak to zakodować?), a następnie od tego czasu odejmuję aktualny czas i porównuję z wymaganym czasem budowy.

Nie jestem jednak do końca pewny jak to poprawnie zaimplementować.

Proszę o wypowiedź kogoś kto zna się na takim czymś i odpowie na moje pytania. :)

Tymczasem wracam do Google...

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Adam27

  • Użytkownik

# Czerwiec 11, 2015, 18:34:22
Cytuj
Jak zrobić, by ten czas był cały czas odejmowany, nawet po wylogowaniu z gry?

Postawić serwer :)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Czerwiec 11, 2015, 18:42:43
A jakieś tańsze rozwiązanie? :)

Właśnie sobie rozpisuję jakby wyglądał ten "mój" system, czyli

Cytuj
w momencie rozpoczęcia budowy zapisuje w bazie danych aktualny czas (tylko jak to zakodować?), a następnie od tego czasu odejmuję aktualny czas i porównuję z wymaganym czasem budowy.

I nie jestem pewien:

- jak (de)kodować czas,
- jak poprawnie nadpisywać/porównywać czas z bazy danych,
- i jak to wszystko zoptymalizować.

Naprowadzi mnie ktoś na rozwiązanie?

W Google znalazłem kilka ciekawych artykułów o tym, tylko trochę mało szczegółowych w w/w kwestiach. ;)

Offline Adam27

  • Użytkownik

# Czerwiec 11, 2015, 19:33:37
Czas bardzo wygodnie przedstawia się jako liczbę całkowitą (http://pl.wikipedia.org/wiki/Czas_uniksowy), więc nie ma problemu żeby zapisać go w takiej postaci do bazy danych, a potem odczytać i odjąć od aktualnego czasu przy logowaniu. Tylko że na dłuższą metę to po prostu nie będzie dobre rozwiązanie i serwer to najrozsądniejsze wyjście do takiej gry, nawet taki postawiony na Twoim komputerze.

Offline Kos

  • Użytkownik
    • kos.gd

  • +2
# Czerwiec 11, 2015, 19:36:05
Czekaj, masz już serwer i bazę danych, tak? Zapisujesz w bazie obiekt BudynekInProgress (pewnie ta sama klasa co Budynek) i ustawiasz mu parametry:

- datetime kiedy zaczął się budować
- datetime kiedy skończył

No i przy którymś regularnym update stanu gry bierzesz wszystkie budynki które mają czas ukończenia budowy < now() i przestawiasz im tam flagi "ukończony = true" czy co tam masz u siebie.

Daty oczywiście trzymasz i przetwarzasz w UTC, a strefę czasową gracza bierzesz pod uwagę dopiero przy wyświetlaniu (o ile w ogóle jest taka potrzeba: ukończenie budowania w środę o 20:30 vs. za 2 dni i 5 godzin)

--

@up: do trzymania czasu bazy danych mają zwykle dedykowany typ, po co trzymać jako liczba?

Offline Adam27

  • Użytkownik

# Czerwiec 11, 2015, 19:52:25
@up: Z tego co ja zrozumiałem to OP nie ma serwera i chce wszystko zrobić po stronie klienta, a jego bazą danych może być np. plik tekstowy, skoro zadaje pytanie o to jak zakodować datę. Ale być może się mylę :)

Offline 10log

  • Użytkownik

# Czerwiec 11, 2015, 20:12:41
Jestem w trakcie pisania gry przeglądarkowej (HTML + CSS (+ Bootstrap) + PHP + JS).

Skoro pisze w PHP to obstawiam, że ma serwer.

Offline aphity

  • Użytkownik

  • +1
# Czerwiec 11, 2015, 20:17:51
A z tego co ja zrozumiałem, to OP chyba nie wie że może odpalać skrypty nie tylko wtedy gdy ktoś otwiera stronę (wysyła żądanie). Hint: skonfiguruj Cron na Twoim serwerze, aby np. co 10 minut odpalał skrypt PHP, w którym zaktualizujesz sobie wszystko co potrzebujesz.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Czerwiec 11, 2015, 20:27:06
Cytuj
@up: Z tego co ja zrozumiałem to OP nie ma serwera i chce wszystko zrobić po stronie klienta, a jego bazą danych może być np. plik tekstowy, skoro zadaje pytanie o to jak zakodować datę. Ale być może się mylę :)

Ależ oczywiście że mam bazę danych i serwer... a dokładniej hostuję na cba.pl, a tam z tego co wiem nie można odpalać .exe, o ile oto chodzi. Szczerze mówiąc nie wiedziałem, że w bazie danych jest dedykowany typ dla dat. ;)

Cytuj
Czekaj, masz już serwer i bazę danych, tak? Zapisujesz w bazie obiekt BudynekInProgress (pewnie ta sama klasa co Budynek) i ustawiasz mu parametry:

- datetime kiedy zaczął się budować
- datetime kiedy skończył

No i przy którymś regularnym update stanu gry bierzesz wszystkie budynki które mają czas ukończenia budowy < now() i przestawiasz im tam flagi "ukończony = true" czy co tam masz u siebie.

Daty oczywiście trzymasz i przetwarzasz w UTC, a strefę czasową gracza bierzesz pod uwagę dopiero przy wyświetlaniu (o ile w ogóle jest taka potrzeba: ukończenie budowania w środę o 20:30 vs. za 2 dni i 5 godzin)

Dzięki, spróbuję się do tego zastosować. :) Już zabieram się do kodu.

Dziękuję wszystkim za pomoc, pozdrawiam. :)

Offline timus

  • Użytkownik

# Czerwiec 11, 2015, 20:31:24
Najprościej dajesz do bazy czas kiedy skończy się budowa(unixtime) i po każdym ponownym odpaleniu skryptu wyświetlasz różnice pomiędzy czasem obecny a czasem końca budowy lub jeżeli obecny czas > czasu końca budowy to dodajesz do bazy ze budynek zbudowany i go wyświetlasz(czy co tam chcesz zrobić). Dodaj do tego ładny licznik odliczający czas w js i będzie git.