如何在Graphics.h中使用缓冲区

How to use swapbuffers in Graphics.h

本文关键字:缓冲区 Graphics      更新时间:2023-10-16

所以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调用移动到循环的开头,可以在渲染和显示新帧之前清除旧帧。不过,我必须承认,这主要是我的猜测,因为我不知道你在使用哪些库。