如何读取多指令,使得人物斜向移动。

本人用的是 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。

感谢! :rose:

你现在的代码中使用 _getch() 来获取单个按键输入,如果你希望实现多按键的斜向移动,可能需要使用键盘状态来实现,GetKeyboardState是一个可以考虑的方法。该方法将返回键盘的状态,包括哪个键被按下。在 Windows 下,可以使用 <windows.h>库中的GetAsyncKeyState 函数来获取键盘按键的状态。

为了使代码更易读,可以定义几个变量来代表键盘的状态。例如,如果“w”被按下,则 wPressedtrue,否则为false。同样,aPressedsPresseddPressed 也可以表示其他按键的状态。

以下是对你的代码进行的一些修改,使其可以处理多个按键同时按下的情况:

#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

好了好了 :+1: