@adatech/游戏合同
合同每个游戏单元都依赖,没有别的。 类型加上一些小的纯支票, 无运行时间依赖关系麻省理工学院的.
想法:车辆、椅子、手枪或房子是 模块。它不需要默认的毁灭世界、制造器或试验室.
它只需要就几个形状达成一致,这些就是这些形状。 销毁包、武器包、液体包和试验室
依赖这个,再出口他们以前定义的东西,所以 import { Hit } from '@adatechnology/game-destruction' 继续工作.
your module ──▶ game-contracts ◀── game-destruction / game-weapons / game-fluids / game-test-room
安装
pnpm add @adatechnology/game-contracts
没有捆绑的浏览器( 全局为 GameContracts:
<script src="https://unpkg.com/@adatechnology/game-contracts/dist/index.global.js"></script>
<script>
const problems = GameContracts.checkHit({ type: 'blunt', point: [0, 1, 0] })
</script>
里面有什么东西
| 合同 | 出口 | 用于 |
|---|---|---|
| 销毁 | DestructibleSpec, (中文(简体) ), PartSpec, (中文(简体) ), Hit, (中文(简体) ), DestructionEvent, (中文(简体) ), ObjectState, (中文(简体) ), PartState, (中文(简体) ), JointSpec. | 部分、关节、点击、事件和状态的词汇 |
| 影响 | IMPACT_CONTRACT, (中文(简体) ), checkHit(hit) | 武器或危险必须放在 Hit,每个损害类型 |
| 自行销毁 | DestructibleImpl, (中文(简体) ), checkDestructible(impl, { materials }) | 自行销毁的模块(一辆具有自身面板规则的汽车) |
| 武器 | Shot, (中文(简体) ), Use, (中文(简体) ), shotToHit(shot, point, normal?), (中文(简体) ), shotExtras(shot, distance?) | 武器能产生什么 Hit 射出一个点 |
| 流体 | ContainerSpec, (中文(简体) ), LiquidId, (中文(简体) ), ItemUseDef | 任何物品都说它持有的液体 以及它是如何使用的 |
| 动画 | AnimationClipSpec, (中文(简体) ), ItemAnimationContract, (中文(简体) ), checkAnimation(clip, partIds) | 使用项目带来的动画( 门) open手枪 reload(中文(简体) ) |
| 模块 | TestableModule, (中文(简体) ), TestableItem, (中文(简体) ), ModuleScenario | 测试室是怎样的模块 |
销毁:一个模块拥有其对象
import type { DestructibleImpl } from '@adatechnology/game-contracts'
import { checkDestructible } from '@adatechnology/game-contracts'
const impl: DestructibleImpl = {
id: 'rental_car_1',
describe: () => ({ parts: [/* body, door_l, wheel_fl... in the impl's local space */] }),
hit: (hit) => [/* events: every one has object === id and names a part listed by describe() */],
state: () => ({ /* ObjectState */ }),
}
checkDestructible(impl, { materials: world.materials.keys() }) // { ok, problems }
撞击到达了世界空间,事件在世界空间展开. checkDestructible 不需要世界:它验证了 describe(),用一个
500J弹道弹道弹道弹道弹道检查 state() 匹配 describe()命中点从不负, update(0.016) 返回数组,每个事件都是
造型良好,而且JSON可连载 合同包不知道你的材料:通过他们的身份证明(世界 world.materials.keys())或(或)
离开 materials 跳过支票.
费用合同(D8): 主机读取 describe() 财务报告和审定财务报表 state() 每个帧的每个部分,所以两者都是O(1),无分配和在变化之间被缓存(同一个对象返回,直到被击中,被工具,被火或被变换). checkDestructible(impl, { cost: true }) (或 cost: { reads, ceilingMs, allocationBytes })每读出一万回,每读出一新对象就失败了,时间超过上限(默认为50毫秒),在节点则超过上限的堆积增长(默认为一米B).
武器
const hit = shotToHit(shot, point) // { type: 'ballistic', energy: shot.energyAt(distance), caliber, direction, ... }
checkHit(hit) // [] when valid
动画
一个片段是平版数据:用于项目根和被命名部分的有外形(从其他外形取出,Euler XYZ)的密钥,外加事件.
checkAnimation(clip, partIds) 验证一个蛇 case id, 一个正持续时间, 命令时间在剪辑中, 有限的向量, 每个移动的部分
这是其中之一 partIds,和完善的事件.
const open: AnimationClipSpec = {
id: 'open',
duration: 1.2,
keys: [{ t: 0 }, { t: 1.2, parts: { door_l: { rotation: [0, 1.1, 0] } } }],
events: [{ t: 0.15, type: 'sound', data: { key: 'door_latch' } }],
}
checkAnimation(open, ['body', 'door_l']) // { ok: true, problems: [] }
测试室的模块
import type { TestableModule } from '@adatechnology/game-contracts'
export const RENTAL_CARS: TestableModule = {
id: 'rental_cars',
name: 'Rental cars',
group: 'Rental cars',
items: (locale) => [{ id: 'rental_car', name: 'Rental car', build: (THREE) => buildCar(THREE), impl: (root, id) => createCarImpl(root, id), animations: [open] }],
scenarios: (locale) => [/* { id, name, run(ctx) } */],
}
room.loadModule(RENTAL_CARS) // items join the catalogue, scenarios become buttons, contract checks write ✓ / ✗ lines to the log
build 接收主机的 3.j 命名空间并返回其 Object3D (两者均为: unknown 这里:这个包不依赖三.js).
impl 收到对象 id 主机给出项目 DestructibleImpl.id 必须平等.
模块的长凳
一个模块也可以宣布一个长凳为数据: controls (数目、布尔、选择、行动), layers (观者开或去
metrics (遇到主机拉动与 read() 几回一秒钟). 主机保存值, 绘制值, 并借给模块 a
ModuleBench 内 attach (单位:千美元)host.bench: value(id), (中文(简体) ), layer(id), (中文(简体) ), onChange(listener) (紧接着) attach 每个控制器都有一个变化
层,按顺序排列, patch(id, { hidden, disabled, options, value }) (无回声)和 look(eye, target)。 。 。 . checkBench({ controls, layers, metrics })
检查声明( snake case ids 独有于 3, min < max, (中文(简体) ), step > 0,在范围和选项中默认, max > 0) (中文(简体) ).
选择的选项可能包含 group (东道主将它们列在标题下;一组人可选择坐相邻 checkBench 说
当他们不这样做的时候. ModuleBench.sheet(sheet) 在主机的面板上加一张牌( nameBenchSheet:踢球手、头衔、身体、事实、步骤、彩色手表、音符和a
播放标题遵循模块度量的片段的时长;没有工作表区域的主机将其排除在外.
主机借出的效果
ModuleHost.effects 是一个 EffectSink数字 : play({ effect, point, direction?, normal?, seed?, param?, scale? }) 通过 id 启动主机目录的效果
并回答一个手柄(或 null 当主不知道的时候, stop(handle) 结束一个循环,和 configure, (中文(简体) ), stats 财务报告和审定财务报表 catalog 是可选的。 这个
explosion 主机活动携带 explosive (炸药的id), PartSpec.explodes.effect 编辑 explode 事件名称是爆炸的效果.
controls: () => [
{ kind: 'choice', id: 'distance', name: 'Distance', options: [{ id: 'near', name: 'Near' }, { id: 'far', name: 'Far' }], default: 'near' },
{ kind: 'action', id: 'replay', name: 'Replay' },
],
layers: () => [{ id: 'smoke', name: 'Smoke' }],
metrics: () => [{ id: 'particles', name: 'Particles', max: 400, read: () => fx.particles }],
工具事件以工具周期而不是枪支命名: mode, (中文(简体) ), fault, (中文(简体) ), clear (开始/结束)和 safety,以及 shot 携带 rounds
旁边 shots (项目,总是1个或更多) mode; 哑弹是自己的 misfire 事件,而不是一个 shot 以0为单位. HostTool 可能报告 mode, (中文(简体) ), fault, (中文(简体) ), safety 财务报告和审定财务报表 heat (单位:千美元).
host.configureTool(settings) 使用一个 Record<string, string> 由模块自身控制的 id 键入; 测试室应用 condition 财务报告和审定财务报表 ammo_quality 并忽略其他身份证明.
host.player() 返回时 PlayerState (单位:千美元)position, (中文(简体) ), yaw, (中文(简体) ), pitch, (中文(简体) ), crouching, (中文(简体) ), speed 单位:毫秒, running, (中文(简体) ), cameraMode页:1 { type: 'player' } 事件说明蹲下或相机模式改变时.
声音和天气 东道主借
ModuleHost.audio? 是一个 AudioSink (单位:千美元)play(SoundRequest), (中文(简体) ), stop(handle),可选择 loop, (中文(简体) ), setListener, (中文(简体) ), register:一个共享的声音引擎,所以每个模块都是混合的,
限制和平分的方式相同. ModuleHost.environment? 是一个 EnvironmentBus (单位:千美元)get, (中文(简体) ), set(patch), (中文(简体) ), on持有 EnvironmentState (单位:千美元)rain 毫米/小时,风, fogFar, (中文(简体) ), visibility, (中文(简体) ),
nightFactor, (中文(简体) ), temperatureC, (中文(简体) ), wetness:天气模块写出,其他人读出. 两者均为可选、添加和通用; createEnvironmentBus(initial?) 是一个平地
用于执行总线的存储,以及 DEFAULT_ENVIRONMENT 是平静的干燥的一天.
API 密码
从软件包根导出所有东西; 见 src/*.ts 对于医生的评论。 单位:米,秒,焦耳,毫米(口径),摄氏度.
点出泄漏
Hit.ignition (单位:千美元){ spark, flame }, (中文(简体) ), Hit.incendiary 财务报告和审定财务报表 Hit.tracer 说出一圈可燃液体的漏泄; IgnitionRules 编号 : DEFAULT_IGNITION_RULES 是数字
容器一侧 fillCurve,则 sparkTarget 墙上, fireNear, (中文(简体) ), ignitionChance(hit, { sparkTarget, fill, fluid? }, rules?) 是一次回合的机会
灯光泄漏, fillFactor(fill, curve?) 曲线和 sparkTargetFactor(materialId, isMetal, rules?) 墙. game-destruction 财务报告和审定财务报表 game-vehicles 使用它们; 普通子弹只漏出.
类别(有遗产的种类)
defineCategories(defs, { extra, patches, remove }) 构建一个 CategoryRegistry: 每个 CategoryDef 有一个 id,可选 extends (任何深处), defaults, (中文(简体) ), requires (合同编号)和 abstract。 。 。 .
defaults(id) 沿着链子(根先起,阵列取代)深起, requires(id) 即离合者, chain(id), (中文(简体) ), isA(id, ancestor) 财务报告和审定财务报表 check() (未知的父,循环,重复的id)完成.
resolveEntry(registry, entry) 将类别默认置于条目下(条目胜出); checkCategorized(entries, registry, checkers, { allow }) 运行 ContractChecker 每一所需合同的确定
报告 "<id>" (<kind>): <problem>, required by <category>· ; allow 列出到 allowed 改为 problems。 。 。 .
仅列出项目名称 kind,因此游戏可以在现有类型之上插入新的父游戏(patches: { canned_food: { extends: 'preserved' } } 与 preserved 扩展旧父母)或者在任意类型下添加一个孩子,每个项目都会不断解决,现在还有额外的默认和要求,无需被编辑.
葡萄牙
{\fn华文楷体\fs16\1cHE0E0E0}是的,是的, sem dependências 节奏
执行卡罗 玛卡迪拉 玛卡迪拉 穆杜罗维基百科中的相关条目: 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}试卷 相干相干相干相干相干相干相干相干相好 Os pacotes de destruição, armas, slimos e a sala de testem deste e reexportam os tipos que (英语:
(原始内容存档于2018-10-21) (英语). antes definiam, então import { Hit } from '@adatechnology/game-destruction' (原始内容存档于2017-10-21). continua funcionando.
- 贫困数字 :
DestructibleImpl(o módulo manda no seu objeto) e 互联网档案馆的存檔,存档日期2013-12-02checkDestructible(impl, { materiais })时, que 有效adescribe(), (中文(简体) ), {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}嗯... {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}500J... - 影响数字 :
IMPACT_CONTRACT电子checkHit(hit){\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我需要你 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我需要你. - 阿玛斯数字 :
Shot, (中文(简体) ),Use电子shotToHit(shot, ponto)。 。 。 . - 流管数字 :
ContainerSpec, (中文(简体) ),LiquidId电子ItemUseDef。 。 。 . - 索姆克利马数字 :
ModuleHost.audio?(单位:千美元)AudioSink页:1ModuleHost.environment?(单位:千美元)EnvironmentBus缩写EnvironmentState(a) 国家、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、区域、;createEnvironmentBus()电子DEFAULT_ENVIRONMENT{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你还好吧. - 动画片数字 :
AnimationClipSpec电子checkAnimation(clipe, idsDasPeças)(马港a)open玛玛手枪reload) (中文(简体) ). - 穆杜罗数字 :
TestableModulea. 试验用具;room.loadModule(modulo)rod rod rod es rod 没有日志。 (原始内容存档于2018-10-21). Assim o módulo de um carro de aluguel já nasse com as suas animações e o seu jeito de quebrar. - 班加达莫杜洛宣言
controls, (中文(简体) ),layers电子metrics(原始内容存档于2018-09-29) (英语). como dados; a sala guarda os valores, desenha e emprestahost.bench(单位:千美元)ModuleBench) (中文(简体) ).checkBench声明有效。 塞克洛·达费拉门塔事件:mode, (中文(简体) ),fault, (中文(简体) ),clear, (中文(简体) ),safety, e 类rounds没有shot。 。 。 .