public void Test() { string name = "test-option"; string section = "test-section"; Keys defaultValue = Keys.Escape; ConfigFile configFile = new ConfigFile (TestHelper.RandomFilename (extension: "ini")); KeyOption option = new KeyOption (section, name, defaultValue, configFile); Assert.AreEqual (option.Value, defaultValue); string defaultStr = option.DisplayValue; Assert.IsTrue (option.DisplayValidValues.ContainsKey (defaultStr)); option.Value = Keys.LeftShift; Assert.AreEqual (option.Value, Keys.LeftShift); string tenStr = option.DisplayValue; Assert.IsTrue (option.DisplayValidValues.ContainsKey (tenStr)); Assert.AreNotEqual (defaultStr, tenStr); (option as DistinctOption).Value = "invalid!!"; Assert.AreEqual (option.Value, defaultValue); Assert.AreEqual (defaultStr, option.DisplayValue); }
/// <summary> /// Erzeugt ein neues ControlSettingsScreen-Objekt und initialisiert dieses mit einem Knot3Game-Objekt. /// </summary> public ControlSettingsScreen(GameCore game) : base(game) { MenuName = "Controls"; // Die statischen Initialierer der folgenden Inputhandler müssen geladen sein, egal, ob der User bereits // im Spiel war oder nicht, denn davon hängt es ab, ob sie bereits auf natürliche Weise initialiert wurden. // Falls das nicht der Fall ist, rufen wir über Reflection den statischen Initialierer auf, ohne die Klassen // sonst irgendwie anzutasten. Das ist sauberer als eine statische Methode statt des Initialierers zu verwenden, // da man diese an vielen Stellen aufrufen müsste, nur um den sehr unwahrscheinlichen Fall, dass noch nichts // initialisiert ist, abzudecken. Die statischen Initialisierer hingegen werden von der Laufzeitumgebung // in allen Fällen bis auf genau diesen hier im Einstellungsmenü automatisch aufgerufen. KeyBindingListener.InitializeListeners ( typeof (InputManager), typeof (KnotInputHandler), typeof (EdgeColoring), typeof (EdgeRectangles) ); // Lade die Standardbelegung Dictionary<PlayerAction, Keys> defaultReversed = KeyBindingListener.DefaultKeyAssignment.ReverseDictionary (); // Iteriere dazu über alle gültigen PlayerActions... foreach (PlayerAction action in PlayerAction.Values) { string actionName = action.Name; if (defaultReversed.ContainsKey (action)) { // Erstelle das dazugehörige Options-Objekt... KeyOption option = new KeyOption ( section: "controls", name: actionName, defaultValue: defaultReversed [action], configFile: Config.Default ); // Erstelle ein KeyInputItem zum Festlegen der Tastenbelegung KeyInputItem item = new KeyInputItem ( screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, text: actionName, option: option ); item.OnValueChanged += () => KeyBindingListener.ControlSettingsChanged (); // Füge es in das Menü ein settingsMenu.Add (item); } else { Log.Debug ("Key binding ", actionName, " not found!"); } } }
/// <summary> /// Wird ausgeführt, sobald ein KeyBindingListener erstellt wird und danach, /// wenn sich die Tastenbelegung geändert hat. /// </summary> public static void ReadKeyAssignments() { // Drehe die Zuordnung um; von (Taste -> Aktion) zu (Aktion -> Taste) Dictionary<PlayerAction, Keys> defaultReversed = DefaultKeyAssignment.ReverseDictionary (); // Leere die aktuelle Zuordnung CurrentKeyAssignment.Clear (); // Fülle die aktuelle Zuordnung mit aus der Einstellungsdatei gelesenen werten. // Iteriere dazu über alle gültigen PlayerActions... foreach (PlayerAction action in PlayerAction.Values) { string actionName = action.Name; if (defaultReversed.ContainsKey (action)) { // Erstelle eine Option... KeyOption option = new KeyOption ( section: "controls", name: actionName, defaultValue: defaultReversed [action], configFile: Config.Default ) { Verbose = false }; // und lese den Wert aus und speichere ihn in der Zuordnung. CurrentKeyAssignment [option.Value] = action; } } CurrentKeyAssignmentReversed = CurrentKeyAssignment.ReverseDictionary (); }
/// <summary> /// Erzeugt ein neues CheckBoxItem-Objekt und initialisiert dieses mit dem zugehörigen IGameScreen-Objekt. /// Zudem sind Angaben zur Zeichenreihenfolge und der Eingabeoption Pflicht. /// </summary> public KeyInputItem(IScreen screen, DisplayLayer drawOrder, string text, KeyOption option) : base(screen, drawOrder, text, (option as DistinctOption).Value) { this.option = option; }