[PHP] Kolejka budowy w grze

0

Witam ponownie forumowiczów :)
Mam kolejny problem... Piszę silnik gry i potrzebna jest opcja "kolejkowania" tzn.
Dodaję do kolejki budowania budynek X, zanim skończy się jego budowa, chcę dodać do kolejki kolejne dwa budynki- Y i Z. Gdy skończy się budować budynek X, automatycznie zaczyna się budować budynek Y, następnie(gdy skończy się budowa Y) Z.

Jak to zrobić w PHP+MySQL? Miałem coś takiego w myśli...

Gdy włączam budowę X, odpowiednia funkcja odczytuje z bazy danych czy już nie trwa budowa jakiegoś budynku, jeśli trwa, sprawdza które miejsce w kolejce jest wolne i tam upycha ten budynek, jeśli nie- zapisuje w bazie danych pod ID pierwszego budynku w kolejce.

Tylko nie mogę tego zrobić... W bazie zapisuję ID budynku, czas(UNIXowy) kiedy się skończy budowa, oraz aktywność budowy danego ID(1,2 lub 3) :/

Z góry dziękuję za pomoc :)

0

hmmm....tak na szybko, co mi najlatwiejszego przyszlo do glowy.

Robisz tabele mniej wiecej takie pola: id,id_kolejki,budynek,czas

Potem sa powiedzmy 3 budynki
Dom -> id:1, id_kolejki:1, budynek:id budynku, czas:time()+czas budowy
Garaz -> id:2, id_kolejki:1, budynek:id budynku, czas:time()+czas budowy
Ogrodek -> id:3, id_kolejki:1, budynek:id budynku, czas:time()+czas budowy

Powiedzmy ze ktos zaczol budowac garaz wiec bedziemy mieli wpis w bazie:
Garaz -> id:1, id_kolejki:1, budynek:id budynku

Po czym user chce zbudowac dom robisz zapytanie typy:

select min(id_kolejki) as chainBuildings from buildings limit 1

Wtedy znasz id pierwszej kolejki o nr 1
User klika na button ktory pozwala zbudowac Dom wiec za pomoca pierwszego zapytania znasz juz id najblizjesz kolejki wiec robisz zapytanie dodajace do kolejki o nr 1 budynek Dom.
Teraz tak za kazdym razem gdy jakis budynek zostal zbudowany spawdzasz czy w jego kolejce jest jakis nastepny budynek jesli nie usuwasz wszystkie wpisy o ostatnim id kolejki czyli nr 1.

A zeby zoabczyc czy mozna zbudowac nastepny budynek robisz prosty warunek:
Pobierasz czas aktualnie budowanego budynku gdzie jego id mozesz zapisac np w sesji po czym robisz:

if($czas-$czas_budowy > $czas_z_bazy) {

    //budujesz

}

   //nic nie robisz

mam nadzieje ze nie namieszalem na pewno idea nie jest dobra w 100% ale mniej wiecej tak bym to zrobil na pewno po lepszym przmysleniu lepiej by to wygladalo ;]

0

Na świeżo przemyślałem sprawę i zrobiłem to tak:

Każde z trzech miejsc w kolejce ma swój znacznik aktywności (czy aktualnie trwa na nim budowa), pętlą sprawdzam po kolei w którym miejscu kolejki aktywność=0, jeśli znajdzie gdzieś 0 wpisuje tam budowę budynku, jeśli nie znajdzie- wyświetla komunikat o zapełnionej kolejce.
Gdy trwa jedna budowa, to przy dodawaniu kolejnej do kolejki czas ustawiam na time()+czas budowy+czas do konca zbudowania poprzedniego budynku :)
W tle przy każdym przeładowaniu strony odpala się skrypt który sprawdza czy skończyła się któraś budowa (też pętelką), jeśli gdzieś znacznik czasu zakończenia budowy < aktualny czas (czyli budowa się zakończyła) to ustawia aktywność tego slotu kolejki na 0, więc znowu można z niego korzystać :)

Dziękuję za pomoc. Temat do zamknięcia ;]

0

zamiast robic niepotrzebne wedlug mnie petle zrob asynchroniczne zapytania co np 10s albo nawet rzadziej jesli budynki dlugo sie buduja :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1