1

私はXNAが初めてです。レベルエディタが必要なゲームを作っています。レベル名とその説明を取得するには、テキスト ボックスが必要です。そこで、次のようなコードを書きました。

if (isSaveBox)
        {
            KeyboardState ks = Keyboard.GetState();
            Keys[] keys = ks.GetPressedKeys();
            Keys tempKey = Keys.None;

            foreach (Keys key in keys)
            {
                Keys currentKey = key;
                if (ks.IsKeyUp(lastKey))
                {
                    string toadd = key.ToString();
                    if (!(key == Keys.None) && key != Keys.Space && key != Keys.Back && key != Keys.Enter)
                    {
                        levelName += toadd;
                    }
                    else if (key == Keys.Space)
                    {
                        levelName += " ";
                    }
                    else if (key == Keys.Back)
                    {
                        levelName.Remove(levelName.Length - 1);
                        lastKey = currentKey;
                    }
                }
                if (currentKey != Keys.None && ks.IsKeyDown(currentKey))
                {
                    tempKey = currentKey;
                }
            }

            lastKey = tempKey;
            message = "Save level" + "\n" + "Enter - yes / Esc - no" + "\n" + levelName;

しかし、いくつかの文字を入力しようとすると、文字列に追加されませんlevelName。誰かがこれで私を助けることができますか?

4

2 に答える 2

3

私が知る限り、あなたのコードは正常に動作します。私はそれをいじって、いくつかの改善を加えました。あなたはいくつかのものを必要としませんでした. シンボルや大文字などの他のキーのサポートを追加したかったのですが、それは非常に長い switch ステートメントであるため、この記事を参照して簡単に実装できます。

さらにいくつかの変数を追加しました。テキストボックスに関連するものはすべて次のようになります

    Keys[] lastKeys;
    KeyboardState lastKeyboardState;

    public double timer;

    public string levelName;

currentKeyboardState必要に応じて、変数をグローバル変数として追加することもできます。

コードについては、コードを 2 回コピーする必要がないように 2 つのメソッドに分割しました。

if (isSaveBox)
{
    //Get the current keyboard state and keys that are pressed
    KeyboardState keyboardState = Keyboard.GetState();
    Keys[] keys = keyboardState.GetPressedKeys();

    foreach (Keys currentKey in keys)
    {
        if (currentKey != Keys.None)
        {
            //If we have pressed the same key twice, wait atleast 125ms before adding it again
            if (lastKeys.Contains(currentKey))
            {
                if ((gameTime.TotalGameTime.TotalMilliseconds - timer > 125))
                    HandleKey(gameTime, currentKey);
            }
            //If we press a new key, add it
            else if (!lastKeys.Contains(currentKey))
                HandleKey(gameTime, currentKey);
        }
    }

    //Save the last keys and pressed keys array
    lastKeyboardState = keyboardState;
    lastKeys = keys;
}

そして、タイマーをリセットし、実際に文字列を把握する方法 (これは、シフトやシンボルなどのコードを追加する場所です)

private void HandleKey(GameTime gameTime, Keys currentKey)
{
    string keyString = currentKey.ToString();
    if (currentKey == Keys.Space)
        levelName += " ";
    else if ((currentKey == Keys.Back || currentKey == Keys.Delete) && levelName.Length > 0)
        levelName = levelName.Remove(levelName.Length - 1);
    else if (currentKey == Keys.Enter)
        return;
    else
        levelName += keyString;
    //Set the timer to the current time
    timer = gameTime.TotalGameTime.TotalMilliseconds;
}

StringBuilderさらに最適化するために a を使用することもできます。

引き続き独自の UI を作成する場合は、先に進んでください。UI ライブラリを使用することを引き続きお勧めします (新しく復活したNeoforce Controlsを使用します) が、それについてはここでより大きな議論があります。

于 2013-06-26T14:32:17.927 に答える
1

フォーム要素、シーン マネージャー、その他の便利なものを含む XNA GUI フレームワークの 1 つを使用することをお勧めします。

あちらこちらを見

于 2013-06-26T12:57:04.590 に答える