Frage

Ich wurde nach einem Muster suchen, um etwas zu modellieren Ich denke, in einem persönlichen Projekt zu tun, und ich frage mich, ob eine modifizierte Version des Dekorateur prasselt funktionieren würde.

Basicly Ich denke, ein Spiel zu schaffen, wo die Charaktere Attribute geändert werden durch welche Elemente sie ausgestattet haben. Die Art und Weise, dass der Dekorateur stapelt es Änderungen ist, ist für dieses perfekt, aber ich habe noch nie einen Dekorateur gesehen, dass Sie Zwischen Dekorateure fallen lässt, das, was passieren würde, wenn Elemente sind unequiped.

Hat jemand Erfahrung der Decorator-Muster auf diese Weise mit? Oder bin ich den Holzweg?

Klarstellung

„Intermediate Dekorateure“, wenn zum Beispiel zu erklären, meine Basisklasse Kaffee ist, die mit Milch dekoriert ist, die mit Zucker dekoriert Milch (das Beispiel in Kopf erstes Entwurfsmuster verwendet wird) wäre ein Zwischen Dekorateur sein, da sie die Basis Kaffee verziert, und wird durch den Zucker verziert.

Noch mehr Klarstellung:)

Die Idee ist, dass Elemente Statistiken zu ändern, würde ich zustimmen, dass ich den Dekorateur in dieser bin shoehorning. Ich werde den Staat Tasche suchen. im Wesentlichen möchte ich eine einzige Anlaufstelle für die Statistik und für sie gehen nach oben / unten, wenn Elementen ausgestattet / unequiped.

Ich konnte nur die Modifikatoren, um die Zeichen Statistiken gelten auf equiping und rollen sie zurück, wenn unequiping. Oder, wenn ein stat für Iterierte durch alle Elemente aufgefordert wird, und die Statistik berechnen.

Ich suche nur für Feedback hier, ich bin mir bewusst, dass ich vielleicht eine Kettensäge verwenden, wo Scheren wären besser geeignet ...

War es hilfreich?

Lösung

Um ehrlich zu sein, es klingt wie Sie wirklich versuchen, ein Muster zu passen, wo Sie wirklich brauchen nicht ein, nur um ein Muster zu verwenden. Sie nicht der Typ sein.

Wenn nun die Waffen, um den Charakter etwas mehr Kraft / Stam / hp oder was auch immer geben, dann könnte es eine Überlegung wert. Aber es klingt nicht wie du gehst zu sein, zu modifizieren (oder Dekoration), um die Eigenschaften des Charakters überhaupt mit diesen.

Andere Tipps

Ich sehe, was Sie zu tun versuchen, aber eines der Dinge, über Muster zu erinnern ist, dass Sie nicht versuchen sollten Schuh-Horn Ihr Design, ein Muster zu passen. Muster kommen in der Natur - das Verhalten, das Sie beschreiben, ist nicht wirklich Teil des Decorator-Muster

.

Mit dieser sagt, ich könnte mich vorstellen, dass Sie eine Waffe über einige eindeutige ID wollen, werden ausklinken, sagen:

Character.unequip(LIGHTSABER);

Wenn Sie versuchen, würde dies in das Decorator-Muster passen, dann würden Sie den Überblick über die derzeit ausgerüstete Gegenstände halten müssen und dann, nach einer Waffe zu entfernen, dann würden Sie die Referenz des Objekts zu aktualisieren, um die LIGHTS Dekoration auf der einen LIGHTS verziert. Das ist eine Menge Arbeit.

Stattdessen ist es vielleicht eine Überlegung wert @ Mitch Idee und ließ Waffen den Charakter der Hilfe in einer Eigenschaft Tasche sein. Denken Sie daran, dass ein Charakter um eine Reihe von Waffen. Für mich scheint es, wie Zusammensetzung kann der Weg zu gehen.

Es gibt drei Antworten auf propegated Statistiken in einem Videospiel Umsetzung:

(1), wird dies erfüllen alle hobbist-Spiel, das Sie jemals (und so ziemlich jedes professionelle Spiel als auch) machen:

character.GetStrength() {
  foreach(item in character.items)
    strFromItems += item.GetStrengthBonusForItems();
       foreach(buff in character.buffs)
    strFromBuffs += buff.GetStrengthBonusForBuffs();
  ...

  return character.baseStrength + strFromItems + ...;
}

(man beachte die unterschiedliche GetStrength * () Funktionen haben nichts miteinander zu tun)

(2), wird dies alle Spiele erfüllen, die ‚diablo‘ im Titel nicht das Wort hat:

 character.GetStr() { ... // same as above, strength is rarely queried }
 character.GetMaxHP() { 
   if (character._maxHPDirty) RecalcMaxHP();
   return character.cachedMaxHP;
 }
 // repeat for damage, and your probably done, but profile to figure out
 // exactly which stats are important to your game

(3) else

 // changes in diablo happen very infrequently compared to queries, 
 // so up propegate to optimize queries.  Moreover, 10 people edit 
 // the stat calculation formulas so having the up propegation match 
 // the caculation w/o writing code is pretty important for robustness.

 character.OnEquip(item) {
     statList.merge(item.statlist);
 }

 character.GetStrength() {
     statList.getStat(STRENGTH);
 }

 statlist.getStat(id) {
     if (IS_FAST_STAT(id)) return cachedFastStats[id];
     return cachedStats.lookup(id);
 }

 statlist.merge(statlist) {
      // left for an exercise for the reader
 }

Und ehrlich gesagt (3) war wahrscheinlich übertrieben.

Hmmm .. Ich denke, dass vielleicht ein Befehlsmuster eine gute Lösung für dieses Problem wäre. Hier ist, was ich meine:

Das ist Ihre Zeichenklasse:

Public class Character {

 //various character related variables and methods here...

 Command[] equipCommands;
 Command[] unequipCommands;

 public Character(Command[] p_equipCommands, Command[] p_unequipCommands) {

  equipCommands = p_equipCommands;
  unequipCommands = p_unEquipCommands;
 }

 public void itemEquiped(int itemID) {

  equipCommands[itemID].execute(this);
 }

 public void itemUnequiped(int itemID) {

  unequipCommands[itemID].execute(this);
 }
}

Hier sind einige Beispiele für Befehle:

public class SwordOfDragonSlayingEquipCommand implements ItemCommand{

 public void execute(Character p_character) {

  //There's probably a better way of doing this, but of the top of my head...
  p_character.addItemToInventory(Weapons.getIteM(Weapons.SWORD_OF_DRAGON_SLAYING));

  //other methods that raise stats, give bonuses etc. here...
 }
}

public class SwordOfDragonSlayingUnequipCommand implements ItemCommand{

 public void execute(Character p_character) {

  //There's probably a better way of doing this, but of the top of my head...
  p_character.removeItemFromInventory(Weapons.getIteM(Weapons.SWORD_OF_DRAGON_SLAYING));

  //other methods that lower stats, remove bonuses etc. here...
 }
}

Natürlich ist dies nur ein Vorschlag und auf jeden Fall offen für Debatte, ich sage nicht, dass dies die beste oder die einzige Möglichkeit, dies zu tun ...

Halten Sie einfach 2 Sätze Statistiken, Ihre Basis-Statistiken und Ihre effektiven Statistiken. Wenn Sie ausrüsten oder ausklinken ein Element hinzufügen oder von den effektiven Statistiken subtrahieren gegebenenfalls. Dann müssen Sie nicht Ihre Ausrüstung Liste wollen, jedesmal wenn Sie durchqueren wissen, was Ihre Statistiken sind.

Ich weiß, diese Frage ist alt, aber dies könnte somone sonst, wenn nicht die OP helfen. Lesen Sie diesen Artikel, zu verstehen, wie diese Art der Sache sollte wirklich in den Spielen durchgeführt werden (von einem der Entwickler, die auf der Tony Hawk-Spiele gearbeitet):

http://cowboyprogramming.com/2007/01/05/ entwickeln-your-heirachy /

Wählen Sie Ihre Einheiten / Objekte im Spiel. Einheit Verhalten in Spielen für die Konstruktion, nie, nie verlassen auf Erbschaft oder auf irgendetwas, das sich in irgendeiner Weise auf Vererbung beruht - dies schließt die Dekorateur Muster wie die OP vorgeschlagen. Sie werden Ihre eigenen Hände werden zu binden. Zusammensetzung ist der Weg zu gehen.

Suchen Sie für die Strategie-Muster?

Warum die Waffen nicht Code wie folgt:

1 = Kettensäge 2 = Schrotflinte 4 = Railgun

So, jetzt die Summe von 6 kann nur bedeuten, dass der Charakter die Flinte besitzt und die Railgun. Dies ist eine schnelle Zusammenfassung so dass Sie sich durch die Liste des Wörterbuch von Waffen nicht wiederholen. Sie müssen noch eine gewisse Struktur, die Waffen enthalten, aber zumindest werden Sie die Geschwindigkeit bei diesem Ansatz erhalten. Dies setzt voraus, dass Sie nur eine Waffe jeder Kategorie haben können, aber viele Kategorien gleichzeitig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top