![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
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! |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
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ć ![]() 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) |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 121 Pomógł: 26 Dołączył: 2.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
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
![]() 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. -------------------- Works for me => u mnie działa - blog o (o)programowaniu i nie tylko
meet.php - darmowe meetupy związane z PHP |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
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
![]() @edit Odradzał bym Ci używanie CRONa do czegokolwiek, zasugeruj się raczej moimi propozycjami ![]() Ten post edytował ikssde 4.05.2009, 17:21:13 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Czyli po prostu radzisz odpalać skrypt staminy wraz z odświeżaniem strony przez użytkownika
![]() ![]() Jeszcze mi został system dla jednostek ale tam będzie drobny szkopuł, z anulowaniem jednostek ![]() ![]() ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
Tak właśnie radzę
![]() |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ok kolejkowanie już mam
![]() ![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 121 Pomógł: 26 Dołączył: 2.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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 ![]() -------------------- Works for me => u mnie działa - blog o (o)programowaniu i nie tylko
meet.php - darmowe meetupy związane z PHP |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam grę MMORPG
![]() 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. Ten post edytował wizard144 5.05.2009, 09:09:58 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
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.. |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 40 Dołączył: 20.08.2008 Ostrzeżenie: (0%) ![]() ![]() |
Co Ci mogę doradzić
![]() |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 138 Pomógł: 3 Dołączył: 4.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Klasę powiadasz. Dla tego piszę w dziale przedszkole
![]() ![]() ![]() Pozdrawiam! |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 07:45 |