php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 24.03.2011, 09:48  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard 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
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.03.2011, 10:14  
Erfahrener Benutzer
 
Registriert seit: 23.08.2010
Beiträge: 495
PHP-Kenntnisse:
Fortgeschritten
mimomamu sorgt für eine eindrucksvolle Atmosphäremimomamu sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
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
mimomamu ist offline   Mit Zitat antworten
Alt 24.03.2011, 10:27  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
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:
Zitat von mimomamu Beitrag anzeigen
Alternative zu diesen Manager-Klassen sind statische Funktionen.
Statische methoden machen sinn... vielen dank

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 24.03.2011, 10:44  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

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.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 24.03.2011, 11:17  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

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
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 24.03.2011, 11:27  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

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.
fab ist offline   Mit Zitat antworten
Alt 24.03.2011, 11:31  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

  • 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*
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (24.03.2011 um 13:49 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 24.03.2011, 11:35  
Erfahrener Benutzer
 
Registriert seit: 23.08.2010
Beiträge: 495
PHP-Kenntnisse:
Fortgeschritten
mimomamu sorgt für eine eindrucksvolle Atmosphäremimomamu sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
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
mimomamu ist offline   Mit Zitat antworten
Alt 24.03.2011, 13:43  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

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

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 24.03.2011, 16:37  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
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(); 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Methoden überschreiben coola PHP Einsteiger 11 22.03.2011 13:33
Zwei Methoden eines Objekts: PHP übergeht eine der beiden readyaim PHP Einsteiger 5 19.01.2011 15:50
[Erledigt] Objekt mit statischen Methoden hts JavaScript, Ajax und mehr 3 18.12.2010 21:07
[Erledigt] Methoden zu einer Klasse hinzufügen ByStones PHP Tipps 2010 3 30.08.2010 23:58
Objekte verwenden gleiche Methoden Cube PHP Tipps 2010 2 21.04.2010 09:25
php://stdout und libapache2-mod-php5, wohin werden Nachrichten geschrieben stebi PHP Tipps 2010 7 17.01.2010 16:58
[Erledigt] Wohin gehen bei mit php versendeten mails die Meldungen bei Empfänger unbe Thamannta PHP Tipps 2009 10 05.09.2009 09:04
Methoden werden nicht vererbt stayInside PHP Tipps 2009 12 15.03.2009 00:24
Kindklasse: Methoden über _call() ergänzen? ciss PHP Tipps 2008 2 29.12.2008 18:08
[Erledigt] Methoden auf Objekt aufrufen (und fangen), die nicht existieren tsisson PHP Tipps 2008 2 07.10.2008 18:19
Referenzen Private Methoden. notyyy PHP-Fortgeschrittene 5 29.05.2008 09:40
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
Zugriff auf statische methoden oder konstanten nightfreak PHP-Fortgeschrittene 6 14.11.2005 16:56
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
wohin sendet mein pc?? Rotti Off-Topic Diskussionen 4 13.10.2004 13:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php spielfigur auswählen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum