| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 598 人关注过本帖
标题:用随机点生成的24bit的彩霞效果(TC2.0)
取消只看楼主 加入收藏
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
 问题点数:0 回复次数:0 
用随机点生成的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]]
搜索更多相关主题的帖子: 显存 彩霞 效果 随机 注释 
2008-03-17 18:32
快速回复:用随机点生成的24bit的彩霞效果(TC2.0)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016497 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved