使用文本框更改控件

时间:2013-03-28 20:48:06

标签: c# input xna

我一直在研究一种使用从文本框派生的字符串来更改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'的定义。

我正在寻找解决这些错误或找到正确处理此问题的方法。

3 个答案:

答案 0 :(得分:2)

游戏中的每个键都不需要单独的文本文件。相反,您可以使用一个合适格式的文本文件(Binary,XML等..)并解析它以获取所有关键信息(查找Serialization以获取更多相关信息)。

假设Enum.Parse来电成功,您无需将Keys添加到moveleftkey前缀,因为它已经是Keys枚举。你可以这样称呼它

if (KeyboardState.IsKeyDown(moveleftkey))

答案 1 :(得分:1)

Keys是一个枚举,而moveleftkey不是其中一个值。但是,moveleftkey - 解析后 - 枚举值(或应该是)。

删除Keys.前置moveleftkeymoverightkey并试一试。

我还建议您简化控制键的分配。您当然不需要创建多个文件。

将以下内容复制到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;

答案 2 :(得分:1)

解析完您的枚举后(进入moverightkeymoveleftkey变量),您不希望在Keys前添加前缀。只有在直接访问特定Key值时才需要这样做。请记住,Keys枚举代表键盘上的实际键。虽然有一个“A”键,但没有“moveleft”键。但是,您可以创建一个名为moveleftkey的变量,并为其指定值Keys.A

e.g:

if (KeyboardState.IsKeyDown(moveleftkey)) 
{

}