处理游戏输入

时间:2012-08-26 20:19:18

标签: c# event-handling keypress slimdx

所以我在SlimDX中的基本2D游戏框架进展顺利。我已经创建了一个自定义的Sprite对象,并且对渲染精灵有一些基本的掌握。我现在只需要移动它们。

我有一个基本的游戏循环设置,它基于一个旧的C#游戏编程书。设置了所有图形设备位和bobs,并在屏幕上绘制了我的精灵后,我在我的Game类中输入了一个名为Run()的方法。其内容如下:

public void Run()
{

    while( this.Created )
    {
        // Process one frame of the game
        ProcessFrame();
        Render();
        // Handle all events
        Application.DoEvents();
    }
}

ProcessFrame()应该包含所有游戏逻辑,以响应事件。虽然我有一个简单的事件处理程序(基于覆盖OnKeyDown)设置来检测按键,但我想知道如何收集按键,以便我可以在ProcessFrame()方法中处理对它们的响应

关于此主题的一些初步研究建议创建一个HashSet<Keys>。我以前从未这样做过,所以我不确定我会怎么做。

有很多方法可以做到这一点,所以我想我会看到人们在跳到那里之前会推荐什么。

先谢谢大家。

1 个答案:

答案 0 :(得分:3)

我认为您不需要手动捕获输入。这通常由直接输入键盘类处理。我个人还没有自己使用SlimDX,但因为它是DirectX的包装器(我已经涉足过),你应该只需要初始化一个变量来保存对键盘的引用,这样你就可以轮询它的变化,然后根据这些变化采取行动。

http://slimdx.org/docs/#T_SlimDX_DirectInput_Keyboard

这样你就可以编写类似

的代码

if (myKeyboard.IsKeyDown(Keys.Escape)) { ProgramStatus = GameState.Title; }

假设我的引用变量名为myKeyboard。

编辑: 我可能还会提到,根据您使用的特定库,保存当前和以前的键盘状态可能是有益的。当你想确保程序只进行一次击键而不是多次击键时,这非常有用。

我记得XNA有一个控制器的KEYDOWN方法,用于测试按钮是否被按下。如果每次按下按钮都需要输入一个输入捕获两者。 IE如果你的库有Keypress方法,你的好,如果它只捕获KEYDOWN,你可能需要捕获当前和之前的。

 if (myMouse.LeftButton == ButtonState.Pressed && oldMouse.LeftButton == ButtonState.Released) 

if (myMouse.LeftButton == ButtonState.Pressed && oldMouse.LeftButton == ButtonState.Released)