gpt4 book ai didi

c++ - 如何为我的 curses 应用程序关闭或忽略按键重复?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:29 24 4
gpt4 key购买 nike

所以我最近发现了 curses(特别是 PDcurses )并且我刚刚开始使用它。现在我正在尝试用它编写一个小型太空射击类型的游戏,到目前为止它在渲染和获取菜单类型输入方面运行良好,但现在当我进入游戏时,我注意到按键重复对 Action 类游戏。我需要能够按住键并在按下键的每一帧移动我的化身。我知道如何使用普通的 Win32 应用程序执行此操作,但我没有窗口,因此我没有 wndproc,我无法控制控制台接收的消息:/

我不认为这是 curses 可以处理的事情,但如果可以的话那就太棒了,我真的只是在寻找一个可以很好地处理 curses 的解决方法。

我试过 cbreak()、nodelay() 和 raw() 都无济于事。

附加信息:

  • Microsoft Visual Studio 2010 旗舰版
  • PDcurses 3.4,来自预构建的二进制文件
  • Windows 7 x64 旗舰版

最佳答案

这远非一个完整的解决方案,我不知道它将如何与 PDCurses 交互,但这是一种尝试:

总而言之,使用GetStdHandle() 获取控制台句柄,使用 SetConsoleMode() 将其配置为原始读取,然后使用 ReadConsoleInput() 一次读取一个键.我用 std::set跟踪当前按下的键,从而忽略重复。

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <cassert>
#include <set>

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
BOOL success;
success=GetConsoleMode(h, &mode);
assert(success);
mode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
mode |= ENABLE_WINDOW_INPUT;
success=SetConsoleMode(h, mode);
assert(success);

INPUT_RECORD buffer[10];
std::set<WORD> keys_down;
while (true)
{
DWORD count=0;
success=ReadConsoleInput(h, buffer, 10, &count);
if (!success)
{
continue;
}
for (size_t i=0;i<count;++i)
{
switch (buffer[i].EventType)
{
case KEY_EVENT:
{
WORD keycode=buffer[i].Event.KeyEvent.wVirtualKeyCode;
if (buffer[i].Event.KeyEvent.bKeyDown)
{
if (keys_down.find(keycode)==keys_down.end())
{
std::cout<<"Key down: "<<keycode<<std::endl;
keys_down.insert(keycode);
}
}
else
{
if (keys_down.find(keycode)!=keys_down.end())
{
std::cout<<"Key up:"<<keycode<<std::endl;
keys_down.erase(keycode);
}
}
break;
}
default:
break;
}
}
}
}

关于c++ - 如何为我的 curses 应用程序关闭或忽略按键重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com