fix(worker-generator): 映射文件不再放入 workers 目录避免微信编译错误
This commit is contained in:
175
examples/wechat-worker-demo/workers/physics-worker.js
Normal file
175
examples/wechat-worker-demo/workers/physics-worker.js
Normal file
@@ -0,0 +1,175 @@
|
||||
/**
|
||||
* Auto-generated Worker file for PhysicsWorkerSystem
|
||||
* 自动生成的 Worker 文件
|
||||
*
|
||||
* Source: F:/ecs-framework/examples/wechat-worker-demo/src/systems/PhysicsWorkerSystem.ts
|
||||
* Generated by @esengine/worker-generator
|
||||
*
|
||||
* 使用方式 | Usage:
|
||||
* 1. 将此文件放入 workers/ 目录
|
||||
* 2. 在 game.json 中配置 "workers": "workers"
|
||||
* 3. 在 System 中配置 workerScriptPath: 'workers/physics-worker-system-worker.js'
|
||||
*/
|
||||
|
||||
// 微信小游戏 Worker 环境
|
||||
// WeChat Mini Game Worker environment
|
||||
let sharedFloatArray = null;
|
||||
const ENTITY_DATA_SIZE = 9;
|
||||
|
||||
worker.onMessage(function(res) {
|
||||
// 微信小游戏 Worker 消息直接传递数据,不需要 .data
|
||||
// WeChat Mini Game Worker passes data directly, no .data wrapper
|
||||
var type = res.type;
|
||||
var id = res.id;
|
||||
var entities = res.entities;
|
||||
var deltaTime = res.deltaTime;
|
||||
var systemConfig = res.systemConfig;
|
||||
var startIndex = res.startIndex;
|
||||
var endIndex = res.endIndex;
|
||||
var sharedBuffer = res.sharedBuffer;
|
||||
|
||||
try {
|
||||
// 处理 SharedArrayBuffer 初始化
|
||||
// Handle SharedArrayBuffer initialization
|
||||
if (type === 'init' && sharedBuffer) {
|
||||
sharedFloatArray = new Float32Array(sharedBuffer);
|
||||
worker.postMessage({ type: 'init', success: true });
|
||||
return;
|
||||
}
|
||||
|
||||
// 处理 SharedArrayBuffer 数据
|
||||
// Handle SharedArrayBuffer data
|
||||
if (type === 'shared' && sharedFloatArray) {
|
||||
processSharedArrayBuffer(startIndex, endIndex, deltaTime, systemConfig);
|
||||
worker.postMessage({ id: id, result: null });
|
||||
return;
|
||||
}
|
||||
|
||||
// 传统处理方式
|
||||
// Traditional processing
|
||||
if (entities) {
|
||||
var result = workerProcess(entities, deltaTime, systemConfig);
|
||||
|
||||
// 处理 Promise 返回值
|
||||
// Handle Promise return value
|
||||
if (result && typeof result.then === 'function') {
|
||||
result.then(function(finalResult) {
|
||||
worker.postMessage({ id: id, result: finalResult });
|
||||
}).catch(function(error) {
|
||||
worker.postMessage({ id: id, error: error.message });
|
||||
});
|
||||
} else {
|
||||
worker.postMessage({ id: id, result: result });
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
worker.postMessage({ id: id, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 实体处理函数 - 从 PhysicsWorkerSystem.workerProcess 提取
|
||||
* Entity processing function - extracted from PhysicsWorkerSystem.workerProcess
|
||||
*/
|
||||
function workerProcess(entities, deltaTime, config) {
|
||||
var __assign = (this && this.__assign) || function () {
|
||||
__assign = Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
return __assign.apply(this, arguments);
|
||||
};
|
||||
var gravity = config.gravity;
|
||||
var canvasWidth = config.canvasWidth;
|
||||
var canvasHeight = config.canvasHeight;
|
||||
var groundFriction = config.groundFriction;
|
||||
// 复制实体数组避免修改原数据
|
||||
// Copy entity array to avoid modifying original data
|
||||
var result = entities.map(function (e) { return (__assign({}, e)); });
|
||||
// 物理更新
|
||||
// Physics update
|
||||
for (var i = 0; i < result.length; i++) {
|
||||
var entity = result[i];
|
||||
// 应用重力
|
||||
// Apply gravity
|
||||
entity.dy += gravity * deltaTime;
|
||||
// 更新位置
|
||||
// Update position
|
||||
entity.x += entity.dx * deltaTime;
|
||||
entity.y += entity.dy * deltaTime;
|
||||
// 边界碰撞
|
||||
// Boundary collision
|
||||
if (entity.x <= entity.radius) {
|
||||
entity.x = entity.radius;
|
||||
entity.dx = -entity.dx * entity.bounce;
|
||||
}
|
||||
else if (entity.x >= canvasWidth - entity.radius) {
|
||||
entity.x = canvasWidth - entity.radius;
|
||||
entity.dx = -entity.dx * entity.bounce;
|
||||
}
|
||||
if (entity.y <= entity.radius) {
|
||||
entity.y = entity.radius;
|
||||
entity.dy = -entity.dy * entity.bounce;
|
||||
}
|
||||
else if (entity.y >= canvasHeight - entity.radius) {
|
||||
entity.y = canvasHeight - entity.radius;
|
||||
entity.dy = -entity.dy * entity.bounce;
|
||||
entity.dx *= groundFriction;
|
||||
}
|
||||
// 空气阻力
|
||||
// Air friction
|
||||
entity.dx *= entity.friction;
|
||||
entity.dy *= entity.friction;
|
||||
}
|
||||
// 简单碰撞检测
|
||||
// Simple collision detection
|
||||
for (var i = 0; i < result.length; i++) {
|
||||
for (var j = i + 1; j < result.length; j++) {
|
||||
var ball1 = result[i];
|
||||
var ball2 = result[j];
|
||||
var dx = ball2.x - ball1.x;
|
||||
var dy = ball2.y - ball1.y;
|
||||
var distance = Math.sqrt(dx * dx + dy * dy);
|
||||
var minDistance = ball1.radius + ball2.radius;
|
||||
if (distance < minDistance && distance > 0) {
|
||||
// 分离两个球
|
||||
// Separate two balls
|
||||
var nx = dx / distance;
|
||||
var ny = dy / distance;
|
||||
var overlap = minDistance - distance;
|
||||
ball1.x -= nx * overlap * 0.5;
|
||||
ball1.y -= ny * overlap * 0.5;
|
||||
ball2.x += nx * overlap * 0.5;
|
||||
ball2.y += ny * overlap * 0.5;
|
||||
// 弹性碰撞
|
||||
// Elastic collision
|
||||
var relVx = ball2.dx - ball1.dx;
|
||||
var relVy = ball2.dy - ball1.dy;
|
||||
var velAlongNormal = relVx * nx + relVy * ny;
|
||||
if (velAlongNormal > 0)
|
||||
continue;
|
||||
var restitution = (ball1.bounce + ball2.bounce) * 0.5;
|
||||
var impulse = -(1 + restitution) * velAlongNormal / (1 / ball1.mass + 1 / ball2.mass);
|
||||
ball1.dx -= impulse * nx / ball1.mass;
|
||||
ball1.dy -= impulse * ny / ball1.mass;
|
||||
ball2.dx += impulse * nx / ball2.mass;
|
||||
ball2.dy += impulse * ny / ball2.mass;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* SharedArrayBuffer 处理函数
|
||||
* SharedArrayBuffer processing function
|
||||
*/
|
||||
function processSharedArrayBuffer(startIndex, endIndex, deltaTime, systemConfig) {
|
||||
if (!sharedFloatArray) return;
|
||||
// No SharedArrayBuffer processing defined
|
||||
}
|
||||
6
examples/wechat-worker-demo/workers/worker-mapping.json
Normal file
6
examples/wechat-worker-demo/workers/worker-mapping.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"generatedAt": "2025-12-08T09:57:08.855Z",
|
||||
"mappings": {
|
||||
"PhysicsWorkerSystem": "physics-worker.js"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user