Ankündigung

Einklappen
Keine Ankündigung bisher.

Quest System: Performance

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Quest System: Performance

    Moin,

    ich habe vor einiger Zeit ein PHP Browsergame angefangen zu schreiben und führe es über die Zeit weiter. Nun möchte ich endlich ein Questsystem implementieren.
    Bei Javascript-Spielen habe ich sowas einfacher machen können, da jeder Client meist genug Power hatte.

    Nun möchte ich das eben in PHP umsetzen, und meine Idee war folgende (ich bin noch recht ungeübt in OOP):
    Eine Quest Klasse, mit id, Titel, Beschreibung und zwei Funktionen; eine Funktion wird aufgerufen und überprüft, ob die Quest freigeschaltet wird (Voraussetzungen erfüllt?),
    die zweite überprüft den Fortschritt.
    Nun kann das ja passieren, dass bei jedem Aufruf der Seite sich etwas ändert, und deshalb war eben mein Ansatz, bei jedem Reload die zwei Funktionen ausführen zu lassen (natürlich nur, wenn die Quest noch nicht freigeschaltet wurde, bzw. noch nicht abgeschlossen wurde)

    Das kann sich aber schnell häufen, bei sagen wir mal 40 Quests und einem neuen Spieler, werden bei jedem Seitenaufruf 40 Objekte in einem Array erstellt.
    Ich kann mir nicht vorstellen, dass diese Technik state-of-the-art ist. Also - wie schaffe ich es, ein performantes System aufzubauen?

    Freilich habe ich schon gesucht, und ich sehe oft Aussagen, dass man "Hooks" einbaut, das heißt wenn zB etwas gekauft wird, dann wird ein Event an eine Funktion abgefeuert. Doch wie es dann weitergeht, verstehe ich noch nicht.

    Kann mir jemand auf die Sprünge helfen?

    Liebe Grüße
    Markus
    "Echte Intellektuelle wie wir sollten ihre Lippen nicht mit Flüchen beschmutzen."


  • #2
    Moin,

    vergiss das erst mal was du dir vorgestellt hast und erzähl mal wie du es dir auf der webseite vorstellst?

    Was ist das für ein Spiel? RPG? Strategie? Farm?

    Beschreib mal die Quests wie sehen die aus, was macht man in dem Spiel
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

    Kommentar


    • #3
      MOD: Verschoben von PHP-Einsteiger
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von BlackScorp Beitrag anzeigen
        Moin,

        vergiss das erst mal was du dir vorgestellt hast und erzähl mal wie du es dir auf der webseite vorstellst?

        Was ist das für ein Spiel? RPG? Strategie? Farm?

        Beschreib mal die Quests wie sehen die aus, was macht man in dem Spiel
        Es ist ein eher altmodisches klassiches Browsergame. Es ist eine Art Rennfahrermanager -Spiel,
        das heißt der User kann Fahrer anheuern, Autos kaufen, Updates erforschen, Teile ans Auto anbringen.
        Dabei ist das alles über Texte/Tabellen/bisschen Design realisiert.

        Wenn sich ein User nun ein Auto kauft, klickt er auf einen Button, welcher die Seite reloadet und POST Daten mitschickt, eben welches Fahrzeug.
        Der Server prüft dann, ob er genug Geld und Stellplätze hat, und wenn ja, ruft er eine Funktion auf, die die Daten in der DB updatet.

        Eine Quest wäre nun zB: Fahre x verschiedene Rennen, habe mehr als x Fahrer, verkaufe ein Teil auf dem Markt, update den Fahrer auf Level x, so etwas.

        Liebe Grüße
        "Echte Intellektuelle wie wir sollten ihre Lippen nicht mit Flüchen beschmutzen."

        Kommentar


        • #5
          ok, das was du brauchst ist ein Event System.

          Sprich bei jeder aktion sendestest du ein event ab, frei nach dem Motto "Ich habe ein auto gekauft", dann hast du für jeden quest einen eigenen Listener. Im Quest listener, schaust du dann ob dich das Event interessiert, wenn nicht, dann machst du garnichts.

          Konkret, schau dir die Bibliothek an http://event.thephpleague.com/2.0/emitter/basic-usage/

          Emitter ist quasi die Klasse die das Event verschickt, nach deinem $_POST und INSERT into machst du sowas

          PHP-Code:
          $event = new BoughtCarEvent($userId,$carId);
          $emitter->emit($event); 
          somit hast du quasi deine Aktion weitergereicht, an dem Emiter hängen die Listener und die Reagieren dann auf die Events.

          Hoffe das ist verständlich
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/witalimik

          Kommentar


          • #6
            Wie wäre es, wenn du in deiner Quests-Tabelle abspeicherst, welche Aktion der Nutzer als nächstes durchführen muss, um mit dem Quest weiterzumachen. Wenn der Nutzer nun ein Auto kauft, suchst du dir alle Quests aus der Datenbank raus, deren nächste Aktion der Kauf eines Autos ist. Und diese Quests triggerst du dann. Pseudo-Beispiel als Anreiz:

            PHP-Code:
            public function buyCar(User $userCar $car){

                
            // purchase
                
            if($user->getBalance() < $car->getPrice()){
                    return 
            false;
                }
                
            $user->setBalance($user->getBalance() - $car->getPrice());
                
            $car->setOwner($user);

                
            // quests
                
            $quests $this->db->quests->findBy([
                    
            'user' => $user,
                    
            'nextEvent' => 'buyCar',
                    
            'done' => false
                
            ]);
                foreach(
            $quests as $quest){
                    
            $quest->perform('buyCar');
                }


            Um Quests initial in die Datenbank zu kriegen kannst du im Prinzip ähnlich vorgehen.

            Kommentar

            Lädt...
            X