C语言游戏开发闪屏解决办法 | 您所在的位置:网站首页 › c语言隐藏光标有什么用 › C语言游戏开发闪屏解决办法 |
问题引入
基于C语言的游戏开发的动态画面往往是不断的刷新显示区来实现的,即不断地输入和清空。因为计算机的计算速度很快,所以在画面较小的情况下我不会觉得有闪屏或不流畅的体验。 但一旦要刷新的画面较大,是会闪瞎开发者的眼的! 比如下面这段代码 int main() { while(1){ for(int i=1;i printf("*"); } printf("\n"); } system("cls");} return 0; }如果这样做游戏的,用户的游戏体验可谓极差无比! 是什么原因使屏幕闪烁呢?我们在code中可以看出,我们的printf是一个一个打印符号的,他不能像easyx中整体打印一个图形。这也就导致我们每个位置出现的时间会有差异,所以打印得越多,闪烁就会越厉害。 解决方式一:局部改动(不推荐)既然我们将一个图形不断刷新会闪烁,那我们就改变局部把。有一些贪吃蛇程序是用到这一招,因为贪吃蛇会每一帧画面需要改动的地方相对较少,这样可以大大减弱我们感受到的闪烁。这种方法可以用改变光标的位置来实现。 但是! 这也只是治标不治本的方法,如果需要改动的地方过多,也同样会出现闪烁。所以这种办法仅限于贪吃蛇这类画面改动量较小的游戏。 解决方式二:双缓存(推荐)这也是本篇终点介绍的,这种方式的画面,不管有多少改变的地方,都只需要刷新一次画面即可。 我们先看一下我们控制台显示内容的过程 考虑到操作的一些方便,我们不继续用默认的缓冲区,我们新建两个缓冲区A和B,示意如下 在任何时候可以按0结束程序 /* * @Description: * @Autor: Kadia * @Date: 2020-05-18 22:03:18 * @LastEditors: Kadia * @connect: vx:ccz1354 qq:544692713 * @LastEditTime: 2020-05-19 12:22:14 */ #include #include #include #include #include char date[35][65]; int fxx[5]={0,1,-1,0,0}; int fxy[5]={0,0,0,-1,1}; HANDLE hOutput, hOutBuf; COORD coord = { 0,0 }; DWORD bytes = 0; void initconsoleScreenBuffer(); int show(char input); int main() { char input; initconsoleScreenBuffer(); while(1) { input=='0'; if(!show(input)) break; input=getch(); if(input=='0') break; } return 0; } void initconsoleScreenBuffer() { hOutBuf = CreateConsoleScreenBuffer( GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL ); hOutput = CreateConsoleScreenBuffer( GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL ); CONSOLE_CURSOR_INFO cci; cci.bVisible = 0; cci.dwSize = 1; SetConsoleCursorInfo(hOutput, &cci); SetConsoleCursorInfo(hOutBuf, &cci); for(int i=0;i date[i][j]='-'; if(i==15&&j==15) date[i][j]='W'; } } } int show(char input) { int toward; switch(input) { case 's' : toward=1;break; case 'w' : toward=2;break; case 'a' : toward=3;break; case 'd' : toward=4;break; default : toward=0;break; } for(int i=0;i if(date[i][j]=='W'&&i+fxx[toward]>=0&&i+fxx[toward]=0&&j+fxy[toward] coord.Y=i; WriteConsoleOutputCharacterA(hOutBuf,date[i],60,coord,&bytes); } SetConsoleActiveScreenBuffer(hOutBuf); input=getch(); if(input=='0') return 0; switch(input) { case 's' : toward=1;break; case 'w' : toward=2;break; case 'a' : toward=3;break; case 'd' : toward=4;break; default : toward=0;break; } for(int i=0;i if(date[i][j]=='W'&&i+fxx[toward]>=0&&i+fxx[toward]=0&&j+fxy[toward] coord.Y=i; WriteConsoleOutputCharacterA(hOutput,date[i],60,coord,&bytes); } SetConsoleActiveScreenBuffer(hOutput); return 1; } 完结(欢迎补充) |
CopyRight 2018-2019 实验室设备网 版权所有 |