Crafting System

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Crafting System

    Ich habe ein Inventar in dem alle Items enthalten sind, nun möchte ich dass wenn man 2 Items an klickt und diese zu einem Rezept gehören sollen sie verarbeitet werden (Craftingsystem wie in Magicite).

    Nur habe ich jetzt keine Idee wie ich das realisieren soll.
    Habt ihr eine Idee?

    Gruß DragonSlayerMarc
    There are only 10 types of people in the world: Those who understand binary and those who don't.
    Hi
    ohne deine Architektur wird das nichts. Wie sind deine Klassen aufgebaut? In meinem System würde das so funktionieren:

    C#-Quellcode

    1. public class Item { }
    2. public class Inventory
    3. {
    4. public void SetItemCount(Item item, int count);
    5. public int GetItemCount(Item item);
    6. public IEnumerable<Item> GetInventoryItems(Item itemKind); //Gibt alle Items zurück, für die mehr als 0 Elemente im Inventar sind und die der angegeben itemKind entsprechen
    7. public IEnumerable<Item> GetInventoryItems(); //Gibt alle Items zurück, für die mehr als 0 Elemente im Inventar sind
    8. }
    9. public class Recipe
    10. {
    11. public IEnumerable<Item> GetRequiredItems();
    12. public int GetRequiredItemCount(Item item);
    13. public Item Combine(IEnumerable<Item> items);
    14. }


    Dann nur noch die Recipes durcharbeiten (kann man auch per Dictionary machen, wenn man Item vergleichbar macht). Ist jetzt nur Pseudocode, um die Architektur zu veranschaulichen. Item enthält alle möglichen Zusatzinfos. Das Recipe stellt dann alle Komponenten und deren benötigte Anzahlen bereit. Combine nimmt alle Zutaten (Instanzen!! Es könnte bspw. auch heißen, Schwert X wird mit Schleifstein kombiniert ==> Schwert bleibt das gleiche, obwohl das Rezept nur auf der Abstraktion "Schwert" definiert ist) an.

    Gruß
    ~blaze~
    Eventuell sollte dann die Klasse "Sword" geerbt werden, um Eigenschaften zu verändern.
    Zum Beispiel: Schwert wird mit einem speziellen Material verbunden -> Ist härter. Entsprechend würde die Klasse dafür den Wert für die Härte überschreiben.

    Ein Interface wäre theoretisch auch möglich.

    Sowas meine ich:

    C#-Quellcode

    1. public class Sword
    2. {
    3. public abstract int Hardness = 1;
    4. }
    5. public class DiamondSword : Sword
    6. {
    7. public override int Hardness = 5;
    8. }


    Das Ganze ist natürlich auch nur ein Grundsatz und die Properties müssten entsprechend ausgebaut werden etc.
    Ein Interface ISword oder gar generell IWeapon wäre halt dann der andere Weg, um es verschieden zu implementieren.

    Natürlich kannst Du auch hergehen und sagen "Ich mache ne Klasse, deren Member von jeder Waffe geerbt werden müssen."
    Also dann mit 'nem abstract-Schlüsselwort, sodass dann alle Waffen, die von dieser Klasse erben, diesen Aufbau übernehmen müssen. Also da gibt es viele Wege.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    Eine Eigenschaft als Überschreibbar kennzuzeichnen ist nur dann sinnvoll, wenn die Getter bzw Setter jeweils anders implementiert werden, in den jeweiligen Klassen.

    Da das da nicht der Fall ist kannst du auch einfach:

    VB.NET-Quellcode

    1. Public Class Sword
    2. Public Property Hardness As Integer = 1
    3. End Class
    4. Public Class DiamondSword Inherits Sword
    5. Public Sub New()
    6. Hardness = 1337
    7. End Sub
    8. End Class


    Zum TE:

    Dafür muss man halt deine Architektur kennen.
    Die Codes sind ja mal grausam. :P
    Ich würde auf jeden Fall Item als Itemklasse auffassen, nicht als Iteminstanz. Z.B. würde ich eine Klasse Sword einführen, die dann wiederum bestimmte Swordtypen als Instanz haben kann. Das Inventar legt dann fest, wie viele Items enthalten sind und welche, alle "Instanzen" eines Items (d.h. alle Schwerter, die der Benutzer bspw. bei sich trägt) besitzen genau die Eigenschaften, die für die Instanz des Itemtyps (d.h. des von Item abgeleiteten Typs) festgelegt werden. Die Anzahl kann nat. auch Sonderitems berücksichtigen (z.B. Verzauberungen, etc.).

    Gruß
    ~blaze~

    RushDen schrieb:

    kannst du auch einfach
    die Property Hardness als ReadOnly deklarieren. da der Schmied keinen Zugriff auf Legierungsmaterialien hat. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!