用随机点生成的24bit的彩霞效果(TC2.0)
下面的代码参考了其他人的代码(在这里我仅保留了一些对我需要的效果必要的部分。),所以有一部分注释是原来作者的注释。也有极少量是我自己的注释。这个程序在TC下运行,中断设置图形模式,向显存写入数据的方式控制显示输出。显存空间较大,因此不能一次性寻址,需要采用分页模式来对显存空间的当前页(显存的一部分)进行读写,用中断方式设置当前的显存页。具体细节不详细解释了。在下面的代码中只有一个函数是我写的,就是PutRandomPixels()函数,其他函数则来自原来作者。
下面的代码实现的是用随机点生存彩色云霞,生成一个随机点位置(x,y),然后用颜色计算函数计算出相应的颜色,用Dot24输出像素。效果截图略,代码如下:
程序代码:
/*********************************************************************************** * Description: 随机点生成的彩霞效果 * Author: hoodlum1980 & others(绘点,初始化,关闭图形模式等引用了其他作者的代码。) * Date: 2008.03.17 ************************************************************************************/ /*==============================对常用类型进行可移植性封装================================*/ typedef char INT8; typedef short INT16; typedef unsigned char UINT8; typedef unsigned long UINT32; #include <dos.h> #include <stdlib.h> /*============================== 几种图形模式宏 ================================*/ #define TRY320X200X256 0X013 #define TRY640X480X256 0X101 #define TRY800X600X256 0X103 #define TRY1024X768X256 0X105 #define TRY640X480X16B 0X111 #define TRY640X480X24B 0X112 UINT8 far *VideoBuffer = (UINT8 far *)0xA0000000; /* 定义画点函数的远指针,显存的起始地址 */ INT16 COLS, ROWS; /* 记录当前图形模式分辨率 */ INT16 OldSMode; /* 纪录原始模式 */ typedef struct tagRGBBMP /* 用于读取24B实际图像数据 */ { UINT8 r; UINT8 g; UINT8 b; } RGBBMP24; /*==========================================*/ /*以下是GrTry.C的内容*/ /* 设置好寄存器,并完成初始化 */ void SetSVGAMode(INT16 vmode) { switch (vmode) /* 记录当前的分辨率 */ { case TRY320X200X256: COLS = 320; ROWS = 200; break; case TRY640X480X24B: case TRY640X480X16B: case TRY640X480X256: COLS = 640; ROWS = 480; break; case TRY800X600X256: COLS = 800; ROWS = 600; break; case TRY1024X768X256: COLS = 1024; ROWS = 768; break; } _AX = 0x4f02; _BX = vmode; __int__(0x10); } /* 获取当前模式 */ INT16 GetSVGAMode() { _AX = 0x4f03; __int__(0x10); return _BX; } /* 图形初始化 */ void InitSVGA() { OldSMode = GetSVGAMode(); } /* 回到原来模式 */ void ExitSVGA() { SetSVGAMode(OldSMode); } /* 换页函数 */ void SelectPage(register UINT8 page) { _BX = 0; _DX = page; _AX = 0x4f05; __int__(0x10); } /*输出一个24bit颜色的像素,用指定RGB颜色 */ void Dot24(INT16 x, INT16 y, UINT32 *color) { static UINT8 OldPage = 0; UINT32 PageAll1, PageAll2; UINT8 NewPage; RGBBMP24 k; if (x > -1 && x < COLS && y > -1 && y < ROWS) { PageAll1 = PageAll2 = (UINT32)y*((UINT32)COLS*4)+((UINT32)x*4); NewPage = PageAll1 >> 16; if (NewPage != OldPage) { OldPage = NewPage; SelectPage(NewPage); } *((UINT32 far *)(VideoBuffer + PageAll2)) = *color; } } /*绘制随机的点*/ void PutRandomPixels(INT16 width,INT16 height) { UINT32 color; int x,y,r,g,b; while(!kbhit()) { x=random(width); y=random(height); r=(int)(255*(1-x*1.0/width)); g=(int)(255*(x*1.0/width)); b=(int)(255*(y*1.0/height)); color=r; color<<=8; color+=g; color<<=8; color+=b; Dot24(x,y,&color); } } int main() { InitSVGA(); /* 图形初始化开始 */ SetSVGAMode(TRY640X480X24B); /* 实现图形模式 */ PutRandomPixels(640,480); /* 放些随机点! */ ExitSVGA(); /* 恢复原始的模式 */ }
[[it] 本帖最后由 hoodlum1980 于 2008-3-18 00:41 编辑 [/it]]