原文地址 https://www.iddevnet.com/doom3/entitydefs.php

需要翻墙以后人机验证才能进入该英文网站阅读,强烈建议进入原文阅读

doom3实体定义

一个entityDef只不过是一个带有一个名字的键/值对的集合。它们通常用于定义实体(因此名称),但它们可以真正用于定义可以使用键/值对列表定义的任何内容。键和值的含义完全取决于对象的类型,但是有两个键/值对保持不变,不管类型如何。

“spawnclass”键定义了“生成”这个实体的C ++类。项目使用 idItem,trigger_once使用idTrigger_Multiple,怪物使用idAI等。如果你知道C ++,你可以添加新的spawn类到游戏代码,如果现有的不适合你的需要。没有“spawnclass”键的实体无法产生。

“继承”键可以让游戏复制来自另一个entityDef的所有键/值对。循环引用是不可能的,因为每个entityDef只解析一次(你会得到一个错误)。这是一个非常有用的钥匙。你可以做一些事情,如创建一个所有怪物继承的默认怪物。这不仅可以节省打字,而且可以让你在一个地方改变一些东西,并影响一堆物体(这是一种祝福和诅咒)。

编辑键

编辑器使用任何以editor_开头的键。它特别寻找的一些键是:

价值/描述
editor_color 3个浮点数,用于定义编辑器中实体的颜色
editor_mins
editor_max
3个浮动每个定义实体的边界框的大小。?可用于创建动态大小的实体(如触发器)。注意:编辑器中的大小并不总是游戏中的大小,因为碰撞几何可能在其他地方指定。
editor_usage 描述实体是什么以及如何使用它的文本
editor_material 适用于实体的材料
editor_var <key> 描述spawnvar <key>的文本描述。这允许级别设计器覆盖entityDef中的值
editor_copy <key> 当创建此类型的对象时,将密钥从实体def复制到实体
editor_rotatable Bool如果实体可以自由旋转,设置为1
editor_showangle Bool设置为1以显示角度箭头
editor_mover Bool设置为1以使用“movedir”而不是“angle”作为角度
editor_env Bool如果对象是某种环境布娃娃,则设置为1
editor_combatnode Bool设置为1以绘制该实体的作战区域
editor_light Bool设置为1以像光一样对待这个实体
霰弹枪

我们来看一下霰弹枪的一个例子entityDef
(这不是在def文件中看到的方式,为了清楚起见我已经重新排列了一些东西)

entityDef weapon_shotgun {//全球“spawnclass”“idItem”
//编辑器使用“editor_color”“.3 .3 1”“editor_mins”“-16 -16 0”“editor_maxs”“16 16 32”“editor_usage”“霰弹枪”“editor_rotatable”“1”
//由idItem使用“def_dropItem”“moveable_item_shotgun”“inv_name”“霰弹枪”“inv_weapon”“weapon_shotgun”“inv_ammo_shells”“4”“inv_item”“5”
“snd_acquire”“sound_weapon_acquire”“snd_respawn”“sound_weapon_respawn”
//由idEntity使用“size”“32 32 32”“型号”“型号/武器/霰弹枪/ w_shotgun2.lwo”
//由idWeapon使用“model_view”“viewmodel_shotgun”“model_world”“worldmodel_shotgun”“joint_attach”“SHOTGUN_ATTACHER”“icon”“guis / assets / hud / wpn_2”
“weapon_scriptobject”“weapon_shotgun”“def_projectile”“projectile_bullet_shotgun”“ammoType”“ammo_shells”“ammoRequired”“1”“clipSize”“8”“lowAmmo”“2”“mtr_flashShader”“muzzleflash”“flashColor”“1 0.8 0.4”“flashRadius”“120”“silent_fire”“0”“recoilTime”“325”“recoilAngles”“-1 0 0”“weaponAngleOffsetAverages”“15”“weaponAngleOffsetScale”“.40”“weaponAngleOffsetMax”“20”“weaponsOffsetTime”“500”“weaponOffsetScale”“0.005”
“hide_time”“0.3”“hide_distance”“-15”
“smoke_muzzle”“shotgunmuzzlesmoke.prt”“def_ejectBrass”“fragments_shotgunbrass”“ejectBrassDelay”“650”
//由脚本使用“传播”“22”“skin_invisible”“皮肤/ shotgun_invis”
}

看这个脚本,我们开始看到代码中有3个不同的部分都使用这个entityDef。第一个是编辑器,我们几乎可以忽略。下一段代码是idItem。这是有道理的,因为我们将'idItem'指定为spawnclass,所以自然地,类将要窥视一些值来正确地产生对象。idEntity关心这个实体的原因是idItem来自idEntity。这意味着每个idItem 都是一个idEntity。游戏代码中的几乎所有内容都是从idEntity派生的。(它类似于我们如何使用'inherit'从另一个entityDef复制公共属性)。令人困惑的部分是idWeapon适合图片的位置。我们知道霰弹枪是一种武器,但似乎没有任何地方可以告诉我们的代码。这里的魔术钥匙是inv_weapon。该键告诉idItem该项是武器,并使用weapon_shotgun entityDef定义idWeapon的参数。它只是发生在idItem的entityDef与idWeapon的entityDef相同。

重要的是要注意,虽然它们都设置为“武器枪”,但不一定是它们。其实他们不是像背包这样的东西。这是一个给你健康,护甲和弹药的物品。背包entityDef定义了世界上的对象,但其他东西在其他地方定义。为了测试这个,你可以添加“inv_weapon”“weapon_shotgun”到“item_medkit”entityDef,并注意你每次拿起一个药盒时都会得到一个霰弹枪。

另一个真正重要的关键是“weapon_scriptobject”这说明游戏代码运行哪个脚本来使霰弹枪工作。在这种情况下,对象名称与实体名称相同,但是它不一定是必须的。装备霰弹枪时,它告诉武器代码开始使用“weapon_shotgun”对象(在weapon_shotgun.script中定义)。有趣的是,只有一个武器脚本运行。当您切换武器时,它不会破坏脚本对象并创建一个新的对象,它只是告诉脚本对象变成一个新的类型。

我们难题的缺失部分是伤害。毕竟,没有损坏的猎枪只是一个玩具。损伤的方式看起来很奇怪,但实际上效果非常好。当您按下攻击按钮时,霰弹枪脚本会调用launchProjectiles(13),该弹射器发射13枚射弹。这些弹丸也是由“def_projectile”键定义为“projectile_bullet_shotgun”的实体。

如果我们看“projectile_bullet_shotgun”,我们看到它是一个idProjectile,它具有一系列的属性,可以定义它的外观,它如何飞行,它如何爆炸,当它碰到各种类型的曲面时它的声音,以及一个一堆其他的东西。它定义的一个是“def_damage”,它是一个定义损害的entityDef。原来,还有更多的伤害比伤害多少。还有第一人看起来如何,第三人看起来如何,你如何敲你回来,以及它是否能够吸收身体。看着“damage_shotgun”,我们看到每颗球都有14点伤害。乘以13粒,你会痛苦很多。

预缓存

entityDefs在级别加载时间中起着非常重要的作用。级别加载的资产通过走在级别和代码中定义的entityDefs来确定。在创建新的entityDefs时,遵循这些命名指南是非常重要的,以便预备功能正常工作:

字首 类型
SND 声音消失
mtr materials(材质 )
model Models
smoke 烟雾系统
GUI GUI文件
高清 另一个实体
皮肤 皮肤
pda_name 掌上电脑
FX FX
视频 视频解析
音频 音频日志
inv_icon 库存图标

还有其他一些你可以通过查看游戏代码找到,但它们几乎贬值,不应该被使用。未使用这些前缀意味着并非所有资产都将在地图加载中加载。它们在被引用时会被加载,从而在游戏中引起联机(这是

doom3 mapdef

doom3的地图定义,在脚本编辑器中来进行定义了

地图定义非常像Quake 3中的.arena文件。它定义了地图的名称,它支持哪些游戏模式,以及在每个质量模式下以多少(以字节为单位)。

以下是Alpha Labs 1的示例:

mapDef游戏/ alphalabs1 {“名称”“Alpha Labs Sector 1”“devname”“05-Alpha 1”“singleplayer”“1”“size0”“208322592”“size1”“208322592”“size2”“325950691”“size3”“470025492”
}
和DM地图比较:

mapDef游戏/ mp / d3dm5 {“名字”“熄灯”“死亡匹配”“1”“团队DM”“1”“Last Man”“1”“旅程”“1”“size0”93855710““size1”“93855710”“size2”“156267217”“size3”“237413960”
}

这个decl中的字段应该很容易弄清楚,“devname”是我们指向地图的内部名称。它主要被'takeViewNotes2'命令使用,这可能不再起作用(内部使用它来帮助查找错误)。

即使mapDef没有列出游戏类型,也可以通过在控制台中指定地图来为特定的游戏类型加载地图。游戏类型仅用于在创建服务器中列出地图和投票菜单。

关于创建mapDef的唯一困难在于指定大小。cvar“com_updateLoadSize”有很多帮助。当cvar设置为1时,游戏将在地图加载后自动更新地图def中的大小信息(不能将其设置为只读)。制作完成后,我们将运行一个批处理文件,该文件通过com_updateLoadSize设置启动游戏,加载地图,退出游戏,重复播放。我们会为所有4种质量模式(尽管size0和size1往往总是相同)。

以下是批处理文件的片段:

doom3.exe + com_updateLoadSize 1 + map game \ admin.map + quit
doom3.exe + com_updateLoadSize 1 + map game \ alphalabs1.map + quit
doom3.exe + com_updateLoadSize 1 + si_map game \ mp \ d3dm1.map + si_pure 0 + spawnserver + quit
doom3.exe + com_updateLoadSize 1 + si_map game \ mp \ d3dm2.map + si_pure 0 + spawnserver + quit

mapdef不必在def文件中。它可以在任何你想要的文件,甚至一个材料文件!但是,我强烈建议,在defs文件夹中创建一个mapdef(其中包含您可能使用的任何entityDefs或自定义模型)的<mymap> .def。

doom3 entitydef实体定义相关推荐

  1. 知识图谱中的实体定义

    1.引言 在前一篇博文<Neo4j构建目标知识图谱>中提到知识图谱的构建中实体及关系的定义是个难点,在本篇中试图总结经验. 2.知识图谱是什么 知识图谱本质上是一种语义网络,用图的形式描述 ...

  2. 属性定义为 not null unique_Spring Data with MySQL (实体定义)

    Spring Data with MySQL 节选自<Netkiller Spring Cloud 手札> 多维度架构 - 知乎​www.zhihu.com 选择数据库表引擎 正常创建表会 ...

  3. kbengine:简单介绍

    之前想分析一个开源服务器很久了,思前想后,还是选择了kbengine. KBEngine的服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新).现在服务器大多数是用C++做的,pyt ...

  4. Kbengine介绍

    Kbengine游戏引擎 前景 游戏引擎的底层介绍 github地址: Kbengine框架的优缺点: 结构介绍: 组件介绍: 前景 这里介绍呢,我是在kbengine原代码上有做修改,原基础上只支持 ...

  5. ofbiz之entity 实体解析 扩展 视图 复合列写法

    ofbiz 之entity实体 1. 实体定义文件 实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为%ofbiz-home%\applic ...

  6. KBEngine warring项目源码阅读(三) 实体文件与Account处理

    上一篇开始,我们就提到了一个概念,并且进行了初步的运用,这个概念就是实体. KBE中的实体是一个很重要的概念,可以说,有了实体就有了一切. 我们首先接着上一章的内容,来看Account.def对应的实 ...

  7. AccEAP架构介绍(1)---实体的设计

    刚刚看到阿木的 与DotNet数据对象结合的自定义数据对象设计 (一)  ,讨论数据对象的设计思想,我就AccEAP中本人的实体设计思路参与讨论. 几个开源中, 阿木也提到 IBatisNet.NHi ...

  8. 你必须了解的反射——反射来实现实体验证

    开发工作中,都会需要针对传入的参数进行验证,特别是针对实体进行验证,确保传入的参数格式正确.这里做了一个非常简单的组件进行验证.抛砖引玉,让大家深入思考下反射的应用. 需求 日常开发,都是通过API进 ...

  9. JPA实体中数据库生成ID的最终指南1

    只需用@ID注释JPA实体的ID字段,并允许DB关心其余的!在某些情况下,缺省值应该改变.在本文中,我们将看到更改ID生成策略会如何影响应用程序的性能. 根据JPA规范,Entity是满足以下要求的J ...

  10. 如何用Visio画数据库实体关系图

    在百度经验中浏览:http://jingyan.baidu.com/article/e4511cf3374a862b855eaf58.html 在设计数据库表结构时,通常都是先画数据库实体关系图,这样 ...

最新文章

  1. 删除第一个_学习数据结构--第二章:线性表(顺序存储、插入、删除)
  2. 放弃中国国籍 却赚着中国人的钱
  3. 扫地机器人粘住老鼠板怎么办_家里老鼠的危害性及如何有效灭鼠
  4. C#中split的用法
  5. 基于JavaScript技术的横排文字转古书式竖排工具
  6. .NET Core验证ASP.NET密码
  7. win7系统怎么拷贝到u盘_Win7系统电脑无法识别U盘启动盘怎么办?
  8. think in uml 2.1
  9. tensorflow api训练3(ckpt转成pb和pbtxt)完结
  10. 硬盘坏了mysql数据恢复_mysql服务器硬盘损坏后的数据恢复
  11. 11月,匆匆而过,留下了遗憾(亚洲赛广州站)
  12. Mac最新版书籍分享
  13. VUE项目(仿商城)
  14. POJ 1838 Banana G++
  15. AUTOSAR Port原理概念详解
  16. mysql配置和优化
  17. 最大似然估计(Maximum Likehood Estimation,MLE)和最大后验估计(Maximum A Posteriori estimation, MAP)
  18. 滴滴青桔单车跨端技术方案和业务技术架构,及框架设计和性能提升实践
  19. 力扣Leetcode:5. 最长回文子串(Python)
  20. 图谱实战 | 为什么我们需要医学知识图谱?

热门文章

  1. 基于python语言设计的词云定制器
  2. 双机热备 ip地址_双机热备软件哪个好?双机热备软件推荐
  3. Windows API 教程(七) hook 钩子监听
  4. 创建型——单例模式(Singleton)总结
  5. 伦敦银持仓分布分析技巧
  6. 微信小程序全方位深度解析课程Dome-First项目module
  7. Windows驱动的加载顺序
  8. 适合女孩子玩的计算机游戏,小仙女们!NS上7款最适合女孩子玩的游戏盘点
  9. Redisson延迟队列
  10. Android 悬浮窗日志工具