Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> System questów w grze MMO
Mephistofeles
post
Post #1





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Potrzebuję zaprojektować taki system, który umożliwi mi tworzenie questów w grze MMORPG (przez przeglądarkę, na symfony).
Macie jakieś ciekawe pomysły?

Ja myślałem nad rozwiązaniem na bazie eventów, każda akcja w grze (zatopienie statku, przejęcie fortu, zdobycie przedmiotu...) wywołuje zdarzenie, które jest kierowane do systemu. Rejestrowałbym rozpoczęte przez gracza zadania w bazie, a każde takie zadanie podpinało by swoje event listenery jak w symfony. Gdy zdarzenie pasuje quest przechodzi na kolejny etap/kończy się z jakimś bonusem dla gracza. Etap questu też byłby zapisywany do bazy, i w zależności od etapu rejestrowane by były inne listenery.
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Mephistofeles @ 14.11.2010, 20:31:42 ) *
podpinało by swoje event listenery jak w symfony.

To, że event listener (a właściwie Event Dispatcher) jest w Symfony wcale nie znaczy, że ona to wynalazła. Taka architektura jest znana od dawien dawna a dopisywanie "jak w symfony" wprowadza wielu w błąd "przypisywania wynalazku".

Cytat(Mephistofeles @ 14.11.2010, 20:31:42 ) *
Gdy zdarzenie pasuje quest przechodzi na kolejny etap/kończy się z jakimś bonusem dla gracza. Etap questu też byłby zapisywany do bazy, i w zależności od etapu rejestrowane by były inne listenery.

Eventowe podejście jest bardzo dobre. Tak samo jak i pomysł aby zdarzenia podpinać wtedy kiedy quest zostanie rozpoczęty.
Gdybyś tylko rozwinął swoją myśl za pomocą kawałka kodu to moglibyśmy konkretniej porozmawiać.

Ten post edytował wookieb 14.11.2010, 21:31:17
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Wiem, tylko że najbliższa znana mi implementacja w PHP jest właśnie w symfony. Nawiasem mówiąc według dokumentacji ten akurat system zdarzeń jest wzorowany na Cocoa (z MacOSa).

Jutro postaram się coś wytworzyć, dzisiaj już stan umysłu mi nie pozwala (IMG:style_emoticons/default/winksmiley.jpg) .
Go to the top of the page
+Quote Post
mathijas
post
Post #4





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 9.10.2008

Ostrzeżenie: (0%)
-----


Hmmmm zastanawiam się jak by to zrobić stricte obiektowo.

1. Model UserAction mógłby mieć pole $related_quests=array().
2. Podczas wykonania akcji (funkcją UserAction::execute), sprawdzane byłoby, czy istnieje powiązanie między User::$id, a Quest::$id (przy czym Quest::$id pochodzi z UserAction::$related_quests
3. Jeśli znalazły się Questy związane z tą akcją, można utworzyć model UserQuest(Quest::$id), a w nim uruchomić UserQuest::Quest()::executeStage(User::$id, self::$stage+1).

Wszystkie modele i operacje oczywiście musiałyby znaleźć stosowne odzwierciedlenie w bazie danych.

PS. Statyczne odwołania ze względu na pokazanie co gdzie, nie do implementacji :D.

Można by w ten sposób zrezygnować z Eventów i zaimplementować w dowolnym projekcie... Ale to raczej przemyślenia niż propozycja.
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #5





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Przykładowo:
  1. // ładowanie nieukończonych aktywnych zadań
  2. $captain->loadActiveQuests();
  3. // wewnątrz metody następuje pobranie aktywnych questów i dla każdego wywołanie registerEventListeners(), w której podpinane są wszystkie nasłuchiwane zdarzenia
  4.  
  5. // następuje jakaś akcja, powiedzmy kapitan gracza wszedł do portu na wyspie X
  6. $dispatcher->notify(new sfEvent($captain, 'captain.reached_island', array('island_id' => $island->getId())));
  7.  
  8. // w listenerze podpiętym do tego zdarzenia następuje sprawdzenie, czy wyspa zgadza się ze wzorcem:
  9. if ($event['island_id' == 1)
  10. {
  11. $captain = $event->getSubject();
  12. $captain->addGold(1000);
  13. $captain->addExperience(200);
  14.  
  15. $this->setState(PiratesQuest::QUEST_DONE); // oznaczam quest jako wykonany i zapisuję w tabeli z questami stan
  16. }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.09.2025 - 20:26