Articles of 键盘

如何检测相同的键盘按键只有一次

我正在devise一个可以检测键盘按键的键盘类,但是我仍然无法想出办法。 我的目标只是在同一按键同时按下两个动作键的同时按住或保持不动,而只执行一次动作。 例如,当我一直按住A键时,动作1只执行一次。 然后我继续按下或按住另一个键B,动作2也执行一次。 如果我同时按下A和B键,我不能执行任何操作。 在KeyboardClass头文件和cpp文件中有两个类,即KeyboardClientClass和KeyboardServerClass。 //////////////////////////////////////////////////////////////////////////////// // Filename: KeyboardClass.h //////////////////////////////////////////////////////////////////////////////// #ifndef _KEYBOARDCLASS_H_ #define _KEYBOARDCLASS_H_ //////////////////////////////////////////////////////////////////////////////// // Class prototype //////////////////////////////////////////////////////////////////////////////// class KeyboardServerClass; //////////////////////////////////////////////////////////////////////////////// // Class name: KeyboardClientClass //////////////////////////////////////////////////////////////////////////////// class KeyboardClientClass { public: KeyboardClientClass( const KeyboardServerClass& KeyboardServer ); ~KeyboardClientClass(); bool KeyIsPressed( unsigned char keycode ) const; bool KeyIsPressedOnce( unsigned char keycode ); private: unsigned char tempKeyCode; […]

多个键被按下,有些被忽略的SDL

我正在制作一个双人游戏克隆,我的问题是,当第二个玩家同时按下他/她的两个button时,第一个玩家locking并且不能移动,尽管当玩家这样做的时候这不会发生。 这几乎是我在这个克隆中的最后一个问题,所以我想处理它,所以我可以继续新的东西。 采用按键的代码如下所示: void Paddle::events() { //press if (player == 1) { Uint8 *keystates = SDL_GetKeyState(NULL); if (keystates[SDLK_o] == 1) { yVel = -200; return; } if (keystates[SDLK_k] == 1) { yVel = 200; return; } } if (player == 2) { Uint8 *keystates = SDL_GetKeyState(NULL); if (keystates[SDLK_w] == 1) { yVel = -200; return; […]

如何检查keyReleasedcallback之间的密钥版本?

Slick2D的Input类有一个isKeyPressed()方法,根据指定的键是否被按isKeyPressed()返回一个布尔值。 我想检查一个密钥是否以同样的方式被释放。 我看着添加一个KeyListener到input对象,并覆盖keyReleased()方法。 然而,因为我目前正在处理BasicGame的update()方法中的input,所以我将通过在两个不同的地方处理input来破坏我的代码,这是我想避免的。

使用C ++中的SDL引用键盘按键“justPressed”,“pressed”和“justReleased”

我正在C ++中用OpenGL和SDL教自己的3Dgraphics。 我在一个点,我需要能够查询个别键的状态,如下所示: if (InputManager::justPressed(SDLK_UP)) {} if (InputManager::pressed(SDLK_UP)) {} if (InputManager::justReleased(SDLK_UP) {} 我不知道是否应该使用SDL_GetKeyboardState或SDL_Keycode / SDL_Scancode布尔数组,使用状态似乎是我更正确的方法。 我以前在C#中用XNA实现了这一点( 参见这里 )。 但是我试图用SDL来复制这个问题一直没有成功。 方法1 – 使用SDL_GetKeyboardState // InputManager stores Uint8* _curKeys, _oldKeys; void InputManager::init() { _curKeys = SDL_GetKeyboardState(NULL); _oldKeys = new Uint8[sizeof(_curKeys)/sizeof(Uint8)]; } void InputManager::update() { memcpy(_oldKeys, _curKeys, sizeof(_curKeys)/sizeof(Uint8)); // this seems to work std::copy(std::begin(_curKeys), std::end(_oldKeys), std::begin(_curKeys)); } bool […]

键盘input与字符移动封装

在用c ++和sdl创建的游戏中,我们很难委托如何控制主角。 我们有一个键盘类和一个主角字符类,但不确定主字符是否应该有键盘类的实例,或者是否应该通过游戏循环完成键盘input。 如果你需要更多的信息,我会很乐意提供,在此先感谢您的帮助。

键盘input一次做两件事

在我的CheckKeyboard(Keys.Enter)中,当我只希望它做一个而另一个在下一个input点击时,它做了两件事,我想不出如何解决这个问题。 感谢高级,这里是相关的代码; enum CurrentState { Menu, NewGame, LevelSelect } private CurrentState _currentState = CurrentState.Menu; public void Update(GameTime gameTime, Game1 game) { keyboard = Keyboard.GetState(); switch (_currentState) { //Error- The name 'Menu' does not exist in the current context. case Menu: { } } prevKeyboard = keyboard; } public bool CheckKeyboard(Keys key) { return (keyboard.IsKeyUp(key) && […]

devise问题:如何更有效地处理input?

我正在devise一个系统来处理我的游戏的键盘input。 为了让它更简单,我有一个类有两个方法,KeyUp和KeyDown告诉我哪个键已被按下,这已经实现了我正在使用的库,现在我想有一个方法来发送该信息到正在处理input的类(我正在使用MCV模式,那些将是控制器)。 我想到了两种方法,这两种方法对我来说似乎都是有效的,我不知道哪一种更好,所以我问的是哪种方法是面向对象devise的最佳方法,有什么重大的影响,也是有效的。 我想到的第一种方法是让类接收input保持对所有控制器的引用,然后在类中触发按键事件时以类似于事件的方式调用这些控制器类的某些方法。 另一种方法是另一种方式,控制器持有对input处理程序类的引用,在这个devise中有一些数据结构(我想到一个EnumMap),它保存所有相关游戏键的状态,那么控制器类可能会使用一些getter来查询input处理程序的键(只是为了封装数据结构)。 所以,就是这样,我想要帮助一下如何做到这一点。 任何评论哪一个更好,或者一个新的devise可能比这更好,这是非常值得欢迎的。 提前致谢。

LWJGL – 连续的按键事件没有延迟

我正在检查按键,然后基于按下的按键,我正在屏幕上移动一个正方形。 我正在设置关键WASD的布尔值。 但是,每当我试图保持关键时,它需要一段时间,直到它不断移动(一个动作后只停半秒)任何方式来摆脱这一点,并使其“光滑”? 码: up = false; down = false; left = false; right = false; reset = false; while(Keyboard.next()){ if (Keyboard.getEventKeyState()) { if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)){ reset = false; } if(Keyboard.isKeyDown(Keyboard.KEY_W)){ up = true; } if(Keyboard.isKeyDown(Keyboard.KEY_S)){ down = true; } if(Keyboard.isKeyDown(Keyboard.KEY_A)){ left = true; } if(Keyboard.isKeyDown(Keyboard.KEY_D)){ right = true; } } }

奇怪的情况下,一个关键不工作

我用Java完成了一个游戏。 它在我的电脑上工作得很好。 发送给一个朋友。 在他的电脑上,出于某种原因,用来玩的钥匙在游戏中不起作用。 (它可以在任何其他环境下工作,如Web浏览器)。 他试着按下这个键,没有其他的按键。 仍然没有工作。 所以这不是一个“关键组合”问题。 我们都使用Windows和最新的JRE版本。 会是什么呢? 这真的很奇怪。 谢谢

在LWJGL中创建键盘/鼠标控件有什么替代方法?

所以我目前正在通过OpenGL教程,使用LWJGL来完成我所有的工作。然而当我开始了解如何访问这个库中的键盘和鼠标事件的时候,我偶然发现了这个小gem: public static void poll() 轮询键盘的当前状态。 使用isKeyDown方法访问轮询的值。 通过使用这种方法,如果不够快的轮询,就有可能“错过”键盘键 (来自http://www.lwjgl.org/javadoc/org/lwjgl/input/Keyboard.html#poll () ) 因此,为了使用缓冲input(作为LWJGL中的多个键盘/鼠标input检查的顶级答案调用它),你必须使用这个poll()方法。 这意味着无论我做什么,如果我使用LWJGL,我会错过按键。 我用这个代码做了一个testing: while(Keyboard.next()) { int character = Keyboard.getEventCharacter(); int key = Keyboard.getEventKey(); String charName= Keyboard.getKeyName(key); System.out.println(charName+""+character); } 同时按下buttonZXCV时,示例输出如下:Z122 V118 X120 C0 V0 Z0 正如你所看到的,在缓冲区中没有findCbutton和X释放。 在某些情况下,单次按键的缓冲区中都没有按键和释放。 我需要的不是这种情况,加快投票并不能解决问题(为什么甚至是解决scheme?)。 那么这个系统有什么select呢? (PS是同时按下这4个button在其他应用程序中正确logging)