Поэтому я использую 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/
Я не уверен, какие библиотеки вы используете, но из названий функций, которые вы вызываете, похоже, что вы очищаете буфер цвета сразу после замены заднего буфера на передний буфер. Я не думаю, что это сработает. Кроме того, я буду также предполагать, что 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
Обращаясь к началу цикла, вы очищаете старый кадр перед рендерингом и отображаете новый. Я должен признать, что это в основном догадки с моей стороны, потому что я не знаю, какие библиотеки вы используете.
Других решений пока нет …