这是我尝试移动使用DirectX 11 / 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 :(得分:0)
我发现GetAsyncKeyState
的{{3}}有点令人困惑。我认为official documentation可以更好地解释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 键是否被按下。
答案 1 :(得分: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);
}
这里的密钥是'q'或virtual key code 0x51。这就是你创建一个窗口并进行设置之后的全部内容。如果您需要完整的代码,请发表评论或与我联系。
答案 2 :(得分:0)
更多当前有效的代码VS2017
INT_PTR CALLBACK myModalessWindow(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_CHAR: //case sensitive
if ((char)wParam == 'A') Beep(2000, 250);
if ((char)wParam == 'b') Beep(2000, 250);
break;
case WM_KEYDOWN:
{
if (GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
Beep(2000, 250);
if (wParam == 'S') Beep(2000, 250); //Not case sensitive.
}
break;
}
}
答案 3 :(得分:0)
您可以使用allegro或sfml库,但需要一种快速解决方案:
#include iostream
using namespace std;
int main() {
char input;
cin >> input;
if (input == f)
{
//do something
}
return 0;
}
或者,如果您需要更多关键选项,则始终可以将if
语句替换为switch
语句。
如果您希望某些东西可以在整个程序中运行(例如,如果在程序执行过程中的任何时间,某人按下某些东西,将会发生某些事情,则需要了解多线程处理-请查看sfml)。