@nimbus2d/core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/index.mjs +18433 -0
  2. package/package.json +39 -0
  3. package/src/base/EventEmitter.js +187 -0
  4. package/src/base/Subsystem.js +183 -0
  5. package/src/base/index.js +6 -0
  6. package/src/core/Application/AppState.js +27 -0
  7. package/src/core/Application/Application.js +480 -0
  8. package/src/core/Application/DefaultConfig.js +63 -0
  9. package/src/core/Application/index.js +7 -0
  10. package/src/core/AssetManager/AssetManager.js +711 -0
  11. package/src/core/AssetManager/AssetTypes.js +108 -0
  12. package/src/core/AssetManager/adapters/IResourceAdapter.js +50 -0
  13. package/src/core/AssetManager/adapters/PixiAdapter.js +90 -0
  14. package/src/core/AssetManager/core/RefCounter.js +167 -0
  15. package/src/core/AssetManager/core/ResourceCache.js +281 -0
  16. package/src/core/AssetManager/core/ResourceEntry.js +191 -0
  17. package/src/core/AssetManager/core/ResourceEventBus.js +127 -0
  18. package/src/core/AssetManager/handlers/IResourceHandler.js +45 -0
  19. package/src/core/AssetManager/index.js +26 -0
  20. package/src/core/AssetManager/plugins/IResourcePlugin.js +56 -0
  21. package/src/core/Camera/Camera.js +534 -0
  22. package/src/core/Camera/CameraTypes.js +59 -0
  23. package/src/core/Camera/index.js +13 -0
  24. package/src/core/ConfigSystem/ConfigLayer.js +230 -0
  25. package/src/core/ConfigSystem/ConfigLayerType.js +31 -0
  26. package/src/core/ConfigSystem/ConfigMerger.js +50 -0
  27. package/src/core/ConfigSystem/ConfigPath.js +96 -0
  28. package/src/core/ConfigSystem/ConfigSystem.js +378 -0
  29. package/src/core/ConfigSystem/ConfigTypes.js +29 -0
  30. package/src/core/ConfigSystem/ConfigWatcher.js +84 -0
  31. package/src/core/ConfigSystem/index.js +19 -0
  32. package/src/core/EventBus/EventBus.js +797 -0
  33. package/src/core/EventBus/Interceptor.js +26 -0
  34. package/src/core/EventBus/PerformanceStats.js +105 -0
  35. package/src/core/EventBus/index.js +7 -0
  36. package/src/core/Lifecycle/Lifecycle.js +265 -0
  37. package/src/core/Lifecycle/LifecycleState.js +31 -0
  38. package/src/core/Lifecycle/index.js +6 -0
  39. package/src/core/Logger/ConsoleHandler.js +55 -0
  40. package/src/core/Logger/LogHandler.js +34 -0
  41. package/src/core/Logger/LogLevel.js +38 -0
  42. package/src/core/Logger/Logger.js +234 -0
  43. package/src/core/Logger/index.js +8 -0
  44. package/src/core/PluginSystem/Plugin.js +156 -0
  45. package/src/core/PluginSystem/PluginEntry.js +102 -0
  46. package/src/core/PluginSystem/PluginState.js +30 -0
  47. package/src/core/PluginSystem/PluginSystem.js +530 -0
  48. package/src/core/PluginSystem/index.js +8 -0
  49. package/src/core/PoolManager/DefaultConfig.js +19 -0
  50. package/src/core/PoolManager/ObjectPool.js +326 -0
  51. package/src/core/PoolManager/PoolManager.js +253 -0
  52. package/src/core/PoolManager/PoolTypes.js +92 -0
  53. package/src/core/PoolManager/index.js +15 -0
  54. package/src/core/SceneManager/FadeTransition.js +64 -0
  55. package/src/core/SceneManager/MaskTransition.js +234 -0
  56. package/src/core/SceneManager/Scene.js +221 -0
  57. package/src/core/SceneManager/SceneManager.js +658 -0
  58. package/src/core/SceneManager/SceneState.js +29 -0
  59. package/src/core/SceneManager/SlideTransition.js +113 -0
  60. package/src/core/SceneManager/Transition.js +102 -0
  61. package/src/core/SceneManager/ZoomTransition.js +119 -0
  62. package/src/core/SceneManager/index.js +12 -0
  63. package/src/core/SpriteGPULayer/SpriteGPULayer.js +321 -0
  64. package/src/core/SpriteGPULayer/SpriteGPULayerTypes.js +49 -0
  65. package/src/core/SpriteGPULayer/index.js +11 -0
  66. package/src/core/Timeline/Clip.js +101 -0
  67. package/src/core/Timeline/DefaultConfig.js +41 -0
  68. package/src/core/Timeline/Easing.js +176 -0
  69. package/src/core/Timeline/Timeline.js +458 -0
  70. package/src/core/Timeline/TimelineTypes.js +89 -0
  71. package/src/core/Timeline/Track.js +202 -0
  72. package/src/core/Timeline/index.js +22 -0
  73. package/src/errors/ConfigError.js +47 -0
  74. package/src/errors/LifecycleError.js +58 -0
  75. package/src/errors/NimbusError.js +43 -0
  76. package/src/errors/PluginError.js +138 -0
  77. package/src/errors/ResourceError.js +166 -0
  78. package/src/errors/SceneError.js +124 -0
  79. package/src/errors/SubsystemError.js +68 -0
  80. package/src/errors/index.js +53 -0
  81. package/src/index.js +86 -0
  82. package/src/types/index.js +141 -0
  83. package/src/utils/MemoryChecker.js +374 -0
  84. package/src/utils/Validator.js +60 -0
  85. package/src/utils/index.js +84 -0
@@ -0,0 +1,234 @@
1
+ // ============================================================================
2
+ // Nimbus2D - Logger 日志系统
3
+ // ----------------------------------------------------------------------------
4
+ // 职责:
5
+ // 1. 四级日志:debug/info/warn/error
6
+ // 2. 级别控制:DEBUG=0/INFO=1/WARN=2/ERROR=3/NONE=4
7
+ // 3. 对象型 handler:{ level, handle(level, message, context) }
8
+ // 4. 内置 ConsoleHandler(默认,明确实现 handle 方法)
9
+ // 5. 双通道广播(this.emit('log') + this._eventBus.emit('log'))
10
+ //
11
+ // 继承关系:
12
+ // EventEmitter → Subsystem → Logger(Lifecycle 内第一个初始化)
13
+ // ============================================================================
14
+
15
+ import { Subsystem } from '../../base/Subsystem.js'
16
+ import { LogLevel } from './LogLevel.js'
17
+ import { ConsoleHandler } from './ConsoleHandler.js'
18
+
19
+ class Logger extends Subsystem {
20
+ /**
21
+ * 构造函数
22
+ * 注意:Logger 不传 logger 参数给 super(),Logger 自身就是 logger
23
+ * 内部调用 super(eventBus, config, null),然后 this._logger = this
24
+ * @param {import('../EventBus/EventBus.js').EventBus} eventBus - 全局事件总线
25
+ * @param {import('../ConfigSystem/ConfigSystem.js').ConfigSystem} config - 配置系统
26
+ */
27
+ constructor(eventBus, config) {
28
+ super(eventBus, config, null)
29
+
30
+ // Logger 自身就是 logger,设置 _logger = this
31
+ this._logger = this
32
+
33
+ /** @type {number} 当前日志级别 */
34
+ this._level = LogLevel.INFO
35
+
36
+ /** @type {LogHandler[]} 处理器列表 */
37
+ this._handlers = []
38
+
39
+ /** @type {Function|null} 配置监听取消函数 */
40
+ this._unwatchLevel = null
41
+ }
42
+
43
+ // --------------------------------------------------------------------------
44
+ // 日志方法
45
+ // --------------------------------------------------------------------------
46
+
47
+ /**
48
+ * DEBUG 级别日志
49
+ * @param {string} message - 消息
50
+ * @param {Object} [context={}] - 上下文
51
+ */
52
+ debug(message, context = {}) {
53
+ this.log(LogLevel.DEBUG, message, context)
54
+ }
55
+
56
+ /**
57
+ * INFO 级别日志
58
+ * @param {string} message - 消息
59
+ * @param {Object} [context={}] - 上下文
60
+ */
61
+ info(message, context = {}) {
62
+ this.log(LogLevel.INFO, message, context)
63
+ }
64
+
65
+ /**
66
+ * WARN 级别日志
67
+ * @param {string} message - 消息
68
+ * @param {Object} [context={}] - 上下文
69
+ */
70
+ warn(message, context = {}) {
71
+ this.log(LogLevel.WARN, message, context)
72
+ }
73
+
74
+ /**
75
+ * ERROR 级别日志
76
+ * @param {string} message - 消息
77
+ * @param {Object} [context={}] - 上下文
78
+ */
79
+ error(message, context = {}) {
80
+ this.log(LogLevel.ERROR, message, context)
81
+ }
82
+
83
+ /**
84
+ * 通用日志方法
85
+ * @param {number} level - 日志级别
86
+ * @param {string} message - 消息
87
+ * @param {Object} [context={}] - 上下文
88
+ */
89
+ log(level, message, context = {}) {
90
+ if (!this.isEnabledFor(level)) return
91
+
92
+ // 1. 调用所有 handler
93
+ for (const handler of this._handlers) {
94
+ try {
95
+ handler.handle(level, message, context)
96
+ } catch (e) {
97
+ // handler 错误不中断其他 handler
98
+ }
99
+ }
100
+
101
+ // 2. 双通道广播日志事件
102
+ // 通道 A:Logger 自身 emit(局部监听)
103
+ this.emit('log', { level, message, context })
104
+ // 通道 B:EventBus 广播(全局监听)
105
+ if (this._eventBus) {
106
+ try {
107
+ this._eventBus.emit('log', { level, message, context, logger: this.name })
108
+ } catch (e) {
109
+ // EventBus 错误不影响日志流程
110
+ }
111
+ }
112
+ }
113
+
114
+ // --------------------------------------------------------------------------
115
+ // 级别控制
116
+ // --------------------------------------------------------------------------
117
+
118
+ /**
119
+ * 设置日志级别
120
+ * @param {number} level - 日志级别(LogLevel 枚举值)
121
+ */
122
+ setLevel(level) {
123
+ const oldLevel = this._level
124
+ this._level = level
125
+ this.emit('level:change', { oldLevel, newLevel: level })
126
+ }
127
+
128
+ /**
129
+ * 获取当前日志级别
130
+ * @returns {number}
131
+ */
132
+ getLevel() {
133
+ return this._level
134
+ }
135
+
136
+ /**
137
+ * 检查指定级别是否启用
138
+ * @param {number} level - 日志级别
139
+ * @returns {boolean}
140
+ */
141
+ isEnabledFor(level) {
142
+ return level >= this._level
143
+ }
144
+
145
+ // --------------------------------------------------------------------------
146
+ // Handler 管理
147
+ // --------------------------------------------------------------------------
148
+
149
+ /**
150
+ * 添加 handler
151
+ * @param {LogHandler} handler - 处理器实例
152
+ */
153
+ addHandler(handler) {
154
+ if (this._handlers.includes(handler)) return
155
+ this._handlers.push(handler)
156
+ this.emit('handler:added', { handler })
157
+ }
158
+
159
+ /**
160
+ * 移除 handler
161
+ * @param {LogHandler} handler - 处理器实例
162
+ */
163
+ removeHandler(handler) {
164
+ const idx = this._handlers.indexOf(handler)
165
+ if (idx !== -1) {
166
+ this._handlers.splice(idx, 1)
167
+ this.emit('handler:removed', { handler })
168
+ }
169
+ }
170
+
171
+ /**
172
+ * 获取所有 handler
173
+ * @returns {LogHandler[]}
174
+ */
175
+ getHandlers() {
176
+ return [...this._handlers]
177
+ }
178
+
179
+ /**
180
+ * 清空所有 handler
181
+ */
182
+ clearHandlers() {
183
+ this._handlers = []
184
+ }
185
+
186
+ // --------------------------------------------------------------------------
187
+ // 生命周期(继承自 Subsystem)
188
+ // --------------------------------------------------------------------------
189
+
190
+ /**
191
+ * 初始化:自动注册 ConsoleHandler,监听 ConfigSystem
192
+ * @returns {Promise<void>}
193
+ */
194
+ async initialize() {
195
+ await super.initialize()
196
+
197
+ // 自动注册 ConsoleHandler
198
+ this.addHandler(new ConsoleHandler())
199
+
200
+ // 监听 ConfigSystem 变化
201
+ if (this._config) {
202
+ this._unwatchLevel = this._config.watch('modules.logger.level', (newValue) => {
203
+ if (typeof newValue === 'number') {
204
+ this.setLevel(newValue)
205
+ }
206
+ })
207
+
208
+ // 初始化级别
209
+ const configLevel = this._config.get('modules.logger.level')
210
+ if (typeof configLevel === 'number') {
211
+ this.setLevel(configLevel)
212
+ }
213
+ }
214
+ }
215
+
216
+ /**
217
+ * 销毁:清理 handler 和配置监听
218
+ * @returns {Promise<void>}
219
+ */
220
+ async destroy() {
221
+ // 取消配置监听
222
+ if (this._unwatchLevel) {
223
+ this._unwatchLevel()
224
+ this._unwatchLevel = null
225
+ }
226
+
227
+ // 清理 handler
228
+ this._handlers = []
229
+
230
+ await super.destroy()
231
+ }
232
+ }
233
+
234
+ export { Logger }
@@ -0,0 +1,8 @@
1
+ // ============================================================================
2
+ // Nimbus2D - Logger 模块统一导出
3
+ // ============================================================================
4
+
5
+ export { Logger } from './Logger.js'
6
+ export { LogLevel } from './LogLevel.js'
7
+ export { LogHandler } from './LogHandler.js'
8
+ export { ConsoleHandler } from './ConsoleHandler.js'
@@ -0,0 +1,156 @@
1
+ // ============================================================================
2
+ // Nimbus2D - 插件基类
3
+ // ----------------------------------------------------------------------------
4
+ // 所有插件必须继承此基类,提供安装/卸载/更新生命周期。
5
+ //
6
+ // 设计决策:
7
+ // - 独立设计(不继承任何类)
8
+ // - name getter 必须由子类实现
9
+ // - install/uninstall 可返回 Promise(支持异步安装)
10
+ // - update 可选重写
11
+ // - 静态 isPlugin 检查方法
12
+ // ============================================================================
13
+
14
+ class Plugin {
15
+ /**
16
+ * 构造函数
17
+ */
18
+ constructor() {
19
+ // 基类无状态
20
+ }
21
+
22
+ // --------------------------------------------------------------------------
23
+ // 元信息(子类必须实现 name,其他可选)
24
+ // --------------------------------------------------------------------------
25
+
26
+ /**
27
+ * 插件名称(必须重写,不实现抛错)
28
+ * @type {string}
29
+ */
30
+ get name() {
31
+ throw new Error('Plugin.name 必须由子类实现')
32
+ }
33
+
34
+ /**
35
+ * 插件版本,默认 '1.0.0'
36
+ * @type {string}
37
+ */
38
+ get version() {
39
+ return '1.0.0'
40
+ }
41
+
42
+ /**
43
+ * 依赖插件名数组,默认 []
44
+ * @type {string[]}
45
+ */
46
+ get dependencies() {
47
+ return []
48
+ }
49
+
50
+ /**
51
+ * 插件描述,默认 ''
52
+ * @type {string}
53
+ */
54
+ get description() {
55
+ return ''
56
+ }
57
+
58
+ // --------------------------------------------------------------------------
59
+ // 生命周期方法(子类重写)
60
+ // --------------------------------------------------------------------------
61
+
62
+ /**
63
+ * 安装插件
64
+ * @param {object} app - Application 实例
65
+ * @param {Object} [options={}] - 插件配置
66
+ * @returns {void|Promise<void>}
67
+ */
68
+ install(app, options = {}) {
69
+ // 基类空实现,子类按需重写
70
+ }
71
+
72
+ /**
73
+ * 卸载插件
74
+ * @param {object} app - Application 实例
75
+ * @returns {void|Promise<void>}
76
+ */
77
+ uninstall(app) {
78
+ // 基类空实现,子类按需重写
79
+ }
80
+
81
+ /**
82
+ * 每帧更新(可选重写)
83
+ * @param {number} delta - 帧间隔(秒)
84
+ * @param {object} app - Application 实例
85
+ */
86
+ update(delta, app) {
87
+ // 基类空实现,子类按需重写
88
+ }
89
+
90
+ // --------------------------------------------------------------------------
91
+ // 生命周期钩子(三期新增,子类可重写,默认空实现)
92
+ // 钩子执行顺序:beforeInstall → install → afterInstall
93
+ // beforeUninstall → uninstall → afterUninstall
94
+ // --------------------------------------------------------------------------
95
+
96
+ /**
97
+ * 安装前钩子(在 install() 调用前执行)
98
+ * 用于安装前的校验、资源预加载等准备工作
99
+ * @param {Object} [options={}] - 插件配置
100
+ * @returns {void|Promise<void>}
101
+ */
102
+ onBeforeInstall(options = {}) {
103
+ // 基类空实现,子类按需重写
104
+ }
105
+
106
+ /**
107
+ * 安装后钩子(在 install() 调用后执行)
108
+ * 用于安装后的初始化、事件注册等后续操作
109
+ * @param {Object} [options={}] - 插件配置
110
+ * @returns {void|Promise<void>}
111
+ */
112
+ onAfterInstall(options = {}) {
113
+ // 基类空实现,子类按需重写
114
+ }
115
+
116
+ /**
117
+ * 卸载前钩子(在 uninstall() 调用前执行)
118
+ * 用于卸载前的资源保存、通知发送等清理准备
119
+ * @param {Object} [context={}] - 钩子上下文
120
+ * @param {string} [context.name] - 插件名称
121
+ * @param {Plugin} [context.plugin] - 插件实例
122
+ * @param {object} [context.app] - Application 实例(供需要访问应用的清理逻辑使用)
123
+ * @returns {void|Promise<void>}
124
+ */
125
+ onBeforeUninstall(context = {}) {
126
+ // 基类空实现,子类按需重写
127
+ }
128
+
129
+ /**
130
+ * 卸载后钩子(在 uninstall() 调用后执行)
131
+ * 用于卸载后的最终清理、日志记录等收尾操作
132
+ * @param {Object} [context={}] - 钩子上下文
133
+ * @param {string} [context.name] - 插件名称
134
+ * @param {Plugin} [context.plugin] - 插件实例
135
+ * @param {object} [context.app] - Application 实例(供需要访问应用的收尾逻辑使用)
136
+ * @returns {void|Promise<void>}
137
+ */
138
+ onAfterUninstall(context = {}) {
139
+ // 基类空实现,子类按需重写
140
+ }
141
+
142
+ // --------------------------------------------------------------------------
143
+ // 静态方法
144
+ // --------------------------------------------------------------------------
145
+
146
+ /**
147
+ * 检查对象是否为 Plugin 实例
148
+ * @param {any} obj - 待检查对象
149
+ * @returns {boolean}
150
+ */
151
+ static isPlugin(obj) {
152
+ return obj instanceof Plugin
153
+ }
154
+ }
155
+
156
+ export { Plugin }
@@ -0,0 +1,102 @@
1
+ // ============================================================================
2
+ // Nimbus2D - 插件条目类
3
+ // ----------------------------------------------------------------------------
4
+ // 封装插件注册条目的状态与元数据,公开辅助类。
5
+ //
6
+ // 设计决策:
7
+ // - 公开导出,用户可访问
8
+ // - setState 和 markInstalled 仅供 PluginSystem 内部调用
9
+ // - 所有字段通过只读 getter 暴露
10
+ // ============================================================================
11
+
12
+ import { PluginState } from './PluginState.js'
13
+
14
+ class PluginEntry {
15
+ /**
16
+ * 构造函数
17
+ * @param {import('./Plugin.js').Plugin} plugin - 插件实例
18
+ * @param {Object} [options={}] - 插件配置
19
+ */
20
+ constructor(plugin, options = {}) {
21
+ /** @type {import('./Plugin.js').Plugin} 插件实例 */
22
+ this._plugin = plugin
23
+
24
+ /** @type {string} 插件名称 */
25
+ this._name = plugin.name
26
+
27
+ /** @type {PluginState} 插件状态 */
28
+ this._state = PluginState.REGISTERED
29
+
30
+ /** @type {Object} 插件配置 */
31
+ this._options = options
32
+
33
+ /** @type {string[]} 依赖列表 */
34
+ this._dependencies = plugin.dependencies || []
35
+
36
+ /** @type {number|null} 安装时间戳 */
37
+ this._installTime = null
38
+ }
39
+
40
+ // --------------------------------------------------------------------------
41
+ // 只读 Getter
42
+ // --------------------------------------------------------------------------
43
+
44
+ /** @type {import('./Plugin.js').Plugin} 插件实例 */
45
+ get plugin() { return this._plugin }
46
+
47
+ /** @type {string} 插件名称 */
48
+ get name() { return this._name }
49
+
50
+ /** @type {PluginState} 插件状态 */
51
+ get state() { return this._state }
52
+
53
+ /** @type {Object} 插件配置 */
54
+ get options() { return this._options }
55
+
56
+ /** @type {string[]} 依赖列表 */
57
+ get dependencies() { return this._dependencies }
58
+
59
+ /** @type {number|null} 安装时间戳 */
60
+ get installTime() { return this._installTime }
61
+
62
+ // --------------------------------------------------------------------------
63
+ // 状态变更方法(仅 PluginSystem 内部调用)
64
+ // --------------------------------------------------------------------------
65
+
66
+ /**
67
+ * 设置插件状态
68
+ * @param {PluginState} newState - 新状态
69
+ */
70
+ setState(newState) {
71
+ this._state = newState
72
+ }
73
+
74
+ /**
75
+ * 标记为已安装(同时记录 installTime)
76
+ */
77
+ markInstalled() {
78
+ this._state = PluginState.INSTALLED
79
+ this._installTime = Date.now()
80
+ }
81
+
82
+ /**
83
+ * 重置安装时间戳(卸载时调用,通过公共方法避免外部直接访问私有属性)
84
+ */
85
+ resetInstallTime() {
86
+ this._installTime = null
87
+ }
88
+
89
+ // --------------------------------------------------------------------------
90
+ // 工具方法
91
+ // --------------------------------------------------------------------------
92
+
93
+ /**
94
+ * 返回字符串表示
95
+ * @returns {string}
96
+ */
97
+ toString() {
98
+ return `PluginEntry(name=${this._name}, state=${this._state})`
99
+ }
100
+ }
101
+
102
+ export { PluginEntry }
@@ -0,0 +1,30 @@
1
+ // ============================================================================
2
+ // Nimbus2D - 插件状态枚举
3
+ // ----------------------------------------------------------------------------
4
+ // 定义插件的所有合法状态。
5
+ //
6
+ // 状态转换流程:
7
+ // 无 → REGISTERED → INSTALLING → INSTALLED → UNINSTALLING → UNREGISTERED
8
+ // 任何状态都可能因异常进入 ERROR 状态
9
+ // ============================================================================
10
+
11
+ /**
12
+ * 插件状态枚举
13
+ * @enum {string}
14
+ */
15
+ const PluginState = {
16
+ /** 已注册(仅注册未安装) */
17
+ REGISTERED: 'REGISTERED',
18
+ /** 安装中 */
19
+ INSTALLING: 'INSTALLING',
20
+ /** 已安装 */
21
+ INSTALLED: 'INSTALLED',
22
+ /** 卸载中 */
23
+ UNINSTALLING: 'UNINSTALLING',
24
+ /** 已注销 */
25
+ UNREGISTERED: 'UNREGISTERED',
26
+ /** 错误状态 */
27
+ ERROR: 'ERROR'
28
+ }
29
+
30
+ export { PluginState }