Ankündigung

Einklappen
Keine Ankündigung bisher.

Wohin mit methoden

Einklappen

Neue Werbung 2019

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

  • Wohin mit methoden

    Hallo leute,

    ich habe ein kleines Problem. Es geht um mein Browsergame. Ich habe mir 2 Klassen angelegt.

    Player.class.php
    Character.class.php

    Der Player ist halt die Person selbst, sprich der Player hat methoden wie

    login();
    logout();
    register();
    usw..

    Die Character ist die Spielfigur, ein Player kann mehrere Characters erstellen aber nur mit einem Gleichzeitig spielen.

    Dem Character habe ich folgende methoden zugewiesen:
    move();
    attack();
    useSkill();
    die();
    usw..

    das Problem sind nun folgende Methoden:

    createChar();
    deleteChar();
    selectChar();

    ich weis nicht unter welcher Klasse ich diese Methoden einordnen kann.
    zur Zeit passiert folgendes bei mir:
    PHP-Code:
    class Game{
    private 
    $player;
    private 
    $char;

    public function 
    __construct(){
    $this->player = new Player();
    $this->char = new Character($this->player->getPlayerId());
    if(isset(
    $_GET['x']) && isset($_GET['y'])){
    $this->char->move($_GET['x'],$_GET['y']);
    }

    }


    nur ist das ja eigentlich quatsch, denn wenn ich eine Spielfigur ausgewählt habe in der GUI, erst dann kann ja die Instanz von Char exestieren.
    Oder benötige ich eine Wietere "Beziehungsklasse" ?
    Ich weis gerade echt nicht wie ich die Spielfigur erstellen,löschen oder auswählen kann. oder denke ich da zu kompliziert und es reicht so ein konstrukt aus?
    PHP-Code:
    if($this->player->hasSelectedChar()){
    $this->game->run();
    }else{
    $this->charselection->display();
    }

    if(isset(
    $_GET['action']) && isset($_GET['charslot'])){
    switch(
    $_GET['action']){
    case 
    'create':{
    $this->char->create($_GET['charslot']);
    break;
    }
    case 
    'remove':{
    $this->char->remove($_GET['charslot']);
    break;
    }
    case 
    'select':{
    $this->char->select($_GET['charslot']);
    break;
    }
    }

    ich glaube eigentlich nicht, dass diese methoden zu der Klasse Character gehören, dann würde es ja bedeuten, ein Character wählt sich selber, oder kann sich selber löschen usw.. aber eigentlich kann das nur der Player.

    Hoffe ihr habt mein Problem verstanden und könnt mir weiter helfen.

    MFG
    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/c/VitalijMik


  • #2
    Zitat von BlackScorp Beitrag anzeigen
    ich glaube eigentlich nicht, dass diese methoden zu der Klasse Character gehören, dann würde es ja bedeuten, ein Character wählt sich selber, ...
    Du hast ja auch register in der Klasse Player. Ich nehme mal an, ein Player, der noch nicht registriert ist, ist überhaupt kein Player. Dann erzeugt sich der Player auch irgendwie selbst.

    Es ist üblich, dass Komponenten über eine zentrale Klasse verfügen, die für allgemeine Aufgaben zuständig ist. In deinem Fall wäre das zum Beispiel eine Klasse PlayerManager. In diese Klasse kannst du sowohl register und login reinpacken, als auch createCharacter und selectCharacter. Du solltest nur aufpassen, dass der PlayerManager dadurch nicht zum God Object wird.

    Bei der Festlegung der Grenzen zwischen den Komponenten ist wieder Fingerspitzengefühl gefragt. Wenn der PlayerManager zu unhandlich wird, dann kannst du Teile der Funktionalität in einen CharacterManager auslagern.

    Alternative zu diesen Manager-Klassen sind statische Funktionen.
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      Zitat von mimomamu Beitrag anzeigen
      Du hast ja auch register in der Klasse Player. Ich nehme mal an, ein Player, der noch nicht registriert ist, ist überhaupt kein Player. Dann erzeugt sich der Player auch irgendwie selbst.
      Naja der Player ist was besonderes, da sein account eigentlich immer exestiert wegen Facebook(ist eine Facebook APP)
      die Register funktion überträgt die Facebook daten in die Datenbank.

      Zitat von mimomamu Beitrag anzeigen
      Alternative zu diesen Manager-Klassen sind statische Funktionen.
      Statische methoden machen sinn... vielen dank

      MFG
      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/c/VitalijMik

      Kommentar


      • #4
        move()
        useSkill()
        revive()

        Sind "typische" Spielfigur-Methoden -> Player ( generell eher Avatar )

        createPlayer()

        Ist eine Factory-Methode, die weder in Game sollte noch in Player. Die Factory erzeugt einen Spieler ( Player ) der der Spielewelt ( Game ) übergeben wird. Alternativ dazu als Statische Methode der Player-Klasse zum "self factorizing". Je nach abstraktion der Factory ist das aber irgendwann zu überladen für eine Player-Klasse ( nebst Objekt )

        Erstellte Spieler sollen ja nicht nur im Spiel "erzeugt" werden ( Game ) sondern auch gespeichert werden ( avatarStorage ? )

        Ohne einen genauen Plan von dem was du da zusammen-"class"'t werden das aber hier schüsse ins blaue, da es kein Allheilmittel zur Methoden-/Klassen-Strukturierung gibt.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #5
          naja eienen genauen Plan habe ich ja auch nicht, nur mit OOP sollte man sich ja dann sowas Bildlich vorstellen. Und ich habe mir folgendes vorgestellt:

          Eine reele Person hat ein Account. Account unterteilt sich in 3 Bereiche:
          FacebookPlayer (Facebook User)
          StandardPlayer (Registrierter User)
          GuestPlayer (Zufällig generierter User)

          zu jedem Player gehören Mehrere Charaktere(Spielfiguren)

          Nach einem Login prüft das Script ob eine Figur ausgewählt wurde,
          wenn nein -> Zeige Spielfigur auswahl (Hier gibt es außer der auswahl, auch noch die Möglichkeit eine Figur zu erstellen, bzw Löschen)
          wenn ja -> Zeige Spielwelt (Hier finden alle aktionen des Spiels statt)

          also habe ich mir zu dem plan dann folgendes ausgedacht:
          PHP-Code:
          if($this->player->hasSelectedChar()){
          $this->charSelectionScreen->display();
          }else{
          $this->gameScreen->display();

          im CharSelection müsste ich ja eine Instanz von Character erstellen und beim erhalt einer action irgenwas mit dem char tun. quasi:

          PHP-Code:
          $this->player->selectChar($slot);//Spieler wählt figur aus 
          jedoch müsste ich ja dann selectChar in die Klasse Player packen und somit wird dann die Klasse Player zu einer God_Class weil dann der player quasi alles mit seinem Account und Spielfigur anstellen kann.

          Mir geht es darum irgendwie die Methoden richtig zu unterteilen in vernüftige klassen.

          und bezüglich der move() und useskill() methoden.. die müssten dann ja eigentlich auch in die player klasse weil, vom gedanken her bewegt sich die spielfigur nicht von selbst(es seidenn es ist ein NPC) sondern

          PHP-Code:
          $this->player->moveChar($x,$y);
          $this->player->useSkillOfSelectedChar($heal); 
          ich weis nicht wie man sowas realisiert dass man eine Klasse hat, die andere Klassen durch eigene Methoden beeinflussen kann.

          ist halt gerade viel durcheinander
          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/c/VitalijMik

          Kommentar


          • #6
            Stichwort Aggregation und Delegation. Allerdings geht das in dem Fall wieder stark in Richtung God Object, schließlich wird irgendwie jede Aktion vom Spieler ausgelöst. Also führe dir den Unterschied zwischen dem Spieler als Objekt in der Anwendung und dem Spieler als Benutzer der Anwendung vor Augen, um das zu vermeiden. So etwas wie $this->activeCharacter->move($x,$y) ist IMHO völlig okay, ohne dass das Player-Objekt dazwischen stehen müsste.
            @fschmengler - @fschmengler - @schmengler
            PHP Blog - Magento Entwicklung - CSS Ribbon Generator

            Kommentar


            • #7
              • class Game
              • class Avatar
              • class Client, class clientControl
              • class PlayerFactory


              Code:
              Game
                - Avatar $myAvatar
                   + setCurrent(Avatar $player)
                   + getSkills()
                   + isMoveableTo(x,y,z)
                   + ...
                + storeCycle()
              
              Client
                - Current
                   + checkLogin()
                   - clientControl $control
                      + moveAvatar()
                      + useSkill()
                      + leaveWorld()
                      + enterWorld()
                   + deleteAvatar()
                   + createAvatar()
                + Login($user,$pass,$ip)
                + LoginFB($fbID)
                + LoginGuest()
                + SelectAvatar(Avatar $player)
                + getAvatars()
              
              PlayerFactory
                + create($new_name, $new_class, ...)
                + load($avatarName)
              würd mir da grad so vorschweben.
              *spoiler* - = properties, + = methoden */spoiler*
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Zitat von tr0y Beitrag anzeigen
                move()
                useSkill()
                revive()

                Sind "typische" Spielfigur-Methoden -> Player ( generell eher Avatar )
                Die Spielfigur heißt bei BlackScorp Character.
                Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

                Kommentar


                • #9
                  hm.. vielen dank für eure Antworten. ich werde mal schauen was ich hinkriegen werden..

                  MFG
                  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/c/VitalijMik

                  Kommentar


                  • #10
                    createChar();
                    deleteChar();
                    selectChar();
                    Gehört in eine Factory bzw. einen Character-Manager.

                    PHP-Code:
                    Player --> Manager::getCharacter() --> Factory::createCharacter ();
                    Player --> Manager::getCharacter();
                    Player --> Manager::deleteCharacter(); 
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar

                    Lädt...
                    X