[原创]如何编写自己的图形开发包 — 第二章 给你一个画点函数,你就能描绘整个世界! - 2.1
此文出至[url]www.[/url] 作者:孙靖[bold]第二章
给你一个画点函数,你就能描绘整个世界![/bold]
这句话相信很多朋友都觉得眼熟,我们论坛置顶贴“[原创]给我一个画点函数,我能描绘出整个世界!”由 —— 一笔苍穹编写也实实在在的介绍了利用各种开发包进行画点工作。而接下来,我们要做的不仅是如何去画点而是真实的自己创造一个画点函数。看到这里,有不有做上帝的感觉?肯定很激动吧。记得当年我是多么的激动,往事不堪回首!呵呵。
首先,简要的介绍画点具体是怎么一会事。真的,当初这个概念困扰了我很久,我还是那老办法。不懂?先记住。
我们现在画点最通用的方法就是直接往显存里写数据。大家体会这个‘写’字,说白了就是给某个显存位置输入一个数值,那么显示器上就会有个对应的效果出来。要问具体硬件怎么实现的?呵呵,对不起我也不知道,那是硬件工程师的事情。虽然我提倡刨根问底但也要讲用在具体问题上。就本文介绍的内容,我想目前讨论的就够底啦,在底就吃不消啦。
代码:
UINT8 far *VideoBuffer=(UINT8 far *)0xA0000000; /* 定义画点函数的远指针 – 全局变量 */
看就只一行就可以基本完成我们画点的梦想。查看chap02-main1实例:
#include "GrTry.c"
int main()
{
INT16 i, OldMade = GetSVGAMode();
SetSVGAMode(TRY320X200X256); /* 实现图形初始化 */
for (i = 0; i < 256; i++) /* 往显存写入数据 */
VideoBuffer[i] = 100;
getch();
SetSVGAMode(OldMade); /* 恢复原始的模式 */
}
其效果如图2.1:
图2.1 写显存效果
如上代码,我们写了VideoBuffer[0] – VideoBuffer[255] 共256个数据,其值都是100。可以看到上面的效果出现一个淡天蓝色的线条。有心的朋友一定明白了,原来画点就是给我们定义的ViderBuffer 指向的位置写必要的数据。下面我们来做个函数封装做个真正意义上的画点函数。
代码:
void Dot(INT16 x, INT16 y, UINT8 color); /* 画点函数 */
void Dot(INT16 x, INT16 y, UINT8 color)
{
VideoBuffer[y*320+x] = color;
}
看,我们的画点函数出来了。由于什么现在使用的320X200的分辨率,那么一行有320个点。所以上面代码中“y*320+x”我想不用我多解释了吧?
好的,我们将图2.1对应的代码稍做改动。请查看Chap02-main2:
代码:
#include "GrTry.c"
int main()
{
INT16 i, OldMade = GetSVGAMode();
SetSVGAMode(TRY320X200X256); /* 实现图形初始化 */
for (i = 0; i < 100; i++) /* 利用画点函数画点 */
Dot(i, i, i);
getch();
SetSVGAMode(OldMade); /* 恢复原始的模式 */
}
效果如图2.2:
图2.2 调用画点函数效果
是不是很神奇?我们绘制了一条色彩绚烂的线条,也许这个效果您随便用其他的图形包都可以实现,可这却是实实在在我们自己动手建立的画点函数实现的。是不是很有成就感?
好啦,有成就感之后,我们还是要思考一些问题的。我们实现的是8位色深模式,即我们现在看到的图形模式在颜色值上有0-255共256种颜色。也就是说,在显存里一个字节(8位)纪录当前位置的颜色。所以我们之前定义的VideoBuffer为(UINT8 *)类型,恰好VideoBuffer[1]就可以表示一个像素点位置。请先记住这段介绍,这很重要因为除了我们所见的模式,你还可能有兴趣去实现其他图形模式,比如16位模式。那么在定义指向显存首地址的VideoBuffer的类型就值得注意啦,要自己去斟酌。
除此之外,我们应该还要想到:
1. 在320X200分辨率下,最大的显存位置应该就是右下角 (319, 199) 所以在此分辨率下我们应该保证我们的Dot()函数要排除输入范围无效的情况。
2. 我们实现的是8位色深模式,颜色值在0-255。所以你如果填写一个大于255的值,毫无疑问将会溢出。即你若填写256的颜色值,实际效果是溢出为0。当然,这样我们的Dot()函数并不会出错,只是你自己要清楚的知道此种情况。
3. 我们尝试一下其他分辨率模式是否也是这样的效果呢?
下一小节,我们将就上面提出的疑问来实验,你将发现更多你还不了解的知识。
配套代码下载:
[[italic] 本帖最后由 jig 于 2008-1-21 17:43 编辑 [/italic]]
Code.rar
(1.24 MB)