游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3928|回复: 4

[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均可使用

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-1 15:58:00 | 显示全部楼层 |阅读模式
精灵引擎包括:精灵(支持HotPoint),45度斜角地图,图层,ViewPort,层管理器。
图形引擎包括:ISurf通用2D绘图接口。目前有一个DDraw7的实现;IFont接口。还有一个CGdiFont实现。

*声明:欢迎学习研究或修改,未经本人许可,严禁用于商业用途 Copyright instemast

精灵引擎部分,我发现SUN的J2ME设计的还不错,所以参考了他的设计。
不过J2ME是针对移动设备的,不支持45度斜角地图,我支持了一下。

图形绘制部分,我抽象出了出一个ISurf接口来完成图形绘制。这个接口我改了好几次。
不支持位图Alpha通道,但是支持单个Alpha值。
ISurf接口中的Color格式为X8R8G8B8,不过具体设备上的具体实现与之可能不同。
你可以用D3D实现这个ISurf,也可以用DDraw实现他。目前我只提供了DDraw实现。

另外要说的是,不是说做3D游戏就不需要实现这个2D接口了。
由于我的UI是基于ISurf接口的,所以我的3D游戏也需要实现ISurf,以使UI工作。

里面用到的其他头文件,我也共享了出来,保证可以编译。
编译方面的问题可以联系我。使用上的问题也请问我。
另外,如果你熟悉const,就不需要多少文档了。

sf_200841155821.rar

39.09 KB, 下载次数:

8

主题

70

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2008-4-2 21:06:00 | 显示全部楼层

Re:[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均可

感谢,看下先

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-14 19:21:00 | 显示全部楼层

Re:[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均可

重要说明:

例子:一张100*100的BMP图,其坐标范围是,(0,0)-(99,99)


对ISurf接口的用户的说明:

// 只保证水平(垂直)绘制出的像素数 == w(h),如果没有剪裁
// 而不用管用户按照何种公式计算 w(h)
virtual void Blt(POS xdest,POS ydest,ISurf *surf,POS xsrc,POS ysrc,POS w,POS h,
ALPHA lpha=255,Bool bHasColorKey=True)=0;


对使用gdi,ddraw实现ISurf接口的程序员的说明:

// gdi,ddraw将对x2减去1,故已知w,h计算gdi,ddraw参数有3种方法可以选择:
// 1 - 先按正确方法(w=x2-x1+1)计算最终的 x2,最后把 x2+1 传入
// 2 - 先按正确方法(w=x2-x1+1)计算最终的 w ,最后把 x1+w 传入
// 3 - 整个计算过程中的各坐标均按照错误的计算式( w=x2-x1 )

--------------------------------------------------------------------------------------
不论怎样,我的接口函数中,使用的形参是w,h而不是x2,y2,这样,不会引起任何混淆!
至于用户如何计算w,h,那是用户的事情,用户给我多少w,我就绘制多少w的像素(如果没有剪裁)
--------------------------------------------------------------------------------------

16

主题

191

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2008-4-15 07:56:00 | 显示全部楼层

Re:[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均可

道义上支持一下 虽然我现在只用3d引擎

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-15 15:20:00 | 显示全部楼层

Re: Re:[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均

九万里: Re:[免费开源] 我的2D引擎 跨平台 任何图形设备(2d/3d)均可使用

道义上支持一下 虽然我现在只用3d引擎


昨晚用我的3D引擎,实现了 ISurf 接口。这意味着:
所有2D操作,均可以用3D来绘制了!
硬件alpha效果很好,今后可以抛弃directdraw了~~
(这就是为什么,我在ddraw版本的实现中,没有写alpha代码的缘故)
ddraw中的alpha实现也很简单,lock表面即可,就是坐标计算烦人。


大家如果有其他的 ISurf 实现,也可以加上哦!比如用gdi
因为,只要实现 ISurf,所有的2D类库,精灵,UI都可以使用!


此外重新修改了RTTI。
本来觉得QueryInterface那样很麻烦的。但也没办法了~
原来的RTTI主要用于接口和实体类的转换。
if(i->GetClass()==L"MyClass") p=(MyClass *)p->GetAddr();
虽然增加了 IsA(name) 虚方法,但是,因为用了虚拟继承,无法向下cast:
if(i->IsA(L"MyInterface") i2=(MyInterface *)i;
除非通过实体类MyClass作为中介,否则向下cast接口。orz
而实体类可能有多个,总不能到处写case吧。

算了,代码长点吧,删去了GetClass和 IsA,增加了 Cast(name)
你会怀疑保留GetAddr()有什么用?
如果仅仅是比较2个对象,就不需要Cast(L"inst::IDynamic")这样比较字符串。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 20:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表