在1997年夏天,我是实时策略(RTS)和定义这些类型的沉浸式3D /沙盒角色扮演游戏的黄金经典玩家。 在浪费了很多时间的游戏之后,我想做些更具建设性的事情。 我曾梦想过自己制作视频游戏。
前一年,我为名为3D Coding BlackHole的教程系列创建了一个基本的纹理映射,软件渲染3D引擎。 我当时正在开发一个流行的RTS游戏的克隆版本,这是一种学习经验,也是开发具有潜在贡献者的新游戏的垫脚石。
我想到了这个疯狂的主意,开始了终身的探索,以构建理想的SDK,该SDK使您可以编写一款可以在所有这些平台上运行的游戏,而不必为每个平台编写特定的代码。 如今,跨平台开发的优势是显而易见的,并且提供了许多工具包,但是20年前,它们很少而且还很有限。
我坚信“编写一次,到处运行”将成为将来编写代码的方式,因此我rolled起袖子,开始不只是为一个,而是为三个不同的游戏平台编写代码。 我使用了在DOS中运行的3D图形引擎,以及两个版本的RTS游戏的克隆代码库(一个版本在DOS下使用SuperVGA运行,另一个版本在Windows下通过DirectX运行),并在一个漂亮的抽象层后面进行了重组。添加对Linux的支持。 Ecere SDK诞生了。
2D和3D图形
由于该工具包主要用于游戏开发,因此最初的重点是2D和3D图形。 随着图形处理单元(GPU)的出现,我们开始支持硬件加速的图形,最初是通过Glide API,最后是通过OpenGL和Direct3D 。
Ecere SDK的显示驱动程序系统使用户可以选择用于渲染图形的API,同时保留相同的应用程序代码。 当前的2D图形引擎非常简单,并支持所有基本需求,例如选择分辨率,切换全屏模式,加载和保存图像,位图操作,生成线条和框以及国际文本输出。 它还允许用户在应用程序运行时更改模式或驱动程序,从而更轻松地管理必须以不同方式重新加载的资源(例如图像和字体)。 我们目前正在为将来的版本开发更高级的矢量图形功能。
3D图形引擎可以导入和渲染3DS模型中的大多数功能 并支持其动画格式。 我们目前正在努力支持协同设计活动( COLLADA )和GL传输格式( glTF )。
该引擎提供了一个API,用于组装自定义网格,创建分层对象,应用具有丰富属性的带纹理和阴影的材料以及使用动画摄影机。 OpenGL后端同时支持传统OpenGL和基于着色器的现代OpenGL,并提供可轻松插入自定义着色器的API,并且还可以使用OpenGL ES将应用程序部署在移动平台上,或者使用WebGL将应用程序部署在Web上。 我们正在对3D引擎进行重大升级,这将导致性能改进和新功能。
图形用户界面
Ecere的图形用户界面(GUI)系统被发明为提供游戏内GUI(例如,在暂停的游戏上提供半透明菜单),已经发展成为一种非常丰富和高效的方式,可以将简单到复杂的用户界面组合在一起。 它提供了一个通用控件库,其中包括:编辑框(具有多行样式的成熟的文本编辑器);以及 列表框(具有充当树视图或网格视图的选项); 下拉/组合框; 一个通用的数据框(根据指定的数据类型自动解析并弹出该类型的关联编辑器); 弹出菜单和菜单栏; 滚动条和滑块; 影像盒; 状态栏; 标签控件; 工具栏; 和更多。 更复杂的控件和对话框允许用户从日历控件,文件,文件夹或颜色中选择日期; 查找或替换文本; 或弹出一条消息。
GUI系统还允许自定义现有组件的外观和感觉,或基于非常灵活的系统来构建自定义控件,该系统利用了以窗口基类为中心的组合和继承的面向对象概念。 使用窗口的OnRedraw回调接收到的surface参数,在窗口内渲染图形就像向2D / 3D图形引擎发出图形调用一样简单。 我们现在正在研究一种自动布局和样式引擎,可以更好地处理各种像素密度。
集成开发环境
在开发编辑框的文本编辑功能时,我开始将其用作代码编辑器。 由于其图形驱动程序,因此可以在终端或图形环境中使用文本模式。
代码编辑器已经从基本的项目文件格式演变为丰富的开发环境。 现在,它具有基于上下文的语法突出显示,自动完成和参数工具提示; 表格设计师; 对象属性和方法表; API文档浏览器; 与GNU项目调试器( GDB )交互的集成调试器; Valgrind集成; 甚至集成了橡皮鸭调试功能来解决最棘手的错误。 IDE的跨平台构建系统是其真正的优势,因为它可以生成GNU makefile(无需“配置”),可以轻松地在具有或不具有MSYS的 Unix系统和Windows系统上构建。
eC编程语言
Ecere运行时库最初仅用C语言编写。 从编写更复杂,组织更清晰的C程序中看到面向对象的价值,我尝试将库的面向对象的包装器放在一起,首先是C ++,然后是Python。 对API和实现不满意,2004年,我在一个巨大的鸿沟(也许比我意识到的要宽)上实现了跨越式的飞跃,并着手设计一种新的编程语言。
这样做的理由是C是一种很棒的语言:可移植,本地的,并且使用所有可用的关键库进行编译。 我认为,它所缺少的只是:
- 面向对象的风格(受C ++的影响很大);
- 属性(作为定义场景图API和支持IDE属性表的一种好方法,这可以立即导致表单设计器中的视觉更新);
- 反射(受Python启发,对于IDE动态查询库的属性和方法并支持自定义对象设计器也是必不可少的);
- 模块(因为头文件很痛苦,并且受Python启发,使它们可以动态加载/弹出); 和
- 在我们讨论的同时,为什么不消除对前向声明的需求呢?
因此,eC被定义为C语言的一个超集(严格来说,但大多数情况下是正确的),精确地是C89标准,尽管后来添加了对某些C99功能的支持。 小写的“ e”表示对C语言的少量添加,也表示“ Ecere”,增强型,优雅,高效或喜欢的任何修饰词。
eC语言的基石是用于实例化对象的语法:
MessageBox msgBox { contents = “Hello, world !! ” } ;
它受到“结构”的C初始化程序语法的启发,该结构可能看起来像这样(假设内容是第一个成员):
MessageBox msgBox = { “Hello, world !! ” } ;
成员名称可以根据其顺序省略和解析,实例也可以是匿名的(在这种情况下,它是一个表达式而不是声明); 例如:
Vector3D { 2 , 4 , 5 }
还可以根据目的地的预期类型推断其数据类型。 例如:
{ contents = "Hello, world!!" }
如果需要一个MessageBox。
ECON:eC对象表示法
当我第一次遇到JSON时 ,我注意到了两件事。 首先,将数据序列化为文本而不是XML似乎是一种更为明智的方法。 其次,我认为它看起来与eC实例化语法非常相似,不同之处在于用引号引起来的成员(键)和用冒号(:)代替等号(=)。
我认为最好使用完全符合eC实例化语法的对象符号。 出于兼容性考虑,我将eC对象表示法 (ECON)设为JSON的超集,以便有效JSON是有效的ECON。 JSON作为ECON可写的唯一要求是成员是有效的C / eC标识符(以字母开头,并且仅包含字母和数字)。 完全支持eC实例化语法对JSON进行了一些其他改进,例如十六进制数字支持,除true / false之外的非引用枚举值,多行字符串,隐式成员名以及指定类型的能力。 能够将对象直接从代码复制到序列化数据文件,反之亦然,这也非常方便。 与我们以前的JSON解析器/编写器一样,所有eC数据类型都可以自动从ECON或JSON文件(反序列化)进行反序列化。
我们还希望提供一些库,以帮助从其他编程语言编写和解析ECON。
语言绑定:eC作为网关
尽管eC是我们所有库的主要开发语言,但我们认识到要求其他人和组织使用它会阻止采用它所内置的技术。
幸运的是,eC是要编译的少数几种编译语言之一,并且具有内置的反射功能,因此适合从丰富的API生成自动语言绑定。 该实现可以提供本机性能,同时避免额外层的开销。 毫不费力地,用eC编写的任何库的API都可以变为由我们的绑定生成器工具支持的适用于任何目标语言的适当的面向对象的API,该模型力求在保持统一的API优势的同时平衡跨语言语言的范式,精神和最佳实践。 当前,可以使用C和Python语言的绑定,而C ++绑定正在开发中,并且支持后续的其他语言。
GNOSIS:基于Ecere的地理信息系统
在过去的三年中,我们将开发重点转移到了GNOSIS地理空间可视化产品上。 Ecere SDK是免费的开源软件,而利用eC编程语言和我们的开源库的GNOSIS是我们的主要商业产品。
GNOSIS致力于通过具有可视化和3D投影功能的高性能可视化系统来开发地理信息应用程序。 该系统大量使用栅格和矢量数据的多分辨率平铺,以最大程度地减少数据负载并最大化渲染性能。 它具有一个SDK,用于集成地图并将地理空间定位的对象叠加到自定义应用程序中; 实施标准开放地理空间联盟(OGC)Web地图协议和高效扩展以最小化带宽使用的地图服务器; 以及GIS工具以可视化,样式化和发布地图。 GNOSIS也是Ecere SDK持续开发和改进的主要推动力。
Ecere入门
Ecere SDK是3条款BSD许可下的免费开源软件。 最新版本可在Ecere SDK安装页面上找到 。 在Debian和Ubuntu系统上,SDK可从官方存储库ecere-sdk获得 ,并且代码在我们的GitHub存储库中发布。
要快速了解该语言的功能,请参阅eC概述 ,或对该语言的详细介绍,请参阅(进行中的)程序员指南《编程的道德经》 。 您还可以查阅包括铁路图在内的语法 (扩展的Backus–Naur形式,或EBNF)。 此外,还有一系列课程 (测验和实验练习)和井字游戏教程,可以帮助您了解更多。 快速浏览典型的简短eC应用程序的外观,请看以下示例: https : //gist.github.com/ 耶斯特路易/ 02181fdff3b1b3f5cb8fdc7b8bb375 51 。
寻求帮助的最佳位置是在论坛上或在我们的Freenode(irc.freenode.net)IRC频道#ecere上(最好保持在线状态并等待答案)。
我们欢迎新用户和潜在贡献者。 如果发现错误,请提交 。 如果您想查看我们正在寻找的捐助类型,请查看我们的建议页面 。