Eureka
1
本人用的是 easyx 图形库 vs2022,起初是想用 getch() 读取,结果发现读取一个信号后就只会有一个信号。
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include <math.h>
#define x1Speed 1
#define y1Speed 1
struct Player {
int x=0;
int y=0;
}player1;
void initPlayer();
void player1Move(char m);
int main()
{
initgraph(1048, 720);
initPlayer();
setbkcolor(RED);
setfillcolor(BLUE);
cleardevice();
circle(player1.x, player1.y, 3);
while (1) {
player1Move(_getch());
player1Move(_kbhit());
}
//关闭窗口,closegraph();
return 0;
}
//位置坐标初始化
void initPlayer() {
player1.x = 500;
player1.y = 500;
}
//人物移动 z
void player1Move(char m) {
if (m == 'd') {
player1.x += x1Speed;
circle(player1.x, player1.y, 3);
player1.x += x1Speed;
circle(player1.x, player1.y, 3);
player1.x += x1Speed;
circle(player1.x, player1.y, 3);
}
else if (m == 'a') {
player1.x -= x1Speed;
circle(player1.x, player1.y, 3);
player1.x -= x1Speed;
circle(player1.x, player1.y, 3);
player1.x -= x1Speed;
circle(player1.x, player1.y, 3);
}
else if (m == 'w') {
player1.y -= y1Speed;
circle(player1.x, player1.y, 3);
player1.y -= y1Speed;
circle(player1.x, player1.y, 3);
player1.y -= y1Speed;
circle(player1.x, player1.y, 3);
}
else if (m == 's') {
player1.y += y1Speed;
circle(player1.x, player1.y, 3);
player1.y += y1Speed;
circle(player1.x, player1.y, 3);
player1.y += y1Speed;
circle(player1.x, player1.y, 3);
}
else if (m == 'z') {
closegraph();
exit(0);
}
}
可以把代码放在一对 ``` 包裹的代码块里面以获得高亮:
```c
#include<stdio.h>
```
在第一个 ``` 后面加语言名,比如这里是 C 那就用```c。
chatgpt
(ChatGPT)
4
你现在的代码中使用 _getch()
来获取单个按键输入,如果你希望实现多按键的斜向移动,可能需要使用键盘状态来实现,GetKeyboardState
是一个可以考虑的方法。该方法将返回键盘的状态,包括哪个键被按下。在 Windows 下,可以使用 <windows.h>
库中的GetAsyncKeyState
函数来获取键盘按键的状态。
为了使代码更易读,可以定义几个变量来代表键盘的状态。例如,如果“w”被按下,则 wPressed
为true
,否则为false
。同样,aPressed
,sPressed
和dPressed
也可以表示其他按键的状态。
以下是对你的代码进行的一些修改,使其可以处理多个按键同时按下的情况:
#include <windows.h>
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define x1Speed 1
#define y1Speed 1
struct Player {
int x = 0;
int y = 0;
}player1;
void initPlayer();
void player1Move();
int main()
{
initgraph(1048, 720);
initPlayer();
setbkcolor(RED);
setfillcolor(BLUE);
cleardevice();
circle(player1.x, player1.y, 3);
while (1) {
player1Move();
}
return 0;
}
void initPlayer() {
player1.x = 500;
player1.y = 500;
}
void player1Move() {
if (GetAsyncKeyState('D')) {
player1.x += x1Speed;
circle(player1.x, player1.y, 3);
}
if (GetAsyncKeyState('A')) {
player1.x -= x1Speed;
circle(player1.x, player1.y, 3);
}
if (GetAsyncKeyState('W')) {
player1.y -= y1Speed;
circle(player1.x, player1.y, 3);
}
if (GetAsyncKeyState('S')) {
player1.y += y1Speed;
circle(player1.x, player1.y, 3);
}
if (GetAsyncKeyState('Z')) {
closegraph();
exit(0);
}
}
请注意,GetAsyncKeyState
函数会检查某键是否被按下,不管它在调用函数之前或之后是否已被释放。这就是为什么它可以处理多个按键同时按下的情况。
另外需要注意的是,GetAsyncKeyState
函数的参数是键盘按键的虚拟键码。因为键码是大小写敏感的,所以需要按照键码大小写敏感的特点来设置按键。例如,GetAsyncKeyState('A')
表示按下"A"键,而 GetAsyncKeyState('a')
表示按下"a"键。
1 Like