2014-02-23 12 views
7

Ich weiß nicht, ob dies möglich ist oder nicht, aber ich schreibe ein einfaches Spiel mit XNA und C#, und irgendwie brauchen Sie eine bestimmte Variable, um mehr zu handhaben als ein Aufzählungstyp. Das Zeichen, das Sie steuern hat einen einzigen Inventar-Slot, der unter einem der Frucht Typen:Wie mit mehreren Aufzählungstypen in einer Variablen umgehen

public enum Fruit : int {Apple, Banana, Orange}; 
public Fruit carrying; 

Aber der Charakter kann auch in der Lage sein, etwas zu tragen sonst:

public enum Misc : int {Parcel, Brush}; 

ich nicht Ich möchte sie alle zu einem Enum zusammenführen, weil ich möchte, dass die Obstzählung eindeutig ist, und ich möchte nicht zwei verschiedene tragende Variablen haben müssen - eine für Fruit und eine für Misc.

Gibt es eine Möglichkeit, sagen wir, eine Super-Enumeration, die sie zu einer dritten Enumeration aller fünf Mitglieder zusammenführen kann?

EDIT: Danke für die Antworten. Ich habe beschlossen, einen einzigen Artikeltyp zu erstellen (ein Mitglied davon ist eine Aufzählung, die zwischen Fruit und Misc unterscheidet) und sie über XML in eine Liste zu laden.

Antwort

7

Es klingt, als ob Sie wahrscheinlich einen Union-Typ für CarriableItem oder etwas ähnliches möchten. Zum Beispiel:

public sealed class CarriableItem 
{ 
    public Fruit? Fruit { get; private set; } 
    public Misc? Misc { get; private set; } 

    // Only instantiated through factory methods 
    private CarriableItem() {} 

    public static CarriableItem FromFruit(Fruit fruit) 
    { 
     return new CarriableItem { Fruit = fruit }; 
    } 

    public static CarriableItem FromMisc(Misc misc) 
    { 
     return new CarriableItem { Misc = misc }; 
    } 
} 

Sie könnten auch wollen dann eine andere ENUM um anzuzeigen, welche Art von Element getragen wird:

public enum CarriableItemType 
{ 
    Fruit, 
    Misc 
} 

Dann Unterkunft um CarriableItem hinzufügen:

public CarriableItemType { get; private set; } 

und stellen Sie es in den Fabrikmethoden entsprechend ein.

Dann hätte Ihre Person nur eine einzige Variable vom Typ CarriableItem.

0

Warum sollten Sie sich auf ein Enum beschränken? Wenn Sie eine Schnittstelle und verschiedene Implementierungen davon haben, können Sie das Verhalten Ihrer Artikel anpassen!

// generic item. It has a description and can be traded 
public interface IItem { 
    string Description { get; } 
    float Cost { get; } 
} 

// potions, fruits etc., they have effects such as 
// +10 health, -5 fatigue and so on 
public interface IConsumableItem: IItem { 
    void ApplyEffect(Character p); 
} 

// tools like hammers, sticks, swords ect., they can 
// be used on anything the player clicks on 
public interface IToolItem: IItem { 
    void Use(Entity e); 
}  

Dadurch wird Ihr Code einfacher und strukturierter als mit enums, um zwischen verschiedenen Elementen zu unterscheiden. Und wenn Sie das noch tun müssen, können Sie den Operator is und die Methode IEnumerable.OfType nutzen. Also hier ist, was Sie tun können:

public class HealthPotion: IConsumableItem { 
    public string Description { 
     get { return "An apple you picked from a tree. It makes you feel better."; } 
    } 

    public float Cost { 
     get { return 5f; } 
    } 

    public void ApplyEffect(Character p) { 
     p.Health += 1; 
    } 
} 

public class Player: Character { 
    public List<IItem> Inventory { get; private set; } 

    private IEnumerable<IConsumableItem> _consumables { 
     get { return this.Inventory.OfType<IConsumableItem>(); } 
    } 

    public void InventoryItemSelected(IItem i) { 
     if(IItem is IConsumableItem) { 
      (IItem as IConsumableItem).ApplyEffect(this); 
     } 
     else if(IItem is IToolItem) { 
      // ask the player to click on something 
     } 
     else if /* ...... */ 

     this.Inventory.Remove(i); 
    } 
} 
Verwandte Themen