0

私は奇妙な問題を抱えています。それは明らかにXNAゲームプログラマーとしての私の新しいステータスによるものですが、ここに行きます。非常にシンプルなKeyboardManagerクラスを作成しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace CrazyCoders.XYZ.Framework
{
    public class Keyboard
    {

        public KeyboardState previousState = Microsoft.Xna.Framework.Input.Keyboard.GetState();
        public KeyboardState newState;

        public void begin()
        {
            //Get the new state
            KeyboardState newState = Microsoft.Xna.Framework.Input.Keyboard.GetState();
        }

        public Keys[] detectKeyDowns()
        {
            return newState.GetPressedKeys().Except(previousState.GetPressedKeys()).ToArray();
        }

        public Keys[] detectKeyUps()
        {
            return previousState.GetPressedKeys().Except(newState.GetPressedKeys()).ToArray();
        }

        public void end()
        {
            //Save the new state for the next pass
            previousState = newState;
        }

    }
}

このクラスは、以前のキーボードの状態を保存し、begin()を呼び出すと新しいキーボードの状態を取得します。次に、newStateとpreviousStateを使用して、detectKeyDownsとdetectKeyUpsは配列の例外を計算し、実際に最近押されたものまたは押されていないものを返します。

問題は、物事が機能していないことです...

追加してみました

if (newState.IsKeyDown(Keys.I))
{
    Console.WriteLine(
}

newStateのフェッチが開始されて中断された直後は、正常に機能します。たとえば、「I」キーが押されていることがわかります。しかし、detectKeyDownsを呼び出すと、正しく除外されているように見えます。

私がここで間違っていることを皆さんは見ていますか?

4

1 に答える 1

1

あなたのbegin()メソッドでは、newState変数を再定義しています。行の先頭から「KeyboardState」を削除すると、すべてが機能し始めるはずです。

于 2012-06-25T01:41:42.160 に答える