2013-03-28 4 views
1

Я работал над методом изменения элементов управления для моей игры C#, используя строки, полученные из текстовых полей.Изменение элементов управления с помощью текстового поля

moverighttext = System.IO.File.ReadAllText(@"C:\Users\Public\TestFolder\moverighttext.txt"); 
movelefttext = System.IO.File.ReadAllText(@"C:\Users\Public\TestFolder\movelefttext.txt"); 

//I have the letter 'D' Stored in moverighttext.txt and the letter 'A' Stored in movelefttext.txt 

var moverightkey = (Keys)Enum.Parse(typeof(Keys), moverighttext); 
var moveleftkey = (Keys)Enum.Parse(typeof(Keys), movelefttext); 

if (KeyboardState.IsKeyDown(Keys.moveleftkey)) 
      if (KeyboardState.IsKeyDown(Keys.moverightkey)) 
      { 
       acceleration.X = 0; 
      } 

Это приводит к погрешности: - 'Microsoft.Xna.Framework.Input.Keys' не содержит определения для '' moveleftkey

'Microsoft.Xna.Framework.Input.Keys' делает не содержит определения для «moverightkey»

Я новичок в использовании таких вещей, как «Enum.Parse», но у меня создалось впечатление, что я добавил «moverightkey» и «moveleftkey» в качестве определений в «Microsoft». Xna.Framework.Input.Keys.

Я ищу, чтобы решить эти ошибки или найти правильный способ решения этой проблемы.

ответ

1

Keys - это перечисление, а moveleftkey не является одним из значений. Однако moveleftkey - после разбора - - значение перечисления (или должно быть).

Удалить Keys.moveleftkey и moverightkey и дайте это попробовать.

Я бы рекомендовал упростить назначение клавиш управления. Вам, разумеется, не нужно создавать несколько файлов.

Скопируйте следующий в файл Xml (control_keys.xml, например):

<?xml version="1.0" encoding="utf-8"?> 
<control_keys> 
    <move_left key="l"/> 
    <move_right key="r"/> 
    <!-- add more control keys --> 
</control_keys> 

нагрузки, что XML и получить Keys следующим образом: (см здесь для обучения, как использовать Linq-to-Xml)

var conrolKeys = XDocument.Load("control_keys.xml").Root; 
// now get your Keys text values 
var moveLeftText = controlKeys.Element("move_left").Attribute("key").Value; 
var moveRightText = controlKeys.Element("move_right").Attribute("key").Value; 
// now get your Keys values 
var moveLeftKey = (Keys)Enum.Parse(typeof(Keys), moveLeftText); 
var moveRightKey = (Keys)Enum.Parse(typeof(Keys), moveRightText); 

Редактировать в отношении пространств имен
Добавить ссылки проекта на:

  • System.Xml
  • System.Linq.Xml

Visual Studio должны затем помочь в решении ваших using заявления. Но, короче говоря:

using System.Xml; 
using System.Linq.Xml; 
+0

Отлично, что теперь работает. Благодарю. –

+0

О, вау, это действительно лучший способ сделать это. Я никогда не использовал .xml-файлы, но это потрясающе. –

+0

Есть и другие способы сделать то же самое, но я чувствовал, что «длинный путь» будет легче всего изучать. :) Рад помочь. – IAbstract

2

Вам не нужен отдельный текстовый файл для каждого ключа в игре. Вместо этого вы можете использовать один текстовый файл подходящего формата (Binary, XML и т. Д.) И проанализировать его, чтобы получить всю ключевую информацию (для получения дополнительной информации об этом обратитесь к Serialization).

Предполагая Enum.Parse вызов был успешным, вам не нужно префикс Keys к moveleftkey, потому что это уже Keys перечисление. Вы можете просто назвать это как этот

if (KeyboardState.IsKeyDown(moveleftkey)) 
+0

Спасибо за информацию о Serialization, я сразу же рассмотрю ее. –

1

После того, как у вас есть перечисления разобранных (в moverightkey и moveleftkey переменные), вы не хотите, чтобы префикс их с Keys.Это необходимо, только если вы напрямую обращаетесь к определенным значениям ключа. Помните, что перечисление Keys представляет собой фактические клавиши на клавиатуре. Хотя есть клавиша «A», клавиши «moveleft» нет. Однако вы можете создать переменную с именем moveleftkey и присвоить ей значение Keys.A.

.: например

if (KeyboardState.IsKeyDown(moveleftkey)) 
{ 

} 
Смежные вопросы