light-h5-core-lib 2.10.10 → 2.11.0

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.
package/LightCore.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.MapUtil = exports.CollisionDetectionUtil = exports.SelfDecrypt = exports.GetDecorateUtils = exports.NumberUtil = exports.BooleanUtil = exports.Crc32Util = exports.PromiseUtil = exports.BeizerUtil = exports.UniqueIDUtil = exports.StringUtil = exports.RandomNumUtil = exports.FloatDigitUtil = exports.DateUtil = exports.BitUtil = exports.MD5 = exports.BaseSingleton = exports.SetterGetterBase = exports.ClassNameUtil = exports.PoolObj = exports.PoolObjPutStatus = void 0;
6
+ exports.MapUtil = exports.CollisionDetectionUtil = exports.SelfDecrypt = exports.GetDecorateUtils = exports.NumberUtil = exports.BooleanUtil = exports.Crc32Util = exports.PromiseUtil = exports.BeizerUtil = exports.UniqueIDUtil = exports.StringUtil = exports.RandomNumUtil = exports.FloatDigitUtil = exports.DateUtil = exports.BitUtil = exports.MD5 = exports.BaseSingleton = exports.SetterGetterBase = exports.ClassNameUtil = exports.PoolObj = exports.PoolObjPutStatus = exports.BeizerPositionsLerpUtil = void 0;
7
7
  const PoolObj_1 = require("./pool/PoolObj");
8
8
  Object.defineProperty(exports, "PoolObj", { enumerable: true, get: function () { return PoolObj_1.PoolObj; } });
9
9
  const BaseSingleton_1 = require("./common/base/BaseSingleton");
@@ -46,7 +46,10 @@ const MapUtil_1 = require("./common/util/MapUtil");
46
46
  Object.defineProperty(exports, "MapUtil", { enumerable: true, get: function () { return MapUtil_1.MapUtil; } });
47
47
  const PoolObjPutStatus_1 = require("./pool/PoolObjPutStatus");
48
48
  Object.defineProperty(exports, "PoolObjPutStatus", { enumerable: true, get: function () { return PoolObjPutStatus_1.PoolObjPutStatus; } });
49
+ const BeizerPositionsLerpUtil_1 = require("./common/util/BeizerPositionsLerpUtil");
50
+ Object.defineProperty(exports, "BeizerPositionsLerpUtil", { enumerable: true, get: function () { return BeizerPositionsLerpUtil_1.BeizerPositionsLerpUtil; } });
49
51
  module.exports = {
52
+ BeizerPositionsLerpUtil: BeizerPositionsLerpUtil_1.BeizerPositionsLerpUtil,
50
53
  PoolObjPutStatus: PoolObjPutStatus_1.PoolObjPutStatus,
51
54
  PoolObj: PoolObj_1.PoolObj,
52
55
  ClassNameUtil: ClassNameUtil_1.ClassNameUtil,
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BeizerPositionsLerpUtil = void 0;
4
+ /**
5
+ * 贝塞尔曲线坐标点插值算法
6
+ * @author Aonaufly
7
+ */
8
+ class BeizerPositionsLerpUtil {
9
+ /**
10
+ * 根据开始坐标和结束坐标计算整个贝塞尔曲线的坐标点集合
11
+ * @param startPosition 开始坐标
12
+ * @param endPosition 结束坐标
13
+ * @param addCount 再添加的坐标点数(startPosition + addCount + endPosition) default 1
14
+ * @param amplitude 幅度(1: 最大为开始坐标与结束坐标的距离的一半)default 0.4
15
+ * @param distanceMultiple 距离倍数(1=线段内, >1则控制点可向两端外延,如1.5=两端各外延0.25倍线段长度)default 1.0
16
+ * @returns 控制点集合
17
+ */
18
+ static generateControlPoints(startPosition, endPosition, addCount = 1, amplitude = 0.4, distanceMultiple = 1.0) {
19
+ const result = [{ x: startPosition.x, y: startPosition.y }];
20
+ if (addCount <= 0) {
21
+ result.push({ x: endPosition.x, y: endPosition.y });
22
+ return result;
23
+ }
24
+ // 连接线方向向量
25
+ const dx = endPosition.x - startPosition.x;
26
+ const dy = endPosition.y - startPosition.y;
27
+ const len = Math.sqrt(dx * dx + dy * dy);
28
+ if (len < 0.000001) {
29
+ // 起点与终点重合,直接返回
30
+ for (let i = 0; i < addCount; i++) {
31
+ result.push({ x: startPosition.x, y: startPosition.y });
32
+ }
33
+ result.push({ x: endPosition.x, y: endPosition.y });
34
+ return result;
35
+ }
36
+ // 单位方向向量
37
+ const ux = dx / len;
38
+ const uy = dy / len;
39
+ // 垂直方向向量(法向量),旋转90度
40
+ const nx = -uy;
41
+ const ny = ux;
42
+ // 添加点到连接线的最大距离:amplitude * 0.5 * 连接线长度
43
+ const maxDistance = amplitude * 0.5 * len;
44
+ // 投影延伸:distanceMultiple=1时投影范围在[0,1]内,>1时向两端外延
45
+ const extension = (distanceMultiple - 1) * 0.5;
46
+ // 上一个添加点所在的侧(1 或 -1),用于交替偏向
47
+ let prevSide = 0;
48
+ for (let i = 0; i < addCount; i++) {
49
+ // 在连接线上的投影比例 t ∈ (0, 1),均匀分布
50
+ const t = (i + 1) / (addCount + 1);
51
+ // 映射到实际投影比例:t=0时映射到-extension(起点外侧),t=1时映射到1+extension(终点外侧)
52
+ const effectiveT = t * distanceMultiple - extension;
53
+ // 投影点坐标
54
+ const px = startPosition.x + dx * effectiveT;
55
+ const py = startPosition.y + dy * effectiveT;
56
+ // 随机距离 ∈ (0, maxDistance],确保不在连接线上
57
+ const randomFactor = 0.1 + Math.random() * 0.9;
58
+ const distance = randomFactor * maxDistance;
59
+ // 选择连接线的一侧
60
+ // 若有上一个点,偏向另一侧的概率为 75%(基础50%增加50%)
61
+ // 若无上一个点(第一个添加点),各侧50%
62
+ let side;
63
+ if (prevSide === 0) {
64
+ side = Math.random() > 0.5 ? 1 : -1;
65
+ }
66
+ else {
67
+ side = Math.random() < 0.75 ? -prevSide : prevSide;
68
+ }
69
+ // 沿法向量偏移得到最终坐标
70
+ result.push({
71
+ x: px + nx * distance * side,
72
+ y: py + ny * distance * side,
73
+ });
74
+ prevSide = side;
75
+ }
76
+ result.push({ x: endPosition.x, y: endPosition.y });
77
+ return result;
78
+ }
79
+ }
80
+ exports.BeizerPositionsLerpUtil = BeizerPositionsLerpUtil;
@@ -24,6 +24,29 @@ class BeizerUtil {
24
24
  }
25
25
  return { x, y };
26
26
  }
27
+ /**
28
+ * 获得当前时间的切线(运动方向)(慎用: 耗性能)
29
+ * @param timer 时间[0,1]
30
+ * @returns 切线
31
+ */
32
+ static getTangent(points, timer) {
33
+ if (points.length < 2) {
34
+ return { x: 0, y: 0 };
35
+ }
36
+ // 导数控制点: Q_i = P_{i+1} - P_i
37
+ const derivativePoints = [];
38
+ for (let i = 0; i < points.length - 1; i++) {
39
+ derivativePoints.push({
40
+ x: points[i + 1].x - points[i].x,
41
+ y: points[i + 1].y - points[i].y,
42
+ });
43
+ }
44
+ // 在导数控制点上计算 n-2 阶贝塞尔值
45
+ const pos = BeizerUtil.getPosition(derivativePoints, timer);
46
+ // 乘以 (n-1) 得到最终切线
47
+ const n = points.length;
48
+ return { x: pos.x * (n - 1), y: pos.y * (n - 1) };
49
+ }
27
50
  //#endregion
28
51
  //region 获得路线的长度
29
52
  static distance(p1, p2) {
@@ -24,5 +24,57 @@ class MapUtil {
24
24
  keyItems = keys.next();
25
25
  }
26
26
  }
27
+ /**
28
+ * 通过Value寻找Key值
29
+ * @param targetMap 目标Map
30
+ * @param value 目标值
31
+ */
32
+ static getKeyByValue(targetMap, value) {
33
+ if (!targetMap || targetMap.size <= 0) {
34
+ return null;
35
+ }
36
+ if (!value)
37
+ return null;
38
+ const keys = targetMap.keys();
39
+ let keyItems = keys.next();
40
+ while (!keyItems.done) {
41
+ if (targetMap.get(keyItems.value) === value) {
42
+ return keyItems.value;
43
+ }
44
+ keyItems = keys.next();
45
+ }
46
+ return null;
47
+ }
48
+ /**
49
+ * 清理字典中的空Value
50
+ * @param targetMap 目标Map
51
+ * @param isNeedClearCallback 判断一个值是不是需要被删除 默认:null
52
+ */
53
+ static clearEmptyValue(targetMap, isNeedClearCallback = null) {
54
+ if (!targetMap || targetMap.size <= 0) {
55
+ return;
56
+ }
57
+ const keys = targetMap.keys();
58
+ let keyItems = keys.next();
59
+ const deleteKeys = [];
60
+ let item;
61
+ while (!keyItems.done) {
62
+ item = targetMap.get(keyItems.value);
63
+ if (!item) {
64
+ deleteKeys.push(keyItems.value);
65
+ }
66
+ else if (isNeedClearCallback) {
67
+ if (isNeedClearCallback(item)) {
68
+ deleteKeys.push(keyItems.value);
69
+ }
70
+ }
71
+ keyItems = keys.next();
72
+ }
73
+ if (deleteKeys.length <= 0)
74
+ return;
75
+ for (let i = 0; i < deleteKeys.length; i++) {
76
+ targetMap.delete(deleteKeys[i]);
77
+ }
78
+ }
27
79
  }
28
80
  exports.MapUtil = MapUtil;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "light-h5-core-lib",
3
- "version": "2.10.10",
3
+ "version": "2.11.0",
4
4
  "description": "light core lib",
5
5
  "main": "./LightCore.js",
6
6
  "types": "./type/index.d.ts",
package/pool/PoolObj.js CHANGED
@@ -9,17 +9,20 @@ const PoolObjPutStatus_1 = require("./PoolObjPutStatus");
9
9
  */
10
10
  class PoolObj {
11
11
  /**
12
- * @param cap 容量(容积) <b style="color:red">小于等于0:无限容量,慎用</b>
13
- * @param initCreateNum 初始化创建数量 <b style="color:red">(createCallback != null 有效)</b>
14
- * @param createCallback Item创建函数
15
- * @param clearCallback Item清理函数
16
- * @param destroyCallback Item销毁函数
12
+ * @param cap 容量(容积) <b style="color:red">小于等于0:无限容量,慎用</b> 默认:5
13
+ * @param initCreateNum 初始化创建数量 <b style="color:red">(createCallback != null 有效)</b> 默认: 0
14
+ * @param createCallback Item创建函数 默认: null
15
+ * @param clearCallback Item清理函数 默认: null
16
+ * @param destroyCallback Item销毁函数 默认: null
17
+ * @param isCanPutCallback Item是否可以被放入到对象池 默认: null
18
+ * @param isForceRefTypeChecking 如果放入的对象是引用对象,是否要检测重复放入的问题 默认: true
17
19
  */
18
- constructor(cap = 5, initCreateNum = 0, createCallback = null, clearCallback = null, destroyCallback = null, isForceRefTypeChecking = true) {
20
+ constructor(cap = 5, initCreateNum = 0, createCallback = null, clearCallback = null, destroyCallback = null, isCanPutCallback = null, isForceRefTypeChecking = true) {
19
21
  this._cap = cap == null ? 5 : cap;
20
22
  this._createCallback = createCallback;
21
23
  this._clearCallback = clearCallback;
22
24
  this._destroyCallback = destroyCallback;
25
+ this._isCanPutCallback = isCanPutCallback;
23
26
  this._isForceRefTypeChecking = isForceRefTypeChecking;
24
27
  this._pool = [];
25
28
  this.initCreate(initCreateNum == null ? 0 : initCreateNum);
@@ -66,6 +69,13 @@ class PoolObj {
66
69
  }
67
70
  }
68
71
  }
72
+ if (this._isCanPutCallback) {
73
+ if (!this._isCanPutCallback(obj)) {
74
+ //client阻止了放入,进行销毁处理
75
+ this._destroyCallback && this._destroyCallback(obj);
76
+ return PoolObjPutStatus_1.PoolObjPutStatus.FAILED_CLIENT_PREVENT;
77
+ }
78
+ }
69
79
  this._clearCallback && this._clearCallback(obj);
70
80
  this._pool.push(obj);
71
81
  return PoolObjPutStatus_1.PoolObjPutStatus.SUCCESS;
@@ -13,6 +13,8 @@ var PoolObjPutStatus;
13
13
  PoolObjPutStatus[PoolObjPutStatus["FAILED_NULL"] = 1] = "FAILED_NULL";
14
14
  /**失败的(超过了容量)*/
15
15
  PoolObjPutStatus[PoolObjPutStatus["FAILED_EXCEEDS_CAPACITY"] = 2] = "FAILED_EXCEEDS_CAPACITY";
16
- /**⚠:引用对象重复放置*/
16
+ /**⚠️:引用对象重复放入*/
17
17
  PoolObjPutStatus[PoolObjPutStatus["WARNING_DUPLICATE"] = 2] = "WARNING_DUPLICATE";
18
+ /**⚠️: 客户端阻止了放入*/
19
+ PoolObjPutStatus[PoolObjPutStatus["FAILED_CLIENT_PREVENT"] = 3] = "FAILED_CLIENT_PREVENT";
18
20
  })(PoolObjPutStatus || (exports.PoolObjPutStatus = PoolObjPutStatus = {}));
package/type/index.d.ts CHANGED
@@ -17,8 +17,10 @@ export declare enum PoolObjPutStatus {
17
17
  FAILED_NULL = 1,
18
18
  /**失败的(超过了容量)*/
19
19
  FAILED_EXCEEDS_CAPACITY = 2,
20
- /**⚠:引用对象重复放置*/
21
- WARNING_DUPLICATE = 2
20
+ /**⚠️:引用对象重复放入*/
21
+ WARNING_DUPLICATE = 2,
22
+ /**⚠️: 客户端阻止了放入*/
23
+ FAILED_CLIENT_PREVENT = 3
22
24
  }
23
25
  /**
24
26
  * 对象池(泛型)</br>
@@ -31,15 +33,18 @@ export declare class PoolObj<T> implements IClear {
31
33
  private _createCallback;
32
34
  private _clearCallback;
33
35
  private _destroyCallback;
36
+ private _isCanPutCallback;
34
37
  private _isForceRefTypeChecking;
35
38
  /**
36
- * @param cap 容量(容积) <b style="color:red">小于等于0:无限容量,慎用</b>
37
- * @param initCreateNum 初始化创建数量 <b style="color:red">(createCallback != null 有效)</b>
38
- * @param createCallback Item创建函数
39
- * @param clearCallback Item清理函数
40
- * @param destroyCallback Item销毁函数
39
+ * @param cap 容量(容积) <b style="color:red">小于等于0:无限容量,慎用</b> 默认:5
40
+ * @param initCreateNum 初始化创建数量 <b style="color:red">(createCallback != null 有效)</b> 默认: 0
41
+ * @param createCallback Item创建函数 默认: null
42
+ * @param clearCallback Item清理函数 默认: null
43
+ * @param destroyCallback Item销毁函数 默认: null
44
+ * @param isCanPutCallback Item是否可以被放入到对象池 默认: null
45
+ * @param isForceRefTypeChecking 如果放入的对象是引用对象,是否要检测重复放入的问题 默认: true
41
46
  */
42
- constructor(cap?: number, initCreateNum?: number, createCallback?: () => T, clearCallback?: (item: T) => void, destroyCallback?: (item: T) => void, isForceRefTypeChecking?: boolean);
47
+ constructor(cap?: number, initCreateNum?: number, createCallback?: () => T, clearCallback?: (item: T) => void, destroyCallback?: (item: T) => void, isCanPutCallback?: (item: T) => boolean, isForceRefTypeChecking?: boolean);
43
48
  /**
44
49
  * 初始化一些数量的item
45
50
  */
@@ -304,6 +309,18 @@ export declare class BeizerUtil {
304
309
  x: number;
305
310
  y: number;
306
311
  };
312
+ /**
313
+ * 获得当前时间的切线(运动方向)(慎用: 耗性能)
314
+ * @param timer 时间[0,1]
315
+ * @returns 切线
316
+ */
317
+ static getTangent(points: {
318
+ x: number;
319
+ y: number;
320
+ }[], timer: number): {
321
+ x: number;
322
+ y: number;
323
+ };
307
324
  private static calculationC;
308
325
  private static factorial;
309
326
  private static distance;
@@ -437,7 +454,7 @@ export declare class CollisionDetectionUtil {
437
454
  * @param aBox
438
455
  * @param bBox
439
456
  */
440
- static aABB(aAnchor: Vec2, bAnchor: Vec2, aBox: IBoxInfo, bBox: IBoxInfo): boolean;
457
+ static aABB(aAnchor: CoreVec2, bAnchor: CoreVec2, aBox: IBoxInfo, bBox: IBoxInfo): boolean;
441
458
  /**
442
459
  * OBB检测
443
460
  * @param aCenter A的中心位置
@@ -445,13 +462,13 @@ export declare class CollisionDetectionUtil {
445
462
  * @param aOBB
446
463
  * @param bOBB
447
464
  */
448
- static oBB(aCenter: Vec2, bCenter: Vec2, aOBB: IOBBInfo, bOBB: IOBBInfo): boolean;
465
+ static oBB(aCenter: CoreVec2, bCenter: CoreVec2, aOBB: IOBBInfo, bOBB: IOBBInfo): boolean;
449
466
  /**
450
467
  * 多边形检测
451
468
  * @param aVertices A的每个点的位置
452
469
  * @param bVertices B的每个点的位置
453
470
  */
454
- static polygon(aVertices: Vec2[], bVertices: Vec2[]): boolean;
471
+ static polygon(aVertices: CoreVec2[], bVertices: CoreVec2[]): boolean;
455
472
  /**
456
473
  * 检测旋转矩形和圆形是否相交<br>
457
474
  * <div style="color: #FF0000;">锚点都为0.5</div>
@@ -459,10 +476,10 @@ export declare class CollisionDetectionUtil {
459
476
  * @param rect 矩形
460
477
  */
461
478
  static circle2Rect(circle: {
462
- position: Vec2;
479
+ position: CoreVec2;
463
480
  radius: number;
464
481
  }, rect: {
465
- position: Vec2;
482
+ position: CoreVec2;
466
483
  width: number;
467
484
  height: number;
468
485
  angle: number;
@@ -471,10 +488,10 @@ export declare class CollisionDetectionUtil {
471
488
  * 2个圆形是否碰撞
472
489
  */
473
490
  static circle2Circle(aCircle: {
474
- position: Vec2;
491
+ position: CoreVec2;
475
492
  radius: number;
476
493
  }, bCircle: {
477
- position: Vec2;
494
+ position: CoreVec2;
478
495
  radius: number;
479
496
  }): boolean;
480
497
  /**
@@ -484,7 +501,7 @@ export declare class CollisionDetectionUtil {
484
501
  * @param ellipseAxis 椭圆轴
485
502
  * @returns
486
503
  */
487
- static IsInEllipse(pos: Vec2, centerPos: Vec2, ellipseAxis: Vec2): boolean;
504
+ static IsInEllipse(pos: CoreVec2, centerPos: CoreVec2, ellipseAxis: CoreVec2): boolean;
488
505
  }
489
506
  export interface IBoxInfo {
490
507
  x: number;
@@ -492,7 +509,7 @@ export interface IBoxInfo {
492
509
  width: number;
493
510
  height: number;
494
511
  }
495
- export interface Vec2 {
512
+ export interface CoreVec2 {
496
513
  x: number;
497
514
  y: number;
498
515
  }
@@ -575,7 +592,35 @@ export declare class MapUtil {
575
592
  * @param targetMap 目标Map
576
593
  * @param everyCallback 每次的回调
577
594
  */
578
- static all(targetMap: Map<any, any>, everyCallback: (key: any, item: any) => void): void;
595
+ static all<KEY, VALUE>(targetMap: Map<KEY, VALUE>, everyCallback: (key: KEY, item: VALUE) => void): void;
596
+ /**
597
+ * 通过Value寻找Key值
598
+ * @param targetMap 目标Map
599
+ * @param value 目标值
600
+ */
601
+ static getKeyByValue<KEY, VALUE>(targetMap: Map<KEY, VALUE>, value: VALUE): KEY;
602
+ /**
603
+ * 清理字典中的空Value
604
+ * @param targetMap 目标Map
605
+ * @param isNeedClearCallback 判断一个值是不是需要被删除 默认:null
606
+ */
607
+ static clearEmptyValue<KEY, VALUE>(targetMap: Map<KEY, VALUE>, isNeedClearCallback?: (item: VALUE) => boolean): void;
608
+ }
609
+ /**
610
+ * 贝塞尔曲线坐标点插值算法
611
+ * @author Aonaufly
612
+ */
613
+ export declare class BeizerPositionsLerpUtil {
614
+ /**
615
+ * 根据开始坐标和结束坐标计算整个贝塞尔曲线的坐标点集合
616
+ * @param startPosition 开始坐标
617
+ * @param endPosition 结束坐标
618
+ * @param addCount 再添加的坐标点数(startPosition + addCount + endPosition) default 1
619
+ * @param amplitude 幅度(1: 最大为开始坐标与结束坐标的距离的一半)default 0.4
620
+ * @param distanceMultiple 距离倍数(1=线段内, >1则控制点可向两端外延,如1.5=两端各外延0.25倍线段长度)default 1.0
621
+ * @returns 控制点集合
622
+ */
623
+ static generateControlPoints(startPosition: CoreVec2, endPosition: CoreVec2, addCount?: number, amplitude?: number, distanceMultiple?: number): CoreVec2[];
579
624
  }
580
625
 
581
626
  export {};