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」などを使用するのは初めてですが、「Microsoft.Xna.Framework.Input.Keys」の定義として「moverightkey」と「moveleftkey」を追加したという印象を受けました。

これらのエラーを解決するか、この問題を処理する正しい方法を見つけようとしています。

4

3 に答える 3

2

ゲームのキーごとに個別のテキスト ファイルは必要ありません。代わりに、適切な形式 (バイナリ、XML など) の 1 つのテキスト ファイルを使用し、それを解析してすべての重要な情報を取得できます (Serialization詳細については、こちらを参照してください)。

呼び出しが成功したと仮定すると、既に列挙型であるため、プレフィックスをEnum.Parse付ける必要はありません。このように呼び出すことができますKeysmoveleftkeyKeys

if (KeyboardState.IsKeyDown(moveleftkey))
于 2013-03-28T20:53:51.483 に答える
1

Keysは列挙型でmoveleftkeyあり、値の 1 つではありません。ただし、moveleftkey-解析後-列挙値です(またはそうあるべきです)。

Keys.先頭moveleftkeyの andを削除し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;
于 2013-03-28T20:52:27.887 に答える
1

moverightkey列挙型を (変数と変数に)解析したらmoveleftkey、接頭辞を付けたくありませんKeys。これは、特定のキー値に直接アクセスする場合にのみ必要です。Keys列挙型はキーボードの実際のキーを表すことに注意してください。「A」キーはありますが、「moveleft」キーはありません。ただし、という変数を作成しmoveleftkeyて、値を割り当てることはできますKeys.A

例えば:

if (KeyboardState.IsKeyDown(moveleftkey)) 
{

}
于 2013-03-28T20:55:11.920 に答える