Initial commit of 001code-html Scratch frontend project.
Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
163
scratch-gui/static/js/pyodideWorker.js
Normal file
163
scratch-gui/static/js/pyodideWorker.js
Normal file
@@ -0,0 +1,163 @@
|
||||
// pyodideWorker.js
|
||||
|
||||
importScripts("../pyodide/pyodide.js");
|
||||
usecdn = true
|
||||
// 确定 indexURL 的值
|
||||
let indexURL;
|
||||
if (usecdn) {
|
||||
indexURL = 'https://oss.eanic.cn/001_code_python_res_20241213/pyodide/';
|
||||
} else {
|
||||
indexURL = "../pyodide/";
|
||||
}
|
||||
|
||||
// 初始化 Pyodide
|
||||
let pyodideReadyPromise = loadPyodide({
|
||||
indexURL: indexURL
|
||||
});
|
||||
|
||||
// 定义一个 Map 来存储所有的 pending 请求
|
||||
let pendingRequests = new Map();
|
||||
let requestIdCounter = 0;
|
||||
|
||||
pyodideReadyPromise.then(() => {
|
||||
self.postMessage({ type: "finish", message: "Pyodide 加载完成" });
|
||||
});
|
||||
|
||||
// 定义一个 JavaScript 函数,用于接收来自 Python 的调用
|
||||
|
||||
self.unitydata = {};
|
||||
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
// 定义发送 setTag 的函数
|
||||
function send_setTag(line) {
|
||||
self.postMessage({ type: "setTag", line: line });
|
||||
}
|
||||
|
||||
// #-------------------角色相关----------------------#
|
||||
// #playerMove(step),移动角色,参数step为整数
|
||||
// #playerJump() 向右前跳跃
|
||||
// #turnLeft(times) 向左转动角色,参数times为整数代表次数
|
||||
// #turnRight(times) 向右转动角色,参数times为整数代表次数
|
||||
// #player_position() 获取角色坐标,x y代表 x y坐标,坐标为整数
|
||||
// #-------------------载具相关----------------------#
|
||||
// #vehicleMove(step),移动载具,参数step为整数
|
||||
// #turnVehicleLeft(times) 向左转动载具,参数times为整数代表次数
|
||||
// #turnVehicleRight(times) 向右转动载具,参数times为整数代表次数
|
||||
// #vehicle_position() 获取坐标,x y代表 x y坐标,坐标为整数
|
||||
// #-----------------------------------------------#
|
||||
|
||||
async function playerMove(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "playerMove", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function playerJump() {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "playerJump", requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function turnLeft(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "turnLeft", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function turnRight(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "turnRight", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function cmdPrint(text) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "cmdPrint", text: text, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function vehicleMove(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "vehicleMove", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function turnVehicleLeft(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "turnVehicleLeft", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function turnVehicleRight(value) {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "turnVehicleRight", step: value, requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
async function scriptRunOver() {
|
||||
const requestId = ++requestIdCounter;
|
||||
return new Promise((resolve, reject) => {
|
||||
pendingRequests.set(requestId, { resolve, reject });
|
||||
self.postMessage({ type: "scriptRunOver", requestId: requestId });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
self.onmessage = async (event) => {
|
||||
const { type, code, unity_data, requestId} = event.data;
|
||||
if (type === "response") {
|
||||
self.unitydata = unity_data
|
||||
console.log("get new response", self.unitydata.externalDatas[0].position)
|
||||
const pending = pendingRequests.get(requestId);
|
||||
if (pending) {
|
||||
pending.resolve();
|
||||
pendingRequests.delete(requestId);
|
||||
console.log('收到回调',requestId)
|
||||
}
|
||||
} else if (type === "runPython") {
|
||||
try {
|
||||
let pyodide = await pyodideReadyPromise;
|
||||
await pyodide.registerJsModule("send_setTag", send_setTag);
|
||||
await pyodide.registerJsModule("playerMove", playerMove);
|
||||
await pyodide.registerJsModule("playerJump", playerJump);
|
||||
await pyodide.registerJsModule("turnLeft", turnLeft);
|
||||
await pyodide.registerJsModule("turnRight", turnRight);
|
||||
await pyodide.registerJsModule("cmdPrint", cmdPrint);
|
||||
await pyodide.registerJsModule("vehicleMove", vehicleMove);
|
||||
await pyodide.registerJsModule("turnVehicleLeft", turnVehicleLeft);
|
||||
await pyodide.registerJsModule("turnVehicleRight", turnVehicleRight);
|
||||
await pyodide.registerJsModule("scriptRunOver", scriptRunOver);
|
||||
|
||||
console.log(code)
|
||||
let result = await pyodide.runPythonAsync(code);
|
||||
|
||||
// 发送执行完成的消息
|
||||
self.postMessage({ type: "executionComplete" });
|
||||
console.log("Python 执行完成",window.isPythonRun);
|
||||
self.postMessage({ type: "result", result });
|
||||
} catch (error) {
|
||||
self.postMessage({ type: "error", error: error.message });
|
||||
// 发生错误时也要发送执行完成的消息
|
||||
self.postMessage({ type: "executionComplete" });
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user