2016-01-15 2 views
1

Вот моя попытка перемещения простой треугольник, нарисованный DirectX 11/C++:Как я прочитал ввод с клавиатуры в C++

int DrawAndMovePlayer(Renderer renderer) 
{ 
    Triangle triangle1(renderer); 
    float p1, p2, p3, p4, p5, p6; 
    float x, y; 
    x = 0.0f; 
    y = 0.0f; 

    if (GetAsyncKeyState(0x58)) 
    { 
     x = 1.0f; 
    } 

    //top 
    p1 = x + 0.0f; 
    p2 = y + 0.05f; 
    //Bottom Right 
    p3 = x + 0.05f; 
    p4 = y - 0.05f; 
    //Top 
    p5 = x - 0.05f; 
    p6 = y - 0.05f; 
    //Triangle triangle2(renderer); 
    triangle1.draw(renderer,p1,p2,p3,p4,p5,p6); 
    //triangle2.draw(renderer, -0.5f); 
    return 0; 
} 

Я попытался getch() функцию и функцию GetAsyncKeyState(), однако, треугольник никогда изменяет свою позицию. Треугольник нарисован вокруг центральной точки (x, y).

+0

Действительно ли треугольник не перемещается? Расстояние перемещения 1 может быть слишком маленьким, чтобы видеть. – MikeCAT

+1

LSB возвращаемого значения [function 'GetAsyncKeyState'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293%28v=vs.85%29.aspx) имеет другую информацию, поэтому вы должны использовать 'GetAsyncKeyState (0x58) & 0x8000', чтобы увидеть, нажата ли клавиша. – MikeCAT

+1

Вы можете использовать класс '' Keyboard'' в [DirectX Tool Kit] (https://github.com/Microsoft/DirectXTK). См. [Учебник] (https://github.com/Microsoft/DirectXTK/wiki/Mouse-and-keyboard-input). –

ответ

0

Я нахожу official documentation из GetAsyncKeyState немного запутанным. Я думаю, что this forum post дает лучшее объяснение о том, как GetAsyncKeyState работы:

GetAsyncKeyState возвращает 16-разрядное значение а. Верхний бит устанавливается, когда текущее состояние ключа в реальном времени указывает на то, что оно удерживается.

низкий бит устанавливается, когда ключ перешел из отпускаемого в нажатое состояние (например, при первом нажатии клавиши). Хотя документация MSDN указывает, что это не является надежным.

Значение всех остальных битов следует считать «неопределенным», и вы должны отбросить их. Я бы не рекомендовал считать, что они 0, потому что они могут быть не в будущей версии.

Это говорит ... вы НЕ должны искать абсолютные значения возврата. IE: проверка на -32767 неверна. Вместо этого, вы должны маскировать бит вы заинтересованы в:

if(GetAsyncKeyState(x) & 0x8000) 
{ 
    // high bit is set. Key is currently held down. 
} 
if(GetAsyncKeyState(x) & 0x0001) 
{ 
    // low bit is set. Key just transitioned from released to pressed. 
} 

Таким образом, эта рекомендация совпадает одна дается @MikeCAT в комментариях: Вы должны использовать GetAsyncKeyState(0x58) & 0x8000, чтобы увидеть, если ключ X нажата.

0

Здесь вы идете! Мне потребовалось некоторое время, чтобы понять это на Microsoft Visual Studio 2015, но здесь это: MSG message; message.message = WM_NULL; while (message.message != WM_QUIT) { while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { //make a class file for this or somthing so when it's HUGE it won't be obtrusive... i mean REALLY. if (message.message == WM_KEYDOWN) { if (GetAsyncKeyState(0x51) == 0x0001); { OutputDebugString("key pressed \n"); pressed = true; } } if (message.message == WM_KEYUP) { if (GetAsyncKeyState(0x51) != 0x0000); { OutputDebugString("key unpressed"); pressed = false; } } DispatchMessage(&message); }

ключ в вопросе здесь быть «д» или virtual key code 0x51. и это все после создания окна и настройки. если вы хотите получить полный код, прокомментируйте или свяжитесь со мной.

+0

проверить, что, если (GetAsyncKeyState (0x51)! = 0x0000), операторы всегда возвращают true ... все еще работают над ним – mrsamsir

Смежные вопросы