Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL][AJAX]Automatyzacja skryptu php
Forum PHP.pl > Forum > Przedszkole
wizard144
Mam pewien problem. Mianowicie tworzę grę (strategię) i jest opcja iż budowa ma trwać jakiś tam czas. Wszystko jest już ustalone etc. Co prawda całkiem zielony z PHP ani SQL nie jestem ale gorzej z AJAX-em i JS... Chcę aby jednostki po czasie który tam minie się wybudowały. Wymyśliłem że można dodać tabelę w bazie danych
ID | UNIT_ID | TIME |

w id no to wiadomo jako PRIMARY, UNIT_ID to ID jednostki z tabeli ze spisem jednostek a TIME to czas realizacji (w ms). Problem polega na tym że jeśli ustawię Cron'a co sekundę aby sprawdzał czy jakaś jednostka już się nie wybudowała to boję się że mi sie baza "przegrzeje". Zbyt dużo połączeń z bazą danych itd, a wiadomo że powinno być ich jak najmniej.

Z drugiej strony wiem że AJAX obsługuje i zapytania SQL itd.. Problem w tym że nie umiem AJAX-a. A JS sie tylko kiedyś bawiłem. Jednym słowem brak podstaw wiem.

Zwracam się do was z prośbą o jakiś pomysł rozwiązania tego problemu, lub o e-booki/DOBRE kursy na temat JS/AJAX/XML. Aktualnie buszuję po forum i po tych kursach które tu są, ale najlepiej jednak było by coś z listingami (jak w e-bookach).

Pozdrawiam!
ikssde
Nie musisz tego sprawdzać nonstop, wystarczy, że sprawdzisz czy jakiś budynek się aktualnie buduje przy odświeżeniu strony, a wtedy porównujesz sobie czas rozpoczęcia z planowanym czasem zakończenia i wiesz czy możesz usunąć go z kolejki budowania. Ajax nie jest tu potrzebny do niczego, ewentualnie możesz sobie zrobić licznik, który Ci odlicza czas pozostały do zakończenia budowy, ale ilość tego czasu pobierasz sobie przy wyświetleniu, a potem tylko odliczasz.
wizard144
ALe przypuśćmy że mam taką sytuację że nikt nie jest online, więc nikt nie odświerza strony. W kolejce budowy budynków jest 2 w tym jeden już dawno skończył się budować...

Hmmm wpadłem na pomysł żeby tabele poprzednią zmienić na taką:

ID | UNIT_ID | END_TIME |

Czyli zamiast ilości czasu, do czas zakończenia budowy by był... tylko że w takim wypadku muszę teraz skrypt zmienić smile.gif Żeby sprawdzał czy w kolejce nie ma już jakiegoś budynku/jednostki i wtedy ew dodawał czas budowy nie do czasu teraźniejszego tylko do czasu kiedy ma skończyć się budowa ostatniego UNITU.

Tylko pojawia sie kolejny problem.

Gracz może sobie wybrać ilość jednostek do budowy np 30 wojowników z krótkim mieczem. Bez sensu jest dodawać ich jako oddzielne jednostki a z kolei powyższy zapis tabeli tu nie będzie pasował raczej... Hmmm... no chyba że zrobić oddzielne tabele dla budynków i dla jednostek czyli.

Budynki:

ID | B_ID | E_TIME

Jednostki

ID | U_ID | START_TIME | END_TIME | TIME | AMOUNT

Gdzie TIME to by był czas wybudowania jednej jednostki...

Czy w dobrym kierunku myślę?

Zastanawiam się jak to działa na silnikach typu Xnova (sam napisałem własny silnik, bo nie lubię /nie chcę kopiować cudzych gier)
singles
Dobra rada: nie zapisuj czasu budowy jednostki, tylko moment, w którym się ma skończyć - prostym timestampem. I niech to będzie czas w sekundach, będzie wygodniej. Poza tym czas budowy jednostki poniżej jednej sekudny, to małe przegięcie smile.gif

Jak już to masz, to co sekundę odpalasz skrypt/funkcję SQL, która pobiera ostatnie powiedzmy 50 rekordow o czasie mniejszym od aktualnego. Kiedy już wykonasz wszyskie operacje związane z przerobieniem zdarzenia (czyli np dodasz jednostkę do armii) ustaw jego czas na NULL bądź usuń - masz pewność że przy następnym wykonaniu nie weźmie tego rekordu pod uwagę.

Możesz wrzucić do Crona, użyć funkcji w SQL (a w niej CURSOR, REPEAT, FETCH itd) albo PHPa.
ikssde
Zapisuj sobie w bazie danych czas zakończenia i jak dany użytkownik odwiedzi stronę to dodatkowo sobie sprawdzaj ile czasu minęło od zakończenia budowy nr 1 i tyle czasu dodajesz do budowy nr 2 smile.gif Musisz sobie po prostu zbudować kolejkę, przemyśl jak to można dobrze zrobić.

@edit

Odradzał bym Ci używanie CRONa do czegokolwiek, zasugeruj się raczej moimi propozycjami smile.gif
wizard144
Ok, przemyślę co napisałeś. Mimo wszystko moja niewiedza na tematy AJAXA i JS jest dobijająca więc jeśli masz jakieś linki do e-booków na ten temat to prosiłbym o podanie.



P.S

+ dla Ciebie ;]

@singles

Cron tutaj to zły pomysł, za dużo połączeń do bazy danych. Już wystarczy że staminę(bo to ma być raczej RPG+RTS ) regeneruje Cronem smile.gif //To też można w AJAX-ie by zrobić...
ikssde
Właśnie z tego powodu odradzam CRONa, pomyśl sobie, że będziesz miał 1000 graczy i 1000 zapytań co sekundę?

Podczas nieobecności użytkownika nic nie musisz robić, bo tego i tak nikt nie obserwuje. Dopiero przy jego zalogowaniu, zmianie strony, aktualizujesz wszystko, a twój problem rozwiązał bym przy pomocy kolejki zdarzeń, tak jak już pisałem.
wizard144
Czyli po prostu radzisz odpalać skrypt staminy wraz z odświeżaniem strony przez użytkownika smile.gif ? i tak samo z tymi budynkami ? w sumie ta kolejka to nie głupi pomysł już opracowałem system dla budynków smile.gif

Jeszcze mi został system dla jednostek ale tam będzie drobny szkopuł, z anulowaniem jednostek smile.gif aczkolwiek już wymyśliłem jak zrobić z setTimeout żeby sie samo odświeżało (załóżmy że ktoś ciągle jest w pliku gdzie pokazuje ile zostało do zakończenia budowy budynku) smile.gif ciekawy ten js jest smile.gif
ikssde
Tak właśnie radzę smile.gif Co do jednostek to pewnie chodzi Ci o zmianę ilości, tutaj też sugerował bym pobrać sobie ilość tych jednostek z bazy i czas tworzenia się jednej, a resztę zrobić w js.
wizard144
Ok kolejkowanie już mam smile.gif tylko muszę dodać jeszcze do tabeli tworzenia budynków poziom budynku... bo można będzie ustawić 2 budynki do budowy max. Czyli jak ktoś ustawi 2 razy Kapitol do budowy to muszą być aktualne poziomy odrazu ... Ten skrypt będzie ciężej napisać niż mi sie wydawało smile.gif
singles
Cytat(wizard144 @ 4.05.2009, 18:24:52 ) *
Cron tutaj to zły pomysł, za dużo połączeń do bazy danych. Już wystarczy że staminę(bo to ma być raczej RPG+RTS ) regeneruje Cronem smile.gif //To też można w AJAX-ie by zrobić...


Zaczałem wymieniać od Crona, bo sam w pierwszym poście o nim wspomniałeś, osobiście użyłbym SQLa albo PHPa - zależy jak masz realizowaną obsługę zdarzeń.

@ikssde, @wizard144

Przeliczanie wszystkiego (czyli kolejka budowy, budowanie budynków, jednostek itd) w momencie odświeżenia strony nie jest dobrym pomysłem. Dlaczego ?
Scenariusz 1: Gracz A atakuje gracza B 100 jednostek (nieistotne jakich). Gracz B ma w momencie zlecenia ataku 20 jednostek(nieistorne jakich, dla uproszczenia niech będą te same co atakujący). Z logicznych powodów atak nie dochodzi od razu, tylko aby zachować trochę realizmu armia musi maszerować. Czyli armia gracza A idze do gracza B przez 2h. W momencie kiedy gracz wysłał atak gracz B zleca budowę 200 jednostek, która potrwa 90 minut. Ale po godzinie musi wyjść z psem na spacer czy co tam innego - wraca po 2h(bo to duży pies i 10km potrzebuje:P). I co teraz? Gracz B przegrywa walkę, bo w danym momencie (czyli po zbudowaniu jednostek i równocześnie 30 minut przed dojściem armii gracza A i faktycznym odpaleniu algorytmu bitwy) nie odświeżył strony.
Scenariusz 2: Sytuacja podobna, tylko że gracz B zamiast budowania jednostek buduje sobie jakiś budunek/strukturę obronną która ma ogromny wpływ na wynik walki z racji swoich parametrów - ale gracz B znowu przegra, bo znowu nie odświeżył strony.
Zaznaczam, żę automatyczne odświeżanie strony w przeglądarce nie wchodzi w grę - nie tak się gra w MMO.

Podsumowując - silnik chodzący w czasie rzeczywistym, niekoniecznie co 1s, przy małym nawale zdarzeń do przerobienia może być rzadziej.
W tym momencie jest wskazówka co do kolejki - zapisujesz w liście zdarzeń: "Podnieś budynek X o jeden poziom". Czas pierwszego zdarzenia ustawiasz na X. Czas końca na Y = X + (czas budowy budynku). Czas poczatkowy drugiego zdarzenia związanego z budową drugiego budynku ustawiasz sobie na Y + 1s (dla pewności), czas końca jego budowy analogicznie jak przy pierwszym. I tak w kółko, Tyczy się nie tylko budynków, ale także jednostek czy co tam sobie wymyślisz. Nie musisz dodawać do tabeli tworzenia budynków poziomu budynku. No chyba że mówimy o tabeli "buildings" która trzyma unikalne ID danej struktury - wtedy poziom budynku jak najbardziej.

BTW. Wbrew pozorom, napisanie gry MMO to wcale nie jest taka prosta sprawa jak się większości wydaje smile.gif
wizard144
Mam grę MMORPG smile.gif Na własnym silniku i chcę do niej dorobić RTS ... tzn skleić to w logiczną całość...

Z jednej strony masz rację, chyba nie obejdzie się bez Cron-a ...

A nie wiesz może jak poradzili sobie z tym twórcy Xnova ? Bo zainstalowałem ten silnik i bynajmniej żadnego Crona do niego nie ustawiałem...


Edit:

Tak sobie pomyślałem, że napiszę funkcję tą z kolejkowaniem i dopóki w grze nie będzie większego ruchu będę używał Crona. Później ew przerzucę się na kolejkowanie z odświeżaniem strony.

Btw ->> Zaglądałem do silnika Xnova ale nie umiem sobie odpowiedzieć na to pytanie, poszukam jakichś info na ich forum.
ikssde
Prosta sprawa, musisz zastosować ten sam schemat działania, który już wypracowaliśmy. Przy każdym zdarzeniu dotyczącym użytkownika musisz sprawdzać jego stan, przecież jak wyślesz atak to i tak po dotarciu do celu musisz sprawdzić ile jednostek masz ty ile jednostek ma przeciwnik i wtedy obliczyć kto wygrał. Naprawdę CRON to jedna z najgorszych możliwych opcji, z resztą nie do tego został stworzony.
wizard144
Hmmm pomyślmy tak:

Gracz A wysyła jednostki, w tym samym czasie gracz B buduje budynek. Ktoś wejdzie na stronę.. Hmmm... to kolejkowanie trzeba jakoś dopracować...

pomyślmy tak...

TABLE KOLEJKA

ID | ID_Z| TABLE | TIME

Id, id_zdarzenia, tabela w jakiej to zdarzenie zachodzi, czas wykonania

No i teraz tak, zdarzenia wykonuje według kolejności ID... ale musi sprawdzić czas po załóżmy

1 | 666 | battle | 1233565773
2 | 333 | add_build | 1233565772

To zdarzenie o id 2 musi być wykonane wcześniej... czyli należało by zastosować 2 kryteria ... oj nie wiem, muszę to na spokojnie przemyśleć wszystko... Narazie skończę pisać sam skrypt budowania etc..
ikssde
Co Ci mogę doradzić smile.gif Jeśli masz problem z rozplanowaniem tego wszystkiego, to podziel to sobie na mniejsze części i jakoś wyjdzie, gdybyś miał z czymś problemy to pytaj. Dla tego problemu można opracować bardzo ciekawą klasę
wizard144
Klasę powiadasz. Dla tego piszę w dziale przedszkole smile.gif Wiem jak działa funkcja np, ale nie umiem jej zadeklarować w taki sposób żeby była uniwersalna tzn. No brak wiedzy teoretycznej smile.gif już powoli zaczynam wszystko jarzyć. Dzięki za pomoc . smile.gif

Pozdrawiam!
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.