当前位置: 首页 > news >正文

基于属性的编辑器框架

看了Ogitor的代码后, 自己又实践了一把, 结合N3中学到的一些技巧, 在编辑器中得到了验证.

虽说做的是场景编辑器, 但是其它编辑器也可以用的, 毕竟思想都差不多.

对于一个编辑器, 通常是由一个个的"实体"组成, 或者叫"对象". 而"对象"又是由各种"属性"所组成.

以场景编辑器为例, 我们通常会涉及以下操作:

  • 刷地形, 刷纹理
  • 摆模型, 设置模型参数
  • 摆光源, 设置光源参数
  • 摆特效/音效, 设置参数
  • 摆NPC, 设置相应参数
  • ...

可以看到, 除了地形之外, 其它的操作都差不多. 如果把地形把块对待, 每个地形块做为一个"对象", 高度和纹理编辑当成属性编辑, 那么上面都可以看成是同一种编辑方式了. 还有"摆"的这个操作, 其实本质上了也是对象的位置变换这个属性的变化.

由此可以得出: 编辑器的一切操作都是属性编辑

实体不用说了, 相信每个引擎都有Model/Light/Sound之类的对象类.

那么怎么去定义一个属性呢?

简单的来说, 一个属性是一个<名称, 值>的配对, 对象就是这些属性的一个集合体. 以点光源为例, 它一般有这么几个属性:

  • 名称. Light0
  • 类型. PointLight
  • 位置. (100, 100, 100)
  • 范围. 15
  • 衰减. 1.0
  • 颜色. 0xff00ff00
  • .....

实际应用中我使用了FourCC代替String来索引属性, 这样可以用map<FourCC, Variant>做快速的访问. 更高级的实现可以参见N3的Attribute模块.

下面说说使用属性抽象的好处:

  1. 编辑操作
    1. 因为对象都是由属性组成的, 所以所有的编辑对象都可以抽象成一种, 那么只需要实现一种编辑方式就可以适用于所有的对象
    2. 因为操作是与具体对象相关性不大, 所以扩展新的对象类型对结构的影响很小
  2. 文件读写
    1. 对象是属性组成, 那么只需要把属性保存下来即可.
    2. 增删属性不用改动文件格式, 连版本号都省了
  3. Undo/Redo
    1. 对于创建/删除操作, 备份该对象所有属性.
    2. 对于属性更改操作, 备份当前编辑属性.
    3. Undo/Redo只不过是把属性进行还原而已
  4. 界面显示
    1. 属性可以与PropertyGrid良好的结合. 对于MFC的PropertyGrid正好可以用FourCC的uint值做为id. 扩展一下很容易把属性显示做成自适应的, 而不依赖于具体代码实现.
    2. 考虑与.net的property反射机制相结合(待验证)

再考查一下WPF下的绑定机制与属性相结合会产生什么效果~

相关文章:

  • Windows Phone 7 SDK 正式版本RTW
  • 解读Linux命令格式(转)
  • 通过手机摄像头实现动作追踪一----单帧的识别
  • PL/SQL Developer 9.x 注册码
  • 公司到底是怎么看我们的——Leo网上答疑47
  • Ext 2.2在IE 9运行居然说Ext-all.j运行错误,晕死了
  • 解决局域网文件共享设置
  • Socket 编程IO Multiplexing
  • Android 上传文件
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • ObjectUtils 类的方法
  • VMware-WorkStation 序列号(转)
  • OGRE On iPhone ----Ogre的iPhone基础模版框架源代码分析
  • 为Web页中的Table对象创建一个映射表
  • 基于V4L2的视频驱动开发(2)
  • ----------
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Apache Zeppelin在Apache Trafodion上的可视化
  • conda常用的命令
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Python - 闭包Closure
  • Redux 中间件分析
  • windows下如何用phpstorm同步测试服务器
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 王永庆:技术创新改变教育未来
  • 我的zsh配置, 2019最新方案
  • 我有几个粽子,和一个故事
  • 小试R空间处理新库sf
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 正则表达式-基础知识Review
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​比特币大跌的 2 个原因
  • #stm32驱动外设模块总结w5500模块
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2)nginx 安装、启停
  • (4)STL算法之比较
  • (二)c52学习之旅-简单了解单片机
  • (论文阅读40-45)图像描述1
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)winform之ListView
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET处理HTTP请求
  • ;号自动换行
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2016.7 test.5] T1
  • [AIGC] MySQL存储引擎详解
  • [Android Pro] AndroidX重构和映射
  • [autojs]autojs开关按钮的简单使用
  • [C++]C++类基本语法
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总