Как использовать swapbuffers в Graphics.h

Поэтому я использую swapbuffers в этом коде, чтобы обновить его:

    #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:%d\tgridposy:%d\ttitlenumberx:%d\ttitlenumbery%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/

1 ответ

Я не уверен, какие библиотеки вы используете, но из названий функций, которые вы вызываете, похоже, что вы очищаете буфер цвета сразу после замены заднего буфера на передний буфер. Я не думаю, что это сработает. Кроме того, я буду также предполагать, что 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:%d\tgridposy:%d\ttitlenumberx:%d\ttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70);
    swapbuffers();
    // cleardevice(); // line of code removed
}

Изменить: я забыл объяснить изменения. То, как вы это делали, каждый раз, когда кадр отображался и показывался пользователю, он немедленно стирался cleardevice вызов. Перемещая cleardevice Обращаясь к началу цикла, вы очищаете старый кадр перед рендерингом и отображаете новый. Я должен признать, что это в основном догадки с моей стороны, потому что я не знаю, какие библиотеки вы используете.

Другие вопросы по тегам