2

だから私は最近curses(特にPDcurses)を見つけました、そして私はちょうどそれに取り掛かっています。今、私はそれを使って小さなスペースシューティングタイプのゲームを書こうとしています。これまでのところ、レンダリングとメニュータイプの入力の取得には問題なく機能していますが、ゲームに入ると、キーの繰り返しがかなり悪いことに気づきました。アクションゲーム。キーを押したまま、キーが下がっているフレームごとにアバターを動かすことができる必要があります。通常のWin32アプリケーションでこれを行う方法は知っていますが、ウィンドウがないため、wndprocがなく、コンソールが受信するメッセージを制御できません:/

私はこれが呪いが処理できるものだとは思っていませんが、それが素晴らしいとしたら、私は本当に呪いとうまく機能する回避策を探していました。

私はcbreak()、nodelay()、raw()を試しましたが無駄になりました。

追加情報:

  • Microsoft Visual Studio 2010 Ultimate
  • ビルド済みのバイナリからのPDcurses3.4
  • Windows 7 x64 Ultimate
4

1 に答える 1

2

これは完全な解決策にはほど遠いものであり、PDCurses とどのように相互作用するかはわかりませんが、試みです:

要約すると、 でコンソールのハンドルを取得し、GetStdHandle()で生の読み取り用に設定し、 でSetConsoleMode()キーを 1 つずつ読み取りますReadConsoleInput()std::set現在押されているキーを追跡するためにa を使用しているため、繰り返しは無視されます。

#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;
            }
        }
    }
}
于 2012-02-02T02:15:13.080 に答える