问题标题: @沙宸安 高速输出函数

2
0
已解决
薛乘志
薛乘志
初级启示者
初级启示者

@沙宸安 

使用Win32API直接修改屏幕缓冲区,效率N倍

不好用API改的部分(几乎)全部改为了printf()

并添加了FPS显示部分代码(不过可能没用,因为现在的玩家移动速度惊人,是个BUG,不要直接删去:

if (clock() - ti >= 1000) {
	sprintf(tit, "XACRAFT 3.1 FPS:%d", int(pr_sum * 1.0 / ((clock() - ti) * 1.0 / 1000.0)));
	pr_sum = 0;
	ti = clock();
	SetConsoleTitleA(tit);
}

在我家电脑上FPS高达62(也许可以考虑把一个方块改成8个格子了)

防屏蔽词链接:https://pastebin.ubuntu.com/p/QHyHFd2NXb/

int cun(int com) {
	while (kd(char(13)));
	xuanze = 1;
	color(255);
	cls();
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTitleA("XACRAFT 3.1 FPS:null");
	char tit[1005] = {};
	clock_t ti = clock();
	int pr_sum = 0;
	while (!kd('P')) {
		cls();
		tims[com] += 1;
		if (tims[com] >= 10000) {
			days[com]++;
			tims[com] = 0;
		}
		if (tims[com] <= 5500) chuancan = 240;
		else if (tims[com] <= 6000) chuancan = 224;
		else if (tims[com] <= 9500) chuancan = 0;
		else chuancan = 224;
		if (tims[com] % 100 == 0) {
			jb += (1 + days[com]);
			emc += 1;
		}
		if (clock() - ti >= 1000) {
			sprintf(tit, "XACRAFT 3.1 FPS:%d", int(pr_sum * 1.0 / ((clock() - ti) * 1.0 / 1000.0)));
			pr_sum = 0;
			ti = clock();
			SetConsoleTitleA(tit);
		}
		int lines = 0;
		for (i = x[com] + 10; i >= x[com] - 10; i--) {
			char out[1005] = {};
			WORD col[1005] = {};
			char tmp[1005];
			int pos = 0;
			for (j = y[com] - 19; j <= y[com] + 19; j++) {
				if (i == -1 || j < 0 || j > 2048) {
					col[pos] = col[pos + 1] = 15;
					sprintf(tmp, "▓");
					out[pos] = tmp[0];
					out[pos + 1] = tmp[1];
					pos += 2;
					//color(15);
					//printf("▓");
				} else if (i != x[com] || j != y[com]) {
					if (bl[a[com][1][i][j]].hylink != 0) {
						if (bl[a[com][1][i][j]].hylink == 1) {
							col[pos] = col[pos + 1] = chuancan + bl[a[com][1][i][j]].cor;
							out[pos] = bl[a[com][1][i][j]].ape[0];
							out[pos + 1] = bl[a[com][1][i][j]].ape[1];
							pos += 2;
						}
						//centerlink(a[com][1][i][j]);
					} else {
						col[pos] = col[pos + 1] = bl[a[com][1][i][j]].cor;
						out[pos] = bl[a[com][1][i][j]].ape[0];
						out[pos + 1] = bl[a[com][1][i][j]].ape[1];
						pos += 2;
					}
					//print(a[com][1][i][j]);
				} else {
					col[pos] = col[pos + 1] = sehao;
					out[pos] = pfd[0];
					out[pos + 1] = pfd[1];
					pos += 2;
					//ppf(sehao);
				}
			}
			COORD coord = {0, lines++};
			DWORD writ;
			WriteConsoleOutputCharacterA(hOut, out, pos, coord, &writ);
			WriteConsoleOutputAttribute(hOut, col, pos, coord, &writ);
		}
		for (int i = 0; i <= 20; i++) {
			printf("\n");
		}
		if (x[com] <= 1) {
			x[com] = 1;
		}
		if (x[com] > 256) {
			x[com] = 256;
		}
		if (y[com] < 0) {
			y[com] = 0;
		}
		if (y[com] > 2048) {
			y[com] = 2048;
		}
		color(15);
		printf(">>状态栏 坐标: x:%d y:%d ", x[com], y[com]);
		color(15);
		printf(" 当前:");
		if (kn) {
			color(12);
			printf("**");
		} else {
			color(10);
			printf("建造");
		}
		color(15);
		printf("模式(J切换) P-保存并退出                 \n");
		color(7);
		int i, l, w;
		string str = "                               " + wri(hand[com][xuanze].ui) + "                               \n";
		w = 80;
		l = str.length();
		for (i = 0; i < (w - l) / 2; i++)
			printf(" ");
		printf(str.c_str());
		color(7);
		printf("\t\t\t       ");
		for (i = 1; i <= 9; i++) {
			color(7);
			if (hand[com][i].num != 0) {
				print(hand[com][i].ui);
			} else {
				printf("□");
			}
		}
		color(7);
		printf("                             \n\t\t\t       ");
		for (i = 1; i <= 9; i++) {
			if (i == xuanze) color(11);
			else color(7);
			if (hand[com][i].num != 0) {
				if (hand[com][i].num <= 64) printf("%02d", hand[com][i].num);
				else if (hand[com][i].num < 100) printf("%d+", hand[com][i].num % 100 / 10);
				else if (hand[com][i].num < 1000) printf("%d*", hand[com][i].num % 1000 / 100);
				else printf("%d^", hand[com][i].num % 10000 / 1000);
			} else {
				printf("--");
			}
		}
		printf("                             ");
		//Sleep(100);
		if (cmmd == '/') {
			cls();
			color(12);
			Line("命令");
			bool flag = 0;
			while (comd != "esc") {
				color(7);
				cout << "/";
				cin >> comd;
				if (comd == "tp") {
					cout << "/tp @s ";
					cin >> i >> j;
					flag = 1;
					x[com] = i;
					y[com] = j;
					comd = "esc";
				}
				if (!flag) {
					color(12);
					cout << ">>语法错误" << endl;
					color(7);
				}
			}
			comd = "?";
		}
		if (kd('E')) {
			while (kd('E')) {
			}
			packback(com);
			Sleep(100);
		}
		if (kd('W') && a[com][1][x[com] - 1][y[com]] != 0) {
			if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] == 0) && (a[com][1][x[com] + 3][y[com]] == 0)) {
				x[com] += 4;
			} else if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] == 0) && (a[com][1][x[com] + 3][y[com]] != 0)) {
				x[com] += 3;
			} else if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] != 0)) {
				x[com] += 2;
			}
		}
		//if(cmmd=='S' || cmmd=='s') x[com]--;
		if (a[com][1][x[com] - 1][y[com]] == 0) {
			Sleep(20);
			x[com]--;
		}
		if (kd('A')) {
			if (a[com][1][x[com]][y[com] - 1] == 0 && a[com][1][x[com] - 1][y[com] - 1] == 0) {
				x[com]--;
				y[com]--;
			} else if (a[com][1][x[com]][y[com] - 1] == 0 && a[com][1][x[com] - 1][y[com] - 1] != 0) {
				y[com]--;
			} else if (a[com][1][x[com]][y[com] - 1] != 0 && a[com][1][x[com] + 1][y[com] - 1] == 0 && a[com][1][x[com] + 1][y[com]] == 0) {
				x[com]++;
				y[com]--;
			}
		} //y[com]--;
		if (kd('D')) {
			if (a[com][1][x[com]][y[com] + 1] == 0 && a[com][1][x[com] - 1][y[com] + 1] == 0) {
				x[com]--;
				y[com]++;
			} else if (a[com][1][x[com]][y[com] + 1] == 0 && a[com][1][x[com] - 1][y[com] + 1] != 0) {
				y[com]++;
			} else if (a[com][1][x[com]][y[com] + 1] != 0 && a[com][1][x[com] + 1][y[com] + 1] == 0 && a[com][1][x[com] + 1][y[com]] == 0) {
				x[com]++;
				y[com]++;
			}
		} //y[com]++;
		if (kd('J')) {
			kn = !kn;
			while (kd('J')) {
			}
		}
		if (kd('1')) xuanze = 1;
		if (kd('2')) xuanze = 2;
		if (kd('3')) xuanze = 3;
		if (kd('4')) xuanze = 4;
		if (kd('5')) xuanze = 5;
		if (kd('6')) xuanze = 6;
		if (kd('7')) xuanze = 7;
		if (kd('8')) xuanze = 8;
		if (kd('9')) xuanze = 9;
		if (kd('Q') && a[com][1][x[com] + 1][y[com]] == 0 && /*a[com][1][x[com]-1][y[com]]!=0 &&*/ hand[com][xuanze].num != 0) {
			x[com]++;
			pt(com, 1, x[com] - 1, y[com], true);
		}
		if (kn) {
			if (kd('Y')) {
				//hand[com][a[com][1][x[com]+1][y[com]-1]]++;
				//a[com][1][x[com]+1][y[com]-1]=0;
				pt(com, 1, x[com] + 1, y[com] - 1, false);
			}
			if (kd('U')) {
				//hand[com][a[com][1][x[com]+1][y[com]]]++;
				//a[com][1][x[com]+1][y[com]]=0;
				pt(com, 1, x[com] + 1, y[com], false);
			}
			if (kd('I')) {
				//hand[com][a[com][1][x[com]+1][y[com]+1]]++;
				//a[com][1][x[com]+1][y[com]+1]=0;
				pt(com, 1, x[com] + 1, y[com] + 1, false);
			}
			if (kd('H')) {
				//hand[com][a[com][1][x[com]][y[com]-1]]++;
				//a[com][1][x[com]][y[com]-1]=0;
				pt(com, 1, x[com], y[com] - 1, false);
			}
			if (kd('K')) {
				//hand[com][a[com][1][x[com]][y[com]+1]]++;
				//a[com][1][x[com]][y[com]+1]=0;
				pt(com, 1, x[com], y[com] + 1, false);
			}
			if (kd('B')) {
				//hand[com][a[com][1][x[com]-1][y[com]-1]]++;
				//a[com][1][x[com]-1][y[com]-1]=0;
				pt(com, 1, x[com] - 1, y[com] - 1, false);
			}
			if (kd('N')) {
				//hand[com][a[com][1][x[com]-1][y[com]]]++;
				//a[com][1][x[com]-1][y[com]]=0;
				pt(com, 1, x[com] - 1, y[com], false);
			}
			if (kd('M')) {
				//hand[com][a[com][1][x[com]-1][y[com]+1]]++;
				//a[com][1][x[com]-1][y[com]+1]=0;
				pt(com, 1, x[com] - 1, y[com] + 1, false);
			}
		}
		if (!kn) {
			if (kd('Y')) {
				//hand[com][a[com][1][x[com]+1][y[com]-1]]++;
				//a[com][1][x[com]+1][y[com]-1]=0;
				pt(com, 1, x[com] + 1, y[com] - 1, true);
			}
			if (kd('U')) {
				//hand[com][a[com][1][x[com]+1][y[com]]]++;
				//a[com][1][x[com]+1][y[com]]=0;
				pt(com, 1, x[com] + 1, y[com], true);
			}
			if (kd('I')) {
				//hand[com][a[com][1][x[com]+1][y[com]+1]]++;
				//a[com][1][x[com]+1][y[com]+1]=0;
				pt(com, 1, x[com] + 1, y[com] + 1, true);
			}
			if (kd('H')) {
				//hand[com][a[com][1][x[com]][y[com]-1]]++;
				//a[com][1][x[com]][y[com]-1]=0;
				pt(com, 1, x[com], y[com] - 1, true);
			}
			if (kd('K')) {
				//hand[com][a[com][1][x[com]][y[com]+1]]++;
				//a[com][1][x[com]][y[com]+1]=0;
				pt(com, 1, x[com], y[com] + 1, true);
			}
			if (kd('B')) {
				//hand[com][a[com][1][x[com]-1][y[com]-1]]++;
				//a[com][1][x[com]-1][y[com]-1]=0;
				pt(com, 1, x[com] - 1, y[com] - 1, true);
			}
			if (kd('N')) {
				//hand[com][a[com][1][x[com]-1][y[com]]]++;
				//a[com][1][x[com]-1][y[com]]=0;
				pt(com, 1, x[com] - 1, y[com], true);
			}
			if (kd('M')) {
				//hand[com][a[com][1][x[com]-1][y[com]+1]]++;
				//a[com][1][x[com]-1][y[com]+1]=0;
				pt(com, 1, x[com] - 1, y[com] + 1, true);
			}
		}
		color(7);
		pr_sum++;
	}
	while (kd('P'));
	cmmd = '?';
	while (cmmd != 'P' && cmmd != 'p') {
		cmmd = getch();
	}
	cmmd = '?';
	return 0;
}

 

薛乘志在2021-12-29 21:04:34追加了内容

@沙宸安 

还有,我最近有了一个新的地形生成器思路,等我有时间来把思路发一下


0
已采纳
沙宸安
沙宸安
高级启示者
高级启示者

好的,我知道了,期末考试完后我来仔细研究。

我要回答