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”。

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

4

3 回答 3

2

您不应该为游戏中的每个键都提供单独的文本文件。相反,您可以使用一个合适格式的文本文件(二进制、XML 等)并对其进行解析以获取所有关键信息(查找Serialization有关此的更多信息)。

假设Enum.Parse调用成功,您不需要添加前缀Keysto,moveleftkey因为它已经是一个Keys枚举。你可以这样称呼它

if (KeyboardState.IsKeyDown(moveleftkey))
于 2013-03-28T20:53:51.483 回答
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.Linq.XML

然后,Visual Studio 应该会帮助解决您的using陈述。但是,简而言之:

using System.Xml;
using System.Linq.Xml;
于 2013-03-28T20:52:27.887 回答
1

一旦你的枚举被解析(到moverightkeymoveleftkey变量中),你就不想在它们前面加上Keys. 仅当您直接访问特定的 Key 值时才需要这样做。请记住,Keys枚举代表键盘上的实际键。虽然有“A”键,但没有“左移”键。但是,您可以创建一个名为的变量moveleftkey并为其分配 value Keys.A

例如:

if (KeyboardState.IsKeyDown(moveleftkey)) 
{

}
于 2013-03-28T20:55:11.920 回答