Items benutzen
-
Servus Community,
zur Zeit bastel ich aus Spaß an der Freude an einem kleinen RPG. Dabei habe ich kleines Design Problem. Ich programmiere in C# .NET 4.0.
Ich habe eine Klasse Inventar, die eine Liste von Items hält. Zur Zeit habe ich es so, dass man an die Itemklasse den Charakter gibt und das Item auf den Charakter zugreift.
Also sowas in der Art:HealthPotion hp = new HealthPotion(); hp.Use(playercharacter); /* soll zu playercharacter.Use(hp); */
Natürlich ist falsch und es gefällt mir nicht, denn ich will das genaue Gegenteil. Ich weiß aber nicht genau wie ich das realisieren soll, denn jedes Item ist individuell und reagiert anders auf einen Charakter. Während der Heiltrank das Leben manipuliert, manipuliert der Manatrank das Mana.
Wie also könnte ich das Item an die Charakterklasse geben und die Use-Methode() weiß wie sie mit dem Itemobjekt umzugehen hat?Über Hilfe wäre ich erfreut.
Mit freundlichen Grüßen,
Freaky
-
FreakY<3Cpp schrieb:
Servus Community,
zur Zeit bastel ich aus Spaß an der Freude an einem kleinen RPG. Dabei habe ich kleines Design Problem. Ich programmiere in C# .NET 4.0.
da stimme ich zu
Natürlich ist falsch und es gefällt mir nicht, denn ich will das genaue Gegenteil.
wieso sollte das falsch sein? es macht genau das was du moechtest und funktioniert gut, was ist daran falsch? dass es nicht die besitzverhaeltnisse der realen welt wiederspiegelt, sondern nur sehr funktional aufgebaut ist?
Ich weiß aber nicht genau wie ich das realisieren soll, denn jedes Item ist individuell und reagiert anders auf einen Charakter. Während der Heiltrank das Leben manipuliert, manipuliert der Manatrank das Mana.
Wie also könnte ich das Item an die Charakterklasse geben und die Use-Methode() weiß wie sie mit dem Itemobjekt umzugehen hat?es reagiert nicht, es agiert auf den character daten. eine abstrakte use methode die irgendwie mit funktoren auf 10umwegen doch dasselbe macht wie du es oben schon hast ist doch eigentlich unsinnig. das ist so als ob eine muecke einen menschen nicht stechen duerfte, sondern der mensch sie aufheben und sich selbst stechen muesste damit die weltordnung gewahrt ist.
ich denke du hast das schon gut geloest. (und das, obwohl du das c# problem hast )
-
Kannst es doch so machen:
player.use(item) --> item.applyTo(this) --> player.addHealth(25)
(ich hoffe das ist verständlich ...)
Das ist im Grunde das Visitor-Pattern, wobei das Item die Rolle des Visitors einnimmt, use ist die accept-Methode und applyTo die visit-Methode.
Ob man das so machen muss oder sollte ist eine andere Frage
-
rapso schrieb:
das ist so als ob eine muecke einen menschen nicht stechen duerfte, sondern der mensch sie aufheben und sich selbst stechen muesste damit die weltordnung gewahrt ist.
Hehe, guter Vergleich . Danke für deine Meinung.
Bashar schrieb:
player.use(item) --> item.applyTo(this) --> player.addHealth(25)
(ich hoffe das ist verständlich ...)
Ja ist es. Daran habe ich auch schon gedacht, nur fand ich es irgendwie sinnfrei. Letztendlich muss das Item ja doch Zugriff auf den Charakter haben.
Gut, wenn ihr meint, dass es so okay ist, lasse ich es so.
Vielen Dank.Mit freundlichen Grüßen,
Freaky
-
FreakY<3Cpp schrieb:
Ja ist es. Daran habe ich auch schon gedacht, nur fand ich es irgendwie sinnfrei. Letztendlich muss das Item ja doch Zugriff auf den Charakter haben.
Das ist doch nach dem Prinzip des Polymorphismus sowieso klar.
-
Ich denke du solltest hier einen anderen Weg wählen, und die Items als Daten realisieren, die der Spieler auswerten kann. Dann kannst du in einem zweiten Schritt nämlich auch die Itembeschreibungen teilweise automatisieren, und musst dir keine Gedanken darüber machen die immer mit zuschleifen, nur weil du eine Kleinigkeit änderst.
-
cooky451 schrieb:
Ich denke du solltest hier einen anderen Weg wählen, und die Items als Daten realisieren, die der Spieler auswerten kann.
Würdest du das bitte ein wenig näher beschreiben? So etwas hatte ich ja eigentlich vor. Ich hätte gerne, dass in der Itemklasse steht, wie sie "funktioniert". Wenn ich also die Use-Methode benutze und ein HealthPotion übergebe, soll die Charakterklasse wissen, wie sie damit umzugehen hat. Sinnbildlich würde man eine Flasche Wasser aufdrehen und dran trinken. Der Charakter soll wissen wie er den Heiltrank nutzen soll.
Ich hatte dabei noch an eine Zwischenklasse gedacht, wovon ein Objekt in der Itemklasse zurückgegeben wird. In dieser Klasse stehen Werte, wie z.B. was der Trank auswirkt(Leben geben) und wie viel davon und die gesetzten Werte ändert sich der Charakter bei sich selbst. Bei Tränken und Konsorten wäre das nicht unbedingt das Problem, aber sobald ein Trank auf die Größe, oder etwas anderes spezielles eingeht, muss diese Zwischenklasse alles enthalten und könnte leicht übermutieren.
-
FreakY<3Cpp schrieb:
cooky451 schrieb:
Ich denke du solltest hier einen anderen Weg wählen, und die Items als Daten realisieren, die der Spieler auswerten kann.
Würdest du das bitte ein wenig näher beschreiben? So etwas hatte ich ja eigentlich vor. Ich hätte gerne, dass in der Itemklasse steht, wie sie "funktioniert". Wenn ich also die Use-Methode benutze und ein HealthPotion übergebe, soll die Charakterklasse wissen, wie sie damit umzugehen hat. Sinnbildlich würde man eine Flasche Wasser aufdrehen und dran trinken. Der Charakter soll wissen wie er den Heiltrank nutzen soll.
Ich hatte dabei noch an eine Zwischenklasse gedacht, wovon ein Objekt in der Itemklasse zurückgegeben wird. In dieser Klasse stehen Werte, wie z.B. was der Trank auswirkt(Leben geben) und wie viel davon und die gesetzten Werte ändert sich der Charakter bei sich selbst. Bei Tränken und Konsorten wäre das nicht unbedingt das Problem, aber sobald ein Trank auf die Größe, oder etwas anderes spezielles eingeht, muss diese Zwischenklasse alles enthalten und könnte leicht übermutieren.du kannst hier mal nach data driven suchen, wir hatten kuerzlich erst einen seitenweisen thread darueber.
allerdings beisst sich das ein wenig mit "jedes Item ist individuell und reagiert anders".
wenn es dieselben funktionen sind, nur mit unterschiedlichen daten, kannst du es data driven machen.
hast du aber unterschiedliche reaktionen z.b. wird ein heiltrank die lebensenergie aufladen, waehrend ein dolch vielleicht geworfen wird wenn du den triggerst, ist das weniger sinnvoll mit data driven design.
-
rapso schrieb:
heutzutage will man dinge eher "data driven" machen, das bedeutet, dass man daten von funktionen trennt. naiv koennte man eine klasse/struct machen, die alle eigenschaften hat die je ein objekt haben koennte, aber garkeine funktionen.
Irgendwo hast du dann die konfigurationen (z.b. als xml, ini oder txt) fuer alle einheiten. ein kraftwerk wird dann durch die selben member representiert wie ein panzer wie ein soldat wie ein farmer wie ein baum.
kraftwerk: max-geschwindigkeit:0 panzerung:100 3dobjekt:kraftwerk.obj textur:kraftwerk.png
panzer: max-geschwindigkeit:100 panzerung:10 3dobjekt:panzer.obj textur:panzer.png
soldat: max-geschwindigkeit:10 panzerung:2 3dobjekt:soldat.obj textur:soldat.png
farmer: max-geschwindigkeit:5 panzerung:0 3dobjekt:farmer.obj textur:farmer.pngAlso ungefähr sowas, wie ich es in meinem vorherigen Post angesprochen habe. Wenn ich es jetzt so sehe, muss ich sagen, gefällt es mir nicht.
Ich werde es so lassen wie ich es bisher habe und gebe mich damit zufrieden. Vielleicht werde ich doch das Visitor-Pattern benutzen, einfach wegen dem Umgang.Ich danke euch für eure Hilfe.
Mit freundlichen Grüßen,
Freaky