Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][oop]przechwytywanie zdarzeń
Forum PHP.pl > Forum > PHP
vegelus
Witam serdecznie.
Wciskam sobie od dłuższego czasu klawisze tworząc pewien projekt (znawcy mogli by go nazwać grą planszową) i doszedłem do momentu, w którym gracz może niekoniecznie kliknąć w cztery wyznaczone linki do sterowania pionkiem. Może np. klikając na obrazku postać poprosić serwer o przesłanie dokładnych informacji o postaci. W tej chwili komunikację z serwerem realizuję poprzez url w postaci:
index.php?event=l
index.php?event=p
index.php?event=d
index.php?event=g

Gdzie l,p,d,g to polecenia dla klasy obsługującej planszę o przesunięcie o jedno pole w górę, dół, prawo lub lewo. Po odczytaniu polecenia odświeża się strona z nowym wynikiem poprzez wywołanie new plansza(kierunek). Plansza wyświetlana jest w jednym z divów. Dla pozostałych informacji mam przygotowane inne poletka.

Teraz konkrety. W jaki sposób zdarzeniem index.php?event=z wywołać konstruktor klasy który wyświetli informacje w innym divie przy założeniu że index.php wygląda tak :

  1. <body>
  2. <center>
  3. <div id="top">
  4. <div id="NAGLOWEK">
  5. <div id="WPLYW"></div>
  6. <div id="SZYLD">
  7. <div id="NAPIS"><img src="image/szablon/napis.gif"></div>
  8. </div>
  9. </div>
  10. <div id="CENTRALNY">
  11. <div id="MENU">
  12. <?php include ("lewastrona.php"); ?>
  13. </div><!-- koniec menu -->
  14. <div id="TRESC">
  15. <div id="POLE">
  16. <?php 
  17. if($objSession->IsLoggedIn()){
  18. include_once('labirynt.php');
  19. }
  20. ?>
  21. </div><!-- koniec pole -->
  22. <div id="INFORMACJE">Treść strony</div>
  23. </div><!-- koniec tresc -->
  24. </div><!-- koniec centralny -->
  25.  
  26. <div id="STOPKA">
  27. <?php
  28. include_once("stopka.php");
  29. ?>
  30. </div>
  31. </div>
  32. </center>
  33. </body>


Te dodatkowe informacje chciałbym wyświetlać w div Informacje. Gdzie szukać natchnienia.
Pytanie drugie. W czasie gry będę chciał informować gracza o pewnych zdarzeniach. Czy istnieje sposób przekazywania treści do przeglądarki a ta doda na początku lub końcu już istniejącej listy komunikatów nowy. Nie chciałbym przesyłać za każdym razem wszystkich komunikatów, które wystąpiły w grze bo po 20 minutach może tego być zbyt wiele.

Bardzo proszę o sugestie jakie wzorce lub gotowe moduły mogły by mnie popchnąć w dalszej pracy.
trucksweb
z tym div "informacje" mozesz zrobic tak:
-likajac na jakis tam odpowiedni link pzy postaci, user sciaga id postaci w linka ...&id=202020
-w divie informacje, robisz funkcje, ktora jesli nie ma przeslanego id=0 nic nie wyswietla, natomiast jesli w adresie jest id=20002 to sciaga informacje na temat tego usera z bazy

-boze nie jest to najlepsze rozwiazanie, ale mnie tam wystarczalo party.gif
vegelus
też się na tym zastanawiałem. Plik labirynt.php wygląda tak :

  1. <?php
  2. if ($objSession->IsLoggedIn() == true){
  3. require_once("pliki/class.Labirynt.php");
  4. $objLabirynt = new Labirynt($event);
  5. echo $objLabirynt->LabObrazki();
  6. }else {
  7. echo "Powinieneś się zalogować!";
  8. }
  9. ?>


wywołanie metody LabObrazki jest tymczasowe (pewnie na zawsze) wyświetlające tabelkę z obrazkami planszy, ustawieniem wszystkiego na niej.
Teraz musiałbym dorobić ifa, który by reagował na odpowiednie wartości event. Chcę przekazywać bardzo proste polecenia do serwera. Zdarzenie z np. oznacza zbadaj znalezisko ale już na jakich współrzędnych wie baza danych i sesja. Po zbadaniu na planszy ma sie zmienić obrazek a na polu informacja wyświetlić komunikat, że coś się tam stało dobrego lub złego smile.gif
Kombinowałem z takim rozwiązaniem z książki PHP5 zaawansowane programowanie:

  1. <?php
  2. class Dispatcher {
  3. private $handle;
  4.  
  5. public function __construct($event_handle){
  6. $this->handle = $event_handle;
  7. }
  8.  
  9. public function handle_the_event(){
  10. $name = "handler_{$this->handle}";
  11. if(class_exists("$name")){
  12. $handler_obj = new $name($this->handle);
  13. $response = $handler_obj->handled_event();
  14. return $response;
  15. }else {
  16. echo "Nie można było obsłużyć!";
  17. }
  18. }
  19. }
  20. ?>


Tylko, że wtedy jakaś klasa musiałaby zwracać cały wypełniony szablon bo to rozwiązanie we wskazanym miejscu wstawia wartość zwróconą przez daną klasę. Rozwiązaniem jest umieszczenie kilku wywołań klasy na stronie i obwarować to ifami ale czy to jest jeszcze OOP

Jeżeli chodzi o komunikaty z gry poradziłem sobie w dość hmmmhmm sposób smile.gif

  1. <?php
  2. class Komunikaty {
  3. private static $arKomunikaty = array();
  4.  
  5. public static function getKomunikaty(){
  6. if(!empty(Komunikaty::$arKomunikaty)){
  7. print Komunikaty::printTextPre(Komunikaty::$arKomunikaty);
  8. }
  9. return Komunikaty::$arKomunikaty;
  10. }
  11.  
  12. public static function setKomunikaty($arKom){
  13. Komunikaty::$arKomunikaty[] = $arKom;
  14. }
  15.  
  16. private function printTextPre($var, $title = true){
  17. if($title){
  18. $string = "<pre>";
  19. }
  20. if(is_array($var)){
  21. foreach ($var as $key => $value){
  22. $string .= $key.": ";
  23.  
  24. if(is_array($value)){
  25. $string .= Komunikaty::printTextArea($value,false);
  26. }else{
  27. $string .= $value."\n";
  28. }
  29. }
  30. }
  31. $string .= "</pre>";
  32. return $string;
  33. }
  34. }
  35. ?>


Obsługa klasy jest banalna:

  1. <?php
  2. // dodanie komunikatu
  3. Komunikaty::setKomunikaty("właśnie wykryłeś pułapkę!");
  4.  
  5. //a na index.php odczytuję co się nowego pokazała
  6. Komunikaty::getKomunikaty();
  7. ?>


Jeżeli ktoś ma jakieś inne sugestie to proszę o radę gdzie szukać
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.