如何在Graphics.h中使用缓冲区
How to use swapbuffers in Graphics.h
所以atm im在这段代码中使用swapbuffer来刷新它:
#include "graphics.h"
void drawGridOnX(int xtotal, int ytotal);
int levelcode[400][45][100];
void decodelevelAndDraw();
void main() {
initwindow(1600, 900,"Testscreen",0,0,true,true);
int gridposx = 0, gridposy = 0, diffx = 0, diffy = 0, xtotal=0, ytotal = 0,distanceFromMouse=50;
while (1) {
setbkcolor(9);
ytotal = 0;
diffx = mousex() - gridposx;
while (gridposx < mousex()&&diffx>=70) {
gridposx += 70;
}
while (gridposx > mousex()&&diffx<=-70 + distanceFromMouse) {
gridposx =gridposx-70;
}
diffy = mousey() - gridposy;
while (gridposy < mousey() && diffy >= 70) {
gridposy += 70;
}
while (gridposy > mousey() && diffy <= -70+distanceFromMouse) {
gridposy = gridposy - 70;
}
while (ytotal < 900) {
drawGridOnX(xtotal, ytotal);
ytotal += 70;
}
if (WM_LBUTTONDOWN) {
levelcode[gridposx/70][gridposy/70][0]=1;
printf("CLICK");
}
decodelevelAndDraw();
readimagefile("question.bmp", gridposx,gridposy, 70+gridposx, 70+gridposy);
printf("gridposx:%dtgridposy:%dttitlenumberx:%dttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70);
swapbuffers();
cleardevice();
}
}
void drawGridOnX(int xtotal, int ytotal) {
while (xtotal < 1600) {
rectangle(xtotal, ytotal, 70 + xtotal, 70+ytotal);
xtotal += 70;
}
}
void decodelevelAndDraw() {
int x = 0, y = 0;
while (y != 12) {
while (x != 22) {
if (levelcode[x][y][1] == 1) {
readimagefile("question.bmp", x*70, y*70, 70 + x*70, 70 + y*70);
}
x++;
}
y++;
}
}
所以我在绘图过程结束时使用了它,然后使用了一个清晰的设备。当播放动画或在后台绘制某些东西(会被删除)时,这种方法有点过时。我不明白我该怎么用它。我知道它是用来双重缓冲的,它应该把预先生成的下一帧换成旧帧,但我看的地方都解释得很糟糕。我如何才能有效地使用缓冲区,这样我就可以在后台播放动画和绘制东西(就像我的程序应该在玩家左键点击时做的那样),而不会让它消失?
我正在使用这个网站上的图书馆http://winbgim.codecutter.org/
我不确定您使用的是什么库,但从您正在调用的函数的名称来看,在将后缓冲区与前缓冲区交换后,似乎正在清除颜色缓冲区。我认为这行不通。此外,我将进一步假设setbkcolor
函数设置将用于清除颜色缓冲区的颜色。我习惯于做实时图形的方式是这样的:
repeat {
// check for and handle user input
// set background color
// clear color buffer
// update scene information
// render the new scene
// swap the buffers
}
然而,在您的代码中,您似乎在交换后立即清除了颜色缓冲区,您的循环应该是这样的(更改已用注释标记):
while (1) {
setbkcolor(9);
cleardevice(); // line of code added
ytotal = 0;
diffx = mousex() - gridposx;
while (gridposx < mousex()&&diffx>=70) {
gridposx += 70;
}
while (gridposx > mousex()&&diffx<=-70 + distanceFromMouse) {
gridposx =gridposx-70;
}
diffy = mousey() - gridposy;
while (gridposy < mousey() && diffy >= 70) {
gridposy += 70;
}
while (gridposy > mousey() && diffy <= -70+distanceFromMouse) {
gridposy = gridposy - 70;
}
while (ytotal < 900) {
drawGridOnX(xtotal, ytotal);
ytotal += 70;
}
if (WM_LBUTTONDOWN) {
levelcode[gridposx/70][gridposy/70][0]=1;
printf("CLICK");
}
decodelevelAndDraw();
readimagefile("question.bmp", gridposx,gridposy, 70+gridposx, 70+gridposy);
printf("gridposx:%dtgridposy:%dttitlenumberx:%dttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70);
swapbuffers();
// cleardevice(); // line of code removed
}
编辑:我忘记解释这些变化了。按照您的操作方式,每次渲染并向用户显示帧时,它都会立即被cleardevice
调用擦除。通过将cleardevice
调用移动到循环的开头,可以在渲染和显示新帧之前清除旧帧。不过,我必须承认,这主要是我的猜测,因为我不知道你在使用哪些库。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何在Graphics.h中使用缓冲区