【发布时间】:2014-02-22 19:52:54
【问题描述】:
我正在开发一个可以更改键盘设置的游戏选项。所以,我想显示玩家改变的键。我有将包含虚拟键代码的 UCHAR 键转换为 std::string 的问题。似乎 GetKeyNameText() 只能将 UCHAR 转换为字符串,因为屏幕上没有显示任何字符串。我该如何解决这个问题?谢谢。
获取键盘消息
LRESULT Game::messageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (initialized) // do not process messages if not initialized
{
switch (msg)
{
case WM_KEYDOWN: case WM_SYSKEYDOWN: // key down
input->keyDown(wParam);
return 0;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam); // let Windows handle it
}
输入类
UCHAR key;
void Input::keyDown(WPARAM wParam)
{
// make sure key code is within buffer range
if (wParam < inputNS::KEYS_ARRAY_LEN)
{
keysDown[wParam] = true; // update keysDown array
// key has been "pressed, erased by clear()
keysPressed[wParam] = true; // update keysPressed array
key = wParam;
}
}
UCHAR getKeyPressed() { return key; }
游戏类
注意:已跳过代码详细信息。
// Key control
UCHAR vkeyUp;
UCHAR vkeyDown;
void GameContent::update()
{
if (buttonX == 220)
{
if (buttonY == 15)
{
if (input->anyKeyPressed()) {
vkeyUp = input->getKeyPressed();
buttonX = 10;
buttonY = 15;
}
}
else if (buttonY == 65)
{
if (input->anyKeyPressed()) {
vkeyDown = input->getKeyPressed();
buttonX = 10;
buttonY = 65;
}
}
}
button.setX(buttonX);
button.setY(buttonY);
}
void GameContent::render()
{
font.print("Move Up", 20, 20); font.print(input->getKeyPressedString(vkeyUp), 300, 20);
font.print("Move Down", 20, 70); font.print(input->getKeyPressedString(vkeyDown), 300, 70);
}
std::string Input::getKeyPressedString(UCHAR vkey)
{
std::string keyString;
TCHAR *lpszName = new TCHAR[256];
GetKeyNameText(vkey, lpszName, sizeof(lpszName));
keyString = *lpszName;
return keyString;
}
DirectX 字体类
int TextDX::print(const std::string &str, int x, int y)
{
if (dxFont == NULL)
return 0;
// Set font position
fontRect.top = y;
fontRect.left = x;
// Rotation center
D3DXVECTOR2 rCenter = D3DXVECTOR2((float)x, (float)y);
// Setup matrix to rotate text by angle
D3DXMatrixTransformation2D(&matrix, NULL, 0.0f, NULL, &rCenter, angle, NULL);
// Apply Matrix
graphics->getSprite()->SetTransform(&matrix);
return dxFont->DrawTextA(graphics->getSprite(), str.c_str(), -1, &fontRect, DT_LEFT, color);
}
【问题讨论】:
-
直到现在才检查 getKeyPressedString,但是:a) 为什么
*keyString = *lpszName;这将只复制一个字符... b) 你没有释放 lpszName。 c)您不检查 GetKeyNameText 的返回值 -
a) 更改为 keyString = lpszName; ? b) 使用免费(lpszName); ? c) 如何查看GetKeyNameText的返回值?
-
a) 是的。 b) 使用
delete lpszName;而不是 free,因为您使用的是 new 而不是 malloc。 -
c) 如何查看GetKeyNameText的返回值?
-
使用谷歌。 msdn.microsoft.com/en-us/library/windows/desktop/… 描述了发生错误时的值。 ...我会和大家一起回答...
标签: c++ windows winapi input directx