2016-10-30 1 views
1

Ich erstelle ein Spiel in C# Windows Form und ich werde 9 verschiedene Charaktere innerhalb des Spiels für meinen Spieler zur Auswahl haben (mit Radio-Buttons). Ich habe eine Variable namens PlayerChar und wenn der Spieler einen Charakter auswählt, werde ich den Namen des Charakters in dieser Variable speichern. Außerdem habe ich 9 verschiedene Klassen für jeden Charakter. Was ich versuche, ist, das Programm dazu zu bringen, ein Objekt aus der Klasse des gewählten Charakters zu erstellen. aber ich weiß nicht, wie man variable PlayerChar als meinen Klassennamen benutzt.Wie erstellt man ein Objekt mit einer Variablen als Klassennamen?

PlayerChar obj = new PlayerChar(); 

Dies ist im Grunde, was ich versuche zu tun. Auch habe ich versucht Activator.CreateInstance mit:

PlayerChar myObj = Activator.CreateInstance(PlayerChar); 

Antwort

1

Haben PlayerChar sein die Basisklasse für alle Ihre Charakterklassen.

Verwenden Sie dann einen Schaltblock oder sequenzielle Blöcke, um Ihr Spielerobjekt mit der richtigen Zeichenunterklasse zu instanziieren.

PlayerChar myObj = null; 

if (warriorButton.IsSelected) 
    myObj = new WarriorChar(); 
else if (rangerButtom.IsChecked) 
    myObj = new RangerChar(); 
else if (clericButton.IsChecked) 
    myObj = new ClericChar(); 
... 

(Verwenden Sie die Activator Klasse nicht Ihre Objekte zu instanziiert, wenn Sie verstehen, was Activator tut und haben eine gut durchdacht Grund dafür verwendet wird. In neun von zehn es von Menschen verwendet wird, versucht mit ihrem Code und am Ende nur überkompliziert Dinge zu kommen.)

+0

https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/ – pinkfloydx33

+0

@ pinkfloydx33 Das Beispiel In diesem Blog sehe ich ein schlechtes Beispiel. Es stellt das Problem als eine Art großes Design-Problem dar, aber dieses Problem lässt sich leicht mit einer abstrakten Methode "bool EquipWeapon" (Waffenwaffe) lösen, die überprüft, ob die Waffe ausgerüstet werden kann, bevor sie dem Waffenfeld zugewiesen wird. – Abion47

+0

Ich bin mir nicht sicher über Ihre letzte Aussage. Eine Menge Code verwendet Aktivator (wahrscheinlich ohne dass der Entwickler dies bemerkt) Generische Klassen mit einer 'new()' - Einschränkung gefolgt von 'new T()' werden durch den Compiler mit einem Aufruf von 'Activator.CreateInstance ' ersetzt. Sehen Sie den Abschnitt Bemerkungen hier https://msdn.microsoft.com/en-us/library/0hcyx2kd(v=vs.110).aspx – pinkfloydx33

1

Try this

var typeName = $"MyNamespace.{playerCharacter}"; 
var type = Type.GetType(typeName); 
var instance = Activator.CreateInstance(type); 
2

Sie sind auf dem falschen Weg, um das Problem zu lösen. Sie müssen nicht brauchen, um den Player aus einer Variablen zu erstellen, die ein Klassenname ist; Die Variable kann alles sein, und Sie müssen sie nur mit einer Methode abgleichen, die die korrekte Klasse konstruiert und darstellt. Dies geschieht mit einer Art Fabrik.

Zum Beispiel, hier ist eine Mini-Fabrik, die Player Instanzen von Strings erstellt:

Player CreatePlayerInstance(string type) 
{ 
    var creatorMap = new Dictionary<string, Func<Player>>() { 
     { "foo",() => new FooPlayer() }, 
     { "bar",() => new BarPlayer() }, 
    }; 

    return creatorMap[type](); 
} 

Offensichtlich gibt es keine Fehlerprüfung oder so, aber das ist die Kernidee. Sie können es auf viele verschiedene Arten erweitern und modifizieren, abhängig von Ihren Zielen.

-2

Option 1

Erstellen Sie zwei globale Variablen Ihre Informationen zu speichern. Verwenden Sie dann if-Anweisungen, um die verschiedenen Zeichen und Klassen zuzuweisen.

Option 2

eine Reihe von Methoden erstellen zu manipulieren und speichern Daten mit globalen Variablen in Form.

Option 3

zwei Dateien für Ihren Charakter einer # Klasse C erstellen und die andere für Ihre Klasse.

Erstellen Sie zwei C# -Klasse-Dateien mit Methoden und rufen sie aus dem Hauptprogramm oder wo sie benötigt werden.

Tutorial für Methoden: https://msdn.microsoft.com/en-us/library/ms173114.aspx

Tutorial für Klassen: https://msdn.microsoft.com/en-us/library/x9afc042.aspx

Verwandte Themen