所以我在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>
。我以前从未这样做过,所以我不确定我会怎么做。
有很多方法可以做到这一点,所以我想我会看到人们在跳到那里之前会推荐什么。
先谢谢大家。
答案 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)