我最近发现了winBGIm库,并且发现学习代码非常有用,因此我开始创建一些东西以进行一些练习,但是我被程序所困扰。
该程序应显示一个小球和两个接近球自身的矩形,并且玩家只需按键盘上的按钮即可上下移动球。最初,我主要编写了所有内容以使其快速运行,但是由于这太糟糕了,我将程序分为功能。
首先,即使所有的东西都在一起,getch函数似乎也不起作用,因为尽管它应该擦除kbhit函数的输入缓冲区,但它却使球根本无法移动,而仅仅kbhit函数起作用了,但是很麻烦即使您停止按某个键,球仍继续上升。我在另一个纯文本程序中使用了相同的过程,但效果很好,所以我不知道问题出在哪里。
第二个也是最重要的问题是,在将程序拆分为功能后,它变成了静态的,因为将使图形移动的主循环在第一次迭代的末尾停止。仅当我在循环结束时删除cleardevice函数并且在initwindow函数中禁用了双重缓冲后,它才能重新开始工作,但是我无法理解这些东西之间的关系。
最后,当我设置新的背景色时,如果它不是0(黑色),则窗口将保持完全黑色。
我希望有一个人可以帮助我。
最好的问候,贾科莫。
#include <graphics.h>
#include <time.h>
#include <stdio.h>
int rettangoli(int b);
void bird(int x_default, int y_default);
void bird();
int main() {
int a=640;
int b=480;
int x_default=150;
int y_default=400;
int verifica=0;
srand(time(NULL));
initwindow(a, b, "BGI", 0, 0, true, true);
setbkcolor(0);
while(1) {
bird(x_default, y_default);
verifica=rettangoli(b);
if(verifica==1) {
outtextxy(0, 0, "HAI PERSO");
outtextxy(0,20, "PREMERE UN TASTO PER CONTINUARE");
break;
}
delay(50);
while(kbhit()) {
getch();
}
swapbuffers();
cleardevice();
}
delay(350);
getch();
closegraph();
return 0;
}
void bird(int x_default, int y_default) {
static int x_pos=x_default;
static int y_pos=y_default;
if(kbhit()) {
if(y_pos-16>0)
y_pos=y_pos-5;
circle(x_pos, y_pos, 16);
setfillstyle(SOLID_FILL, YELLOW);
floodfill(x_pos, y_pos, 15);
}
else {
while(y_pos<400)
y_pos=y_pos+15;
circle(x_pos, y_pos, 16);
setfillstyle(SOLID_FILL, YELLOW);
floodfill(x_pos, y_pos, 15);
}
return;
}
int rettangoli(int b) {
static int x_rett=615;
int verifica=0;
int contatore;
int altezza;
if(x_rett==615)
altezza=rand()%(b-60)+1;
rectangle(x_rett, 0, x_rett+25, altezza);
rectangle(x_rett, altezza+60, x_rett+25, 480);
setfillstyle(SOLID_FILL, GREEN);
floodfill(x_rett+1, 1, 15);
floodfill(x_rett+1, 479, 15);
for(contatore=0;contatore<altezza && x_rett>100;contatore++) {
if(getpixel(x_rett-1, contatore)!=getbkcolor())
verifica=1;
}
for(contatore=altezza+60;contatore<b && x_rett>100;contatore++) {
if(getpixel(x_rett-1, contatore)!=getbkcolor())
verifica=1;
}
for(contatore=0;contatore<15;contatore++) {
if(getpixel(contatore, altezza)!=getbkcolor())
verifica=1;
}
for(contatore=0;contatore<15;contatore++) {
if(getpixel(contatore, altezza+60)!=getbkcolor())
verifica=1;
}
x_rett=x_rett-5;
printf("%i", x_rett);
return verifica;
}
最佳答案
没关系,我自己解决了这个问题。 Windows 8 x64与Codeblocks-EP之间存在不兼容性问题,我认为winBGIm与x64系统之间存在普遍的不兼容性。
我使用Vmware Player和Windows XP x86创建了一个虚拟机,现在一切正常。
关于c - 陷入C与winBGIm编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21883762/