Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP +MySQL] Czas względny i wykonywanie skryptów.
Forum PHP.pl > Forum > PHP
Ramirez
Od kilku miesięcy "robie" grę internetową, opartą na Smarty, AdoDB i oczywiście PHP. Uporałem się z problemem logowania, tworzenia sesji, wczytywania danych z bazy -> gdze id użytkownika to id sesji. Wszystko działa tak jak powinno. Mam tylko jeden mały problem. Gra jest podobna do słynnej gry ogame, dla niewtajemniczonych powiem, że wszystko określone jest tam za pomocą czasu. W mojej grze chce żeby było tak samo. Zrobiłem funkcje odejmowania gotówki podczas kupowania, tylko nie wiem jak określic czas po jakim dane zlecenie będzie wybudowane. Moja funkcja kupuje od razu budynek a chciałbym zeby budynek "wybudował sie " po jakimś (wczesniej określonym ) czasie. Bardzo proszę o pomoc. Proszę o ewentualne porady utworzenia tabeli w bazie i opisania skryptów. Z góry bardzo, bardzo dziękuje i pozdrawiam winksmiley.jpg

P.S. Nie jestem noobem w PHP, stworzyłem wiele stron. Tylko nie znam się dobrze w funkcji obsługi czasu smile.gif
piczu
to chyba tzreba bylo rozplanowac na poczatku, bo takie cos to bym zrobil w bazie danych jako tabela "budowa w toku" a tam pole z data zakonczenia.
misieq
To jest raczej zagadnienie dla systemu na którym robisz grę (widzę tu linuxowego crona, który biega sprawdzając co się już stało) niż dla php, które przecież wykonuje kod tylko przy wywołaniu strony (no chyba że odpalisz gdzieś w tle skrypcik while (true) ;P)
piczu
a po co sprawdzac, gdy nie ma uzytkownikow na stronie? aktualizacja danych (m.in. "budowli w toku") powinno byc przy wejsciu dowolnego uzytkownika.
misieq
Cytat(piczu @ 10.04.2007, 14:45:55 ) *
a po co sprawdzac, gdy nie ma uzytkownikow na stronie? aktualizacja danych (m.in. "budowli w toku") powinno byc przy wejsciu dowolnego uzytkownika.

A gdy na przykład masz akcję, która powinna się zdażyć niezależnie od tego, czy ktoś jest dostępny czy nie? (chociażby zaatakowanie przeciwnika)
Zresztą w przypadku budowania budynku, idąc Twoim tokiem myślenia to efekty tego będą widoczne dopiero po zalogowaniu a to nie jest chyba dobre rozwiązanie (powinny być widoczne od razu po upłynięciu czasu budowy)
piczu
Cytat(misieq @ 10.04.2007, 15:16:08 ) *
A gdy na przykład masz akcję, która powinna się zdażyć niezależnie od tego, czy ktoś jest dostępny czy nie? (chociażby zaatakowanie przeciwnika)

to tez mozna obejsc wyliczajac wynik walki przed jej rozpoczeciem i zmianie w przypadku zmian zrobionych przez uczestnikow.
Cytat(misieq @ 10.04.2007, 15:16:08 ) *
Zresztą w przypadku budowania budynku, idąc Twoim tokiem myślenia to efekty tego będą widoczne dopiero po zalogowaniu a to nie jest chyba dobre rozwiązanie (powinny być widoczne od razu po upłynięciu czasu budowy)

jezeli chodzi ci o produkcje po stworzeniu budowli mozna ja przeciez wyliczyc dopiero po zalogowaniu.
Dla crona widze dobre rozwiazanie przy okresowej aktualizacji co pewien czas. Jakos ciezko mi wyobrazic sobie ze cron jest wywolywany co 1 sek zeby zaktualizowac wszystkie dane. Ile to byloby zapytan.
Ramirez
Misieq masz rację, wszystko musi być non stop podliczane i sprawdzane za pomocą co minutowego crona. Chodzi mi tylko o skrypcik który porównuje czy czas ukończenia budowy (zapisany w bazie) jest mniejszy lub równy jak czas na serveże. Nie wiem jaki przelicznik czasu zastosowac i jak to do siebie dodawac sadsmiley02.gif Nigdy nie bawiłem się z 'czasem' tongue.gif Według mojego założenia musi to wyglądac tak:
Kod
I step, gracz kupuje infrastrukturę odejmuje sie mu surówka
II step, do tabeli zlecenia dodaje sie data rozpoczęcia i zakończenia budowy (? jaki format daty?)
III step, co minutowy cron sprawdza czy czas zakonczenia jast mniejszy lub równy teraźniejszemu czasowi, jeśli tak, wpisuje dane ze zlecenia do budynków playera (tak jakby potwierdzenie rejestracji tyle, że czasowe :P)

Bardzo proszę piszcie wasze propozycje i pomóżcie mi ze skryptem. Wielkie thx.
piczu
Co minute powiadasz, a co gdy atak bedzie o 10:10:59 a mi ma sie zbudowac tarcza o 10:10:01? A co gdy atak bedzie 10:10:01 a mi ma sie zbudowac tarcza o 10:10:59? Potraktuje te sytuacje tak samo?

Co do przechowania czasu to tylko timestamp i
if($timestamp > time()) zbudowane; // $timestamp znacznik czasu zakonczenia budowy
Kicok
Cytat
Misieq masz rację, wszystko musi być non stop podliczane i sprawdzane za pomocą co minutowego crona.


Nie musi:
Kod
I. Gracz kupuje budynek, np. kopalnię która zwiększy mu wydobycie metalu o 20/h
II. Skrypt odejmuje surowce graczowi (koszty budowy kopalni) i oblicza, że budynek zostanie wybudowany za 3 godziny
III. Graczowi nie chce się czekać 3 godzin, więc wyłącza przeglądarkę i idzie z psem na spacer
IV. Gracz wraca do domu po 4 godzinach (1 godzina po wybudowaniu kopalni) i loguje się ponownie do gry
V. Skrypt sprawdza, czy zostały w danym czasie wybudowane jakieś budowle. Znajduje kopalnię, która została wybudowana godzinę temu. Data zakończenia budowy jest odczytywana z bazy, a rekord jest usuwany (bo kopalnia już została zbudowana)
VI. Skrypt przelicza teraz ilość metalu:
- Po zbudowaniu kopalni graczowi zostało 300 metalu,
- Poprzednia wydajność kopalni to 120/h,
- Po wybudowaniu kopalni 140/h.
- Kopalnia została zbudowana 3h po ostatniej wizycie gracza na stronie
- Od wybudowania kopalni do teraz minęła 1h
Wzór: 300 + (3h * 120) + (1h * 140)


Oczywiście wyzwolenie tej procedury nie może następować jedynie podczas zalogowania się gracza w grze. Trzeba przemyśleć wszystkie przypadki, np:
- atak wroga: Sam atak powinien być wyzwolony na takiej samej zasadzie, jak budowa kopalni, ale gdy gracz który cię zaatakował zaloguje się do gry wcześniej, niż ty wrócisz z psem ze spaceru, to ilość metalu w twoich magazynach trzeba będzie podliczyć
- wróg wysłał sondę szpiegowską: j/w, wrogi gracz loguje się do gry i dostaje raport z sondy, więc aktualna ilość metalu na twojej planecie musi zostać podliczone
- sojusznik przyleciał na twoją planetę i zwiedza twoje magazyny: j/w
- itd.
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-2025 Invision Power Services, Inc.