RockCarry 发表于 2007-10-3 16:16
[原创]我制作的图形库 RGE.Draw2D 发布
*/ --------------------------------------------------------------------------------------<br>*/ 出自: 编程中国 http://www.bc-cn.net<br>*/ 作者: RockCarry E-mail:rockcarry@163.com QQ:31951258<br>*/ 时间: 2007-10-3 编程论坛首发<br>*/ 声明: 尊重作者劳动,转载请保留本段文字<br>*/ --------------------------------------------------------------------------------------<br><br>本来说是国庆节发布的,但是家里面有点事所以迟到了。今天发布 RGE.Draw2D。<br>RGE 是我希望完成的一个游戏引擎,Draw2D 是 RGE 的一个组成部分,实现了 2D 的图形功能,目前已经完成的差不多了。<br>但是 Draw2D 距离真正的高性能的图形库还有相当长的路要走,其实 RGE.Draw2D,在许多方面做得并不好,所以这个作品是以交流和学习的目的展示给大家,希望我所作的一些工作能对大家有所帮助,也希望能将大家引入图形编程更深入的层面来,当然也许我做得并不好,所以我更加希望我的作品的发布,能起到抛砖引玉的作用,激起大家的热情,更多的发布自己的作品。<br>RGE 提供全部源代码,并附送一个点阵字库生成工具和一个精简版的 Turbo C 命令行编译器。<br>RGE 目前只能工作在 DOS 平台下,需要 Turbo C 编译器进行编译,以后可能会加入对 DJGPP 的支持。关于性能问题,由于实模式 DOS 程序的限制,RGE 采用了通用的页式内存架构,因此性能上损失很大。所以,我目前不 打算进行更多的优化。<br>以下是 RGE 的全部文件:<br>[attach]28475[/attach]<br><br><br> RockCarry<br> 2007-10-3<br><br><br><br>
[align=right][color=#000066][此贴子已经被作者于2007-10-3 16:22:26编辑过][/color][/align]
RockCarry 发表于 2007-10-3 16:16
<P>先占一楼</P>
RockCarry 发表于 2007-10-3 16:17
再占一楼
RockCarry 发表于 2007-10-3 16:18
占3楼
RockCarry 发表于 2007-10-3 16:18
现在还是国庆节<BR>没有迟到
kk4868 发表于 2007-10-3 16:23
<P>下完了,研究<EM>ing</EM></P>
奔跑的鸟 发表于 2007-10-3 20:12
RockCarry的作品啊,帮顶下,呵呵[em24]
leopardxp 发表于 2007-10-5 17:54
<P>学习![em01]</P>
leopardxp 发表于 2007-10-5 17:59
不过我发现RockCarry总喜欢用那张“me”的图片~呵呵[em02]
RockCarry 发表于 2007-10-5 21:15
me 很可爱的图片啊<BR>我好喜欢
ba_wang_mao 发表于 2007-10-8 08:46
不错,我先下载再说。<BR> 请问“RockCarry”,为什么REG不支持XMS扩展内存呢?
ba_wang_mao 发表于 2007-10-8 10:38
如果支持打点(Putpixel)时直接打到XMS内存中,然后再通过memcopy拷贝到显示缓冲区就非常完美了。
RockCarry 发表于 2007-10-8 17:12
说下存在的一些问题吧<BR>看过代码的人应该都清楚,其实这个库做得很偷懒,都没有写多少代码<BR>最大的问题可能就是速度的问题<BR>还有就是目前的绘图功能太弱,只有极少的几何图元,不支持线宽线型,不支持多边形填充<BR>而所谓的使用齐次变换矩阵进行几何变换,其实做得很垃圾,,而且由于运算精度没有多大的实用价值<BR>没有提供多边形填充、种子填充等等功能(包括模式填充和位图填充)<BR>没有提供反走样功能<BR>在外部的接口上设计的还算可以,但是内部实现时比较偷懒,在性能上考虑得比较少了
nwpu063417 发表于 2007-10-8 20:14
挺厉害的 支持一下[em01]
ba_wang_mao 发表于 2007-10-9 09:05
其实在MSDOS TC编译环境下如果能通过XMS实现申请800*600空间或者1024*768空间的双缓冲才是最实际的。
RockCarry 发表于 2007-10-9 09:22
我采用的是 EMS,目前已经可以支持大内存,并且要实现双缓冲也很容易。目前只能支持 640x480x256 的分辨率。<BR>使用 EMS 是因为常规内存、EMS 内存和页式的 VESA 显存,都可以抽象为页式内存,便于进行统一的管理。<BR>而使用 XMS 内存,则所有的内存操作都要经过 XMS 的功能调用来进行,使用起来会比较麻烦。
ba_wang_mao 发表于 2007-10-9 11:38
1、请问:为什么只能支持“640x480x256 的分辨率”呢?<BR>NEO SDK中只需要 #define VBE800X600X256 0x103<BR>然后调用如下图形初始化子程序,不就可以初始化为800*600*256色分辨率吗?<BR>我很想知道。<BR>2、我很想实现调用子程序Putpixel(x,y,color)时,不直接画到显存,而直接画到640*480大小的缓冲中,当整个缓冲画好后,再一次性送给显存,REG能否实现?<BR><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////图形模式初始化子程序<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void InitGraph(unsigned int mode = VBE800X600X256)<BR>{<BR> _AX = 0x4F02;<BR> _BX = mode;<BR> __int__(0x10);<BR> if (_AH != 0)<BR> {<BR> puts("Can't Initialize the graphics mode!");<BR> exit(1);<BR> }<BR>}<BR>
RockCarry 发表于 2007-10-9 12:20
晕,目前不支持是因为还没有完善<BR>使用双缓冲在 RGE 里面很容易实现,在 RGE 里面有例子代码。大致的方法如下:<BR>+-------------------------------------------------------------------------+<BR>BMP backscreen = {0};<BR>createbmp(&VESASCREEN);<BR>backscreen.pmemdrv = &EMS_MEM_DRV; /* 使用 EMS 内存 */<BR>backscreen.width = VESASCREEN.width;<BR>backscreen.height = VESASCREEN.height;<BR>backscreen.pixelbytes = VESASCREEN.pixelbytes;<BR>createbmp(&backscreen); /* 创建缓冲位图 */<BR>setcolor(RGB(0, 255, 0));<BR>line(&backscreen, 10, 10, 100, 100); /* 在缓冲位图上绘制图形 */<BR>fastputbmp(&VESASCREEN, 0, 0, &backscreen); /* 将缓冲位图刷新到屏幕上 */<BR>destroybmp(&backscreen);<BR>destroybmp(&VESASCREEN);<BR>+-------------------------------------------------------------------------+<BR><BR>
ba_wang_mao 发表于 2007-10-10 16:14
RockCarry:<BR> 我将你的“快速入门”文档中的第二个程序(双缓冲)制作成double.C文件后,将REG中的*.h拷贝到C:\TC\INCLUDE\下,然后用TC++3.0 FOR DOS编译,结果出现连接错误,错误如下:<BR> Linker Error:Undefined symbol _destroybmp in module DOUBLE.C<BR> Linker Error:Undefined symbol _VGASCREEN in module DOUBLE.C<BR> Linker Error:Undefined symbol _unloadfont in module DOUBLE.C<BR> 等等...<BR>不知何原因?
RockCarry 发表于 2007-10-10 16:58
链接时加上 RGE.lib 库就可以了<BR>但是需要注意内存模式<BR><BR>