gpt4 book ai didi

使用 WINAPI 的 C++ 输入

转载 作者:太空宇宙 更新时间:2023-11-04 15:49:14 26 4
gpt4 key购买 nike

好的,我正在 directx9 中制作一个简单的相机移动程序。我像这样从消息中获取输入:

        LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
switch (wParam & 0x7F)
{
case 'W':
WDown = true;
case 'A':
ADown = true;
case 'S':
SDown = true;
case 'D':
DDown = true;
}
case WM_KEYUP:
switch (wParam & 0x7F)
{

case 'W':
WDown = false;
case 'A':
ADown = false;
case 'S':
SDown = false;
case 'D':
DDown = false;
}
}
}

// Render Frame code:

void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d)
{
// Check Input
if(w)
m_camera.MoveForward(1);
else if(a)
m_camera.Strafe(-1);
else if(s)
m_camera.MoveForward(-1);
else if(d)
m_camera.Strafe(1);
}

super 简单吧?虽然我遗漏了很多其他代码,但它根本不会混淆这些 bool 值,因此不需要它们。好吧,现在问题来了。如果我使用此代码,它会完美运行。前是前,右是右,左是左,后是后。

问题是,我希望能够沿对角线移动。所以,显而易见的答案是摆脱 else 吧?嗯,我知道。

但是,程序变得困惑了!前进不前进!它没有做任何事情!向左向后,向后向右!唯一正确的就是正确的!巧合的是最后检查的输入!但是我一直一次按1个键,但它们还是坏了!发生了什么?我打破了 Visual Studio 吗?这个程序是否泄漏到另一个维度?这是怎么回事?!?

最佳答案

你忘了 switch case 上的“break”吗?

例子:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
switch (wParam & 0x7F)
{
case 'W':
WDown = true;
break;
case 'A':
ADown = true;
break;
case 'S':
SDown = true;
break;
case 'D':
DDown = true;
break;
}
break;
case WM_KEYUP:
switch (wParam & 0x7F)
{

case 'W':
WDown = false;
break;
case 'A':
ADown = false;
break;
case 'S':
SDown = false;
break;
case 'D':
DDown = false;
break;
}
}
break;
}

// Render Frame code:

void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d)
{
// Check Input
if(w)
m_camera.MoveForward(1);
if(a)
m_camera.Strafe(-1);
if(s)
m_camera.MoveForward(-1);
if(d)
m_camera.Strafe(1);
}

关于使用 WINAPI 的 C++ 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463175/

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