关于用TC编程引用256色BMP图像的问题,急,希望高手不吝赐教。
正在用TC做一个飞行射击类的游戏, 写了一个用于调用图片的函数quoteimage(),在程序中调用这个函数可以成功,256色的BMP图像可以正确显示,但是运行这个函数结束之后就会马上跳出(无论后面是什么代码都会跳出,cleardevice()也会跳出,printf()也会跳出) 然后按alt+f5查看最后结果的时候出现下图,求问大神解答一下。谢谢了。如果方便的话可以加我的QQ1060896195。问过老师了,他说大概是内存写越界的问题,让我自己修改……
在百度上问过( http://zhidao.baidu.com/question/148351937.html )也没有结果。如果知道解决方法的话可以上去说,我在上面悬赏了200分的,解决了的话还会加。
1.我的系统是win7,所以是用dosbox来运行TC的,即使在XP系统下编译也是会出现一样的问题,所以应该是和系统无关的。
2.quoteimage()的代码我贴在图片下面。我调试过,发现: 我在调用这个函数之前就调用过一个InitializeGraph()函数来初始化图像(256色的VGA),然后如果我在quoteimage()函数后面再用InitializeGraph()函数初始化图像一次的话,那就不会跳出,后面的代码段也可以正常运行。
所以我觉得应该是qtimage()函数里面有些问题。
void InitializeGraph(void)
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=0x101;
int86(0x10,&r,&r);
}
quoteimage()代码如下:
#include "plane.h"
/*换页函数*/
#include "plane.h"
/*换页函数*/
void selectpage(register char page)
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; /*选择页面*/
int86(0x10,&r,&r);
}
/*设置调色板*/
void set_SVGA_palette(unsigned char r[], unsigned char g[], unsigned char b[])
{
int k;
for (k = 0; k < 256; k++) {
outportb(0x03C8,k);
outportb(0x03C9,r[k]>>2);
outportb(0x03C9,g[k]>>2);
outportb(0x03C9,b[k]>>2);
}
}
void quoteimage(char *imagefile)
{
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
unsigned char buffer[1024], r[256], g[256], b[256];
unsigned int width, height, linebytes;
long offset, position;
char page_new=0,page_old=0;
int i,j,k,n,savemode;
FILE *fp;
int COLS=640;
int ROWS=480;
if((fp=fopen(imagefile,"rb"))==NULL) /*判断打开文件是否正确*/
{
printf("error:Can't open file: %s",buffer);
exit(1);
}
if (fread((char *)&FileHeader, sizeof(FileHeader), 1, fp) != 1) {
printf("error: Can't read file header !\n"); /* 读文件头 */
exit(1);
}
if (FileHeader.bfType != 0X4D42) { /* BM */
fprintf(stderr, "error: Not a BMP file !\n");
exit(1);
}
if (fread((char *)&bmiHeader, sizeof(bmiHeader), 1, fp) != 1) {
fprintf(stderr, "error: Can't read bmiHeader !\n"); /* 读信息头 */
exit(1);
}
if (bmiHeader.biBitCount > 8) { /* 不能显示真彩色图像 */
fprintf(stderr, "error: Can not display ture color image !\n");
exit(1);
}
if (bmiHeader.biCompression != 0) { /* 不能处理压缩图像 */
fprintf(stderr, "error: Not non-compressed image !\n");
exit(1);
}
width = (unsigned int)bmiHeader.biWidth;
height = (unsigned int)bmiHeader.biHeight;
linebytes = ((width*(long)bmiHeader.biBitCount+31)/32)*4; /* 每行字节数--4的整数倍 */
if (fread((char *)&bmiColors[0], 4, 256, fp) != 256) { /* 读调色板数据 */
fprintf(stderr, "error: Can't get palette !\n");
return;
}
for (i = 0; i < 256; i++) {
r[i] = bmiColors[i].rgbRed;
g[i] = bmiColors[i].rgbGreen;
b[i] = bmiColors[i].rgbBlue;
}
set_SVGA_palette(r, g, b); /* 设置调色板 */
offset = FileHeader.bfOffBits;
fseek(fp, offset, SEEK_SET); /* 跳到位图数据的起始位置 */
for(j=height-1;j>=0;j--) {
fread(buffer,linebytes,1,fp);
for(i=0,n=0;i<width;i++,n++) {
position=j*(long)COLS+i; /*计算要显示点的显存位置*/
page_new=position/65536l; /*计算显示页*/
if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
{
selectpage(page_new);
page_old=page_new;
}
pokeb(0xa000,position%65536l,buffer[n]); /*写到显存位置*/
}
}
fclose(fp);
}