65.9K
CodeProject 正在变化。 阅读更多。
Home

Endogine sprite 引擎

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (47投票s)

2005 年 6 月 23 日

15分钟阅读

viewsIcon

738690

downloadIcon

22118

用于 D3D 和 GDI+ 的精灵引擎(包含多个游戏示例)。

Sample Image

部分示例包含在源代码中。

引言

Endogine 是一个精灵和游戏引擎,最初是用 Macromedia Director 编写的,以克服其默认精灵引擎的许多限制。大约一年前,我开始利用业余时间开发该项目的 C# 版本,现在它比原始版本拥有更多的功能——事实上,我已经多次重新设计了架构,使其与我曾经试图实现的 Director++ 范例几乎没有什么共同之处。摆脱这些模式使项目变得更好。然而,在能够称之为 Beta 版之前,仍有许多事情我想实现。

部分功能包括:

  • 简易媒体管理。
  • 精灵层级结构(父子关系,子对象的 Rotation、LOC 等属性继承自父对象)。
  • 行为。
  • 碰撞检测。
  • 基于插件的渲染(Direct3D、GDI+,Irrlicht 是下一个)。
  • 自定义光栅操作。
  • 程序化纹理(Perlin/Wood/Marble/Plasma/其他)。
  • 粒子系统。
  • Flash、Photoshop 和 Director 导入(不包括脚本)。注意:仅限原型功能。
  • 按精灵鼠标事件(enter/leave/up/down 等事件)。
  • 控件(按钮、框架、窗口、滚动条等)。所有这些都是基于精灵的,因此混合/缩放/旋转也适用于控件元素。
  • 动画对象(可以为精灵的几乎任何属性设置动画)。
  • 插值器(用于生成平滑动画、颜色渐变等)。
  • 精灵文本(每个字符都是一个精灵,可以设置动画,支持自定义多色位图字体和字距调整)。
  • 示例游戏原型(泡泡龙、视差滚动的太空侵略者、斯诺克/迷你高尔夫、洞穴猎人)。
  • IDE 包含场景图、精灵/行为编辑器、资源管理器和调试工具。
  • 简单的脚本语言 FlowScript,用于动画和声音控制。
  • 插件式声音系统(目前支持 BASS 或 DirectSound)。
  • 新增 - 颜色编辑器工具集:渐变、绘画风格 HSB 选择器、色板(支持 .aco.actPainter.txt)。
  • 新增 - RGB、HSB、HSL、HWB、Lab、XYZ 颜色空间的类(支持插件功能)。一个可以处理任何三维颜色空间的颜色选择器。

Sample Image

一些当前的 GUI 工具(编辑器、管理器等)。

背景

我曾专业地使用 Macromedia Director 开发游戏长达 10 年,但对产品最后 5 年的发展感到非常失望。为了弥补这一点,我编写了几个图形子系统,其中一些是项目特定的,但最终我设计了一个满足我对于 2D 游戏创作图形 API 的更通用标准。它从 2004 年秋季到 2005 年春季在 Director 的脚本语言 Lingo 中开发,从那时起就成为一个 C# 项目。

这是一个原型

当前的引擎设计并非一成不变,在其开发过程中我已经做了几次重大更改,并且还计划了更多更改。

优化将不得不等到所有功能实现后。GDI+ 模式非常慢,因为我还没有移植我的脏矩形系统。D3D 全屏模式具有最佳性能。

此时代码的注释很少,因为仍有可能重写许多部分。如果需要文档,我会根据出现的问题来创建。目前,您可以研究 Tests 项目来了解如何使用它。

示例项目

下载中有两个解决方案。一个是实际的引擎,包括一个名为 Tests 的项目,其中包含大部分示例和代码。我选择将其包含在解决方案中,因为如果测试项目是其中的一部分,那么开发/调试引擎会稍微容易一些,但您自己的项目不应该这样设置。MusicGame 项目更接近应该如何完成。

还有一个简单的教程文本,介绍如何设置您自己的项目。

我想有一个简单但真实的测试平台,所以我正在创建一些游戏原型。目前,它们是泡泡龙、一个滚动式太空侵略者游戏、一个高尔夫/斯诺克游戏、CaveHunter 和太空侵略者。项目中还有其他非游戏测试。通过将主窗口置于焦点,并从“Engine tests”菜单中选择项目来打开或关闭它们。

示例演练

注意:要使用对话框/编辑器,Endogine.Editors.dll 必须存在于 .exe 文件夹中。对于声音,包含 Endogine.Audio.Bass.dll 以及 BASS.zip 中的文件(共享软件许可)。

要尝试 Tests 项目中的一些示例,请运行 Tests 解决方案并按照以下步骤操作:

  • 以 3D/MDI 模式启动(默认)。
  • 将焦点放在主窗口上,以便引擎测试菜单出现在 MDI 父窗口中。
  • 从菜单中选择 Particle System。绿色的“对话框”控件可以控制粒子系统的几个方面。顶部的滑块是 numParticles,底部的滑块是大小。按钮可以在颜色和大小方案之间切换。玩完后,再次从菜单中选择 Particle System 来关闭它。
  • 从菜单中选择 GDI+ random procedural,以及 Font。这演示了几种创建程序化纹理和操作位图的方法,以及对位图字体的支持。每个字母精灵还有一个使其摆动的行为。**请注意**,两者都非常慢——它们使用的是我旧的系统。我很快就会升级它们,这将使它们快一百倍。
  • 转到 SceneGraphViewer,展开节点直到找到 Label 精灵。右键单击它并选择 Loc/Scale/Rot 控件。尝试更改属性的不同模式。注意鼠标回绕功能。
  • 关闭 Loc/Scale/Rot 控件,返回 SceneGraphViewer,展开 Label 节点。右键单击其中一个字母精灵并选择 Properties(LocY 和 Rotation 属性由程序控制,因此在此处难以更改)。
  • 单击 Behaviors 按钮查看精灵具有哪些行为。标记 ThisMovie.BhSwing,然后单击 Remove 使其停止摆动。(Add... 和 Properties... 尚未实现)。
  • 停止程序,然后重新启动,但这次取消 MDI 模式(因为 .NET 在 MDI 模式下存在键盘问题)。
  • 将焦点设置为主窗口,然后从菜单中选择 Puzzle Bobble。玩家 1 使用箭头键进行瞄准(向下射击,向上居中),玩家 2 使用 AWSD。再次选择它以关闭。**注意**:由于 ERectangle(F) 类的更改,目前存在一个错误,导致球卡在错误的位置。稍后会解决这个问题。(可能已修复。)
  • 从菜单中选择 Snooker,然后单击并拖动白色球进行射击。打开拓扑精灵对象的 Property Inspector,更改 Depth 和 Function 以查看如何生成新图像,使用 Loc/Scale/Rot 控件拖动它,并查看球的反应(有时会出错!)。
  • 从菜单中选择 Parallax Scroll 并尝试类似 Asteroids 的游戏。使用箭头键进行瞄准,空格键射击。注意:Camera 控件的 LOC 现在无法工作,因为相机由玩家管理,在每个帧更新时将相机对准飞船。视差就是这样工作的——只需移动相机,视差层就会自动创建深度效果。
  • (2006 年 2 月版本中已损坏) 转到主菜单,Edit,勾选 Onscreen sprite edit,然后右键单击屏幕上的精灵,您将看到一个鼠标 LOC 下方的精灵菜单。选择一个精灵,它应该在 SceneGraph 中被选中。它现在没有正确更新,所以您需要单击 SceneGraph 的工具栏才能看到选择。

使用代码

先决条件:.NET 2.0 和 DirectX 9.0c 附带 Managed Extensions(2006 年 2 月版本)用于演示可执行文件,以及 DirectX SDK 2006 年 2 月版本用于编译源代码。如果您需要 C# 开发 IDE,可以免费下载 SharpDevelop 2.0 或 Microsoft 的 Visual Studio Express C#。请阅读源代码中包含的 README.txt 获取更多说明。

请注意,Managed DirectX 版本既不向后兼容也不向前兼容。我认为后期版本在重新编译项目后应该可以工作,但演示可执行文件需要 MDX 2006 年 2 月版本。

我目前正在重新设计工作流程,您将需要一份相当长的说明才能设置一个使用 Endogine 的新解决方案,而我还没有写。开始的最佳方法是查看 Tests 项目。您也可以查看 MusicGame 解决方案,它更像是真实项目如何组织。

大部分术语都借鉴自 Director。精灵创建的一些示例

Sprite sp1 = new Sprite();
//Loads the first bitmap file named 
//Ball.* from the default directory
sp1.MemberName = "Ball";
sp1.Loc = new Point(30,30); //moves the sprite

Sprite sp2 = new Sprite();
//If it's an animated gif, 
//the sprite will automatically animate
sp2.MemberName = "GifAnim";
sp2.Animator.StepSize = 0.1; //set the animation speed
sp2.Rect = new RectangleF(50,50,200,200); //stretches and moves the sprite

Sprite sp2Child = new Sprite();
//same texture/bitmap as sp1's will be used 
//- no duplicate memory areas
sp2Child.MemberName = "Ball";
//now, sp2Child will follow sp2's location, 
//rotation, and stretching
sp2Child.Parent = sp2;

路线图

我将在今年将该引擎用于一些商业项目。这意味着我将集中精力实现这些游戏所需的所有功能,并且可能不会在打磨“通用”功能集方面投入太多精力。

今年将会有几次更新,但我已将 1.0 的预计交付时间(ETA)推迟到 2006 年秋末。我预计项目将对引擎产生进化压力,迫使重构和新的使用模式,但最终会带来更好的架构。另一个副作用是文档;我将不得不为其他团队成员编写至少几篇教程。

目前,我将大部分业余时间投入到 PaintLab,一个图像编辑器,它基于 OpenBlackBox,一个开源的模块化信号处理框架。它们都使用 Endogine 作为其图形核心,并且许多 GUI 元素都是 Endogine 编辑器,因此我经常需要在开发它们时改进/添加 Endogine 中的内容。

下一个更新目标(未改变)

我已开始使用 Subversion 进行源代码控制,这将更容易组装新版本进行发布,因此更新将包含新教程和错误修复,出现频率会更高。接下来的几个月可能的一些任务:

  • 在运行时切换 IDE/MDI 模式和“干净”模式。
  • 清理术语,合并重复系统,继续迁移到 .NET 2.0。
  • 研究对 XAML 的支持,并使其术语和模式保持一致。
  • 修复 IDE GUI,开发更多编辑器。

历史

更新 2006-07-06

同样,其他项目占用了我的大部分时间——目前是基于 OpenBlackBox/Endogine 的 PaintLab 绘画程序。对 Endogine 的副作用:

  • 颜色管理工具:编辑器、颜色空间转换器、颜色调色板文件过滤器等。
  • 重构:WinForms 元素正从主项目移出到一个单独的 DLL。这简化了移植到 mono 或 WPF 的工作,并将核心 DLL 减小了 50%。
  • 改进了 CanvasVector3Vector4Matrix4 类。
  • 改进了 PSD 解析器。
  • 更多的碰撞/相交检测算法。
  • 几个新的或更新的用户控件。

更新 2006-03-15

我专注于发布 OpenBlackBox 的第一个版本,因此大部分修改是为了提供互操作功能(OBB 高度依赖于 Endogine)。

  • 优化(当涉及大量顶点时,速度可以提高很多倍)。
  • 继续迁移到 .NET 2.0。
  • 需要 DirectX SDK 2006 年 2 月版本。
  • 对 HLSL 着色器和 RenderToTexture 的简单支持。
  • 更好的像素操作代理——使用 CanvasPixelDataProvider 类而不是旧的 PixelManipulator
  • 扩展了 Endogine 渲染部分接口。项目(如 OpenBlackBox)可以利用抽象渲染 API,而不必启动整个 Endogine 精灵系统。
  • 上次忘了提,自上次更新以来,包含了一个小型教程。

差不多就是这样了。但不要错过 OpenBlackBox,随着时间的推移,它将成为开发 Endogine 应用程序的非常有用的组件!

更新 2006-02-01

此版本中的一些主要架构更改,尤其是在纹理/位图/动画系统方面。迁移尚未完成,因此几种使用模式可能共存并引起一些混淆。需要一些工具来使动画系统更易于使用。

  • 迁移到 .NET 2.0。注意:重构仍在进行中(例如,泛型尚未在所有地方使用)。
  • 已删除 Isometric 示例。我已继续将其作为一个独立项目进行开发,如果可能,稍后会提供。
  • 渲染器现在是插件,便于开发/部署。(还开始开发了一个基于 Tao 的 OpenGL 渲染器,但对其 API 感到厌烦。)
  • PixelManipulator - 轻松访问像素,无论源是位图还是纹理表面。
  • 如何使用 PixelManipulator 的示例(改编自 processing.org 的 Smoke 和 Cellular Automata3 - 感谢 Mike Davis 和 Glen Murphy 允许我使用它们)。
  • Carlos J. Quintero 的 VB.NET TriStateTreeView 的 C# 版本 - 感谢 Carlos。添加了 TriStateTreeNode 类。
  • 开始开发插件式声音系统。目前,我已经实现了两个声音子系统:BASS 和一个简单的 DirectX 播放器。可以实现 OpenAL,但 BASS 已经足够跨平台,并且具有更好的功能集。稍后,我将添加 DirectShow 支持。
  • 包含 Leslie Sanford 的 MidiToolKit 的修改版本(支持多重播放,并具有稍有不同的消息系统)。感谢!
  • Flash 解析器/渲染器已重新组织和改进。可以渲染基本形状和动画。
  • 用于管理不同配置的文件系统和设置的系统(有点像 app.config,但更易于使用,更适合我的目的)。
  • 基于 RegEx 的文件查找器(扩展了搜索机制,可以使用非 RegEx 计数器,如 [39-80] 和 [1-130pad:3] - 后者将找到字符串 001 到 130)。
  • 创建打包纹理的助手(树图打包)。
  • 纹理使用抽象层——用户不必关心精灵的图像是否来自打包纹理。
  • “Members”概念正在被淘汰,取而代之的是 PicRefs。Macromedia Director 的一般术语将随着时间的推移逐渐消失。
  • 新的、更抽象的动画系统。尚未完全实现。
  • .NET 脚本系统,支持代码注入。目前仅支持 Boo,但将支持其他语言。稍后将进行重构,并为不同语言使用策略模式。
  • 新的、极大地改进的位图字体系统,用于渲染和创建字体。实时字距调整,而不是预计算字距表。
  • 本地化/翻译助手(用于多语言产品)。
  • 一系列辅助类,如 IntervalString 类(将“-1-3,5-7”转换为数组 [-1,0,1,2,3,5,6,7] 并从中转换)。
  • 未知数量的错误修复和优化。

更新 2005-10-10

由于上次更新从游戏角度来看并不那么令人兴奋,我决定加入一个包含原型等距游戏的新版本。完全 R.A.D。

  • 等距渲染,基于 David Skoglund 的游戏 CrunchTime,包括 他的图形(参见 Isometric 文件夹中的 _readme.txt)。谢谢,朋友!
  • A* 寻路算法,改编自 John Kenedy 的实现。谢谢!
  • 删除了对 LiveInterface 的引用。
  • 为位图文件添加了“资源分支”——一个 XML 文件,包含附加信息,如动画帧数和偏移点。

更新 2005-10-04

好吧,比预定时间晚了一个多月,而且它不包含您可能一直在等待的东西,而且我一直在努力的东西——主要是创建两种脚本语言——目前状态还不算太有用(尤其是在没有使用它们的良好示例的情况下)。我认为花一些时间在这上面是值得的,因为我确信 FlowScript 以后会成为一个很棒的工具。以下是我为这个版本准备的内容:

  • 使用 2005 年 8 月 SDK 编译。
  • 添加了太空侵略者原型。
  • 添加了 .swf 导入的曲线渲染(它仍然渲染出奇怪的图像)。
  • 将引擎重组为 .dll
  • 修复了鼠标 LOC <-> 屏幕 LOC 错误。
  • 修复了透明度/alpha/颜色键问题。
  • Map(可能是一个糟糕的名字)类——类似于 SortedList,但它接受多个相同的“键”。
  • Node 类,类似于 XmlNode,但用于非文本数据。
  • 开始准备使用 3D 矩阵进行缩放/定位/旋转。
  • 删除了 DirectDraw 支持。
  • 基本声音支持。
  • 一个同步不佳的鼓机示例。
  • FlowScript,一种基于时间尺度的脚本语言,面向非程序员,用于动画和声音控制,基于
  • EScript,一种简单的基于反射的脚本语言(无字节码)。
  • 简单的 CheckBox 控件。

更新 2005-08-01

  • 使用 2005 年 6 月 SDK 编译。
  • Sprite.Cursor 属性(功能类似于 Control.Cursor)。
  • 简易 XML 编辑器。
  • .NET 标准化序列化。
  • 使用 PropertyGrid 而不是自定义属性编辑器。
  • VersatileDataGrid 用户控件(一个新型 DataGrid 控件,实现了 .NET 标准 DataGrid 中缺失的功能)。
  • TreeGrid 用户控件——有点像 Explorer,但右侧窗格是锁定的 VersatileDataGrid 控件。
  • 两个新的游戏原型:CaveHunter 和 Snooker/MiniGolf。
  • ResourceManager 编辑器,支持拖放至场景(以及 SceneGraph 查看器)。
  • 更好的结构。
  • Transformer 行为——Photoshop 风格的精灵叠加,用于移动/缩放/旋转。
  • 场景 XML 导入/导出。
  • Director Xtra,用于将电影导出为 Endogine XML 场景格式。
  • 导入 Photoshop 文档——每个图层变成一个精灵,图层效果变成行为。图层位图的解码不完整。
  • 导入 Flash swf 文件(渲染代码不完整)。
  • BinaryReverseReader,它以相反的顺序读取字节(用于 .psd),以及 BinaryFlashReader,它以亚字节精度读取数据(用于 .swf)。
  • 扩展了 EPoint(F)ERectangle(F) 类。**注意**,泡泡龙在最新的更改后无法正常工作,我稍后会处理。

更新 2005-07-07

  • 相机节点。
  • 视差层。
  • LOC/Scale 控件工具箱。
  • 用户控件:ValueEdit(使用箭头键更改 Point)、JogShuttle(鼠标拖动以 Jog 或 Shuttle 方式更改 Point 值)。
  • 修复了 MDI 模式崩溃(感谢 adrian cirstei)——但在 MDI 模式下键盘仍然无法工作。
  • 多个场景图窗口。
  • 直接在场景中选择精灵。
  • 带有视差层的类似 Asteroids 的游戏。
  • 扩展了 EPoint(F)ERectangle(F) 类。

更新 2005-06-27

  • 可选的 MDI 界面:编辑器和游戏窗口作为 MDI 窗口。(问题:在 MDI 窗口中创建 3D 设备时遇到错误。)
  • 场景图:所有精灵的树状视图。
  • 精灵标记:在场景图中选中的精灵周围创建标记。
  • 属性检查器:用于查看和编辑精灵属性的界面。
  • 精灵行为:为精灵添加功能的简便方法。摆动字母动画就是通过行为实现的。
  • 行为检查器:在运行时添加/删除/编辑行为。
  • 墨水使用枚举而不是 int(使用 ROPs.Multiply 而不是 103)。
  • 将 MS 过于简化的 Point(F)/Rectangle(F) 类切换为我自己的 EPoint(F)/ERectangle(F),它们具有运算符重载和更多方法。请注意,我选择将它们写成类而不是 struct——也就是说,它们以引用的形式传递,而不是以值的形式传递。
  • 更简便的键盘处理(为按键分配名称——这样更容易让用户定义按键,或者在一台键盘上有多个玩家)。
  • 泡泡龙允许每个区域有多个玩家。

您可以在 这里 阅读我关于 Endogine 概念的早期想法、未来计划,并查看一些 Shockwave/Lingo 演示。

我在 这里 添加了一个 Endogine C# 特定页面,但它可能滞后于此页面。

© . All rights reserved.