用随机点生成的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]]






