[MF]修改BUG,部分浏览器不运行自动化触发文件加载,添加贪吃蛇游戏控制
This commit is contained in:
parent
00f96caf05
commit
703847950c
@ -199,20 +199,40 @@ async function loadKNNModel(jsonUrl = null, binUrl = null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
const inputJson = document.createElement('input');
|
// 这是用户手动加载模型文件的分支,需要修改这里
|
||||||
inputJson.type = 'file';
|
const inputFiles = document.createElement('input');
|
||||||
inputJson.accept = '.json';
|
inputFiles.type = 'file';
|
||||||
inputJson.multiple = false;
|
// 允许同时选择多个文件
|
||||||
|
inputFiles.accept = '.json,.bin'; // 限制文件类型
|
||||||
|
inputFiles.multiple = true; // 关键:允许选择多个文件
|
||||||
|
|
||||||
showStatus(MODEL_STATUS, 'info', '请先选择 KNN 模型配置文件 (.json)...');
|
showStatus(MODEL_STATUS, 'info', '请选择 KNN 模型配置文件 (.json) 以及其对应的权重文件 (.bin)...');
|
||||||
|
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
inputJson.onchange = async (e) => {
|
inputFiles.onchange = async (e) => {
|
||||||
const jsonFile = e.target.files[0];
|
const files = e.target.files;
|
||||||
if (!jsonFile) {
|
if (files.length === 0) {
|
||||||
showStatus(MODEL_STATUS, 'info', '未选择 .json 文件。');
|
showStatus(MODEL_STATUS, 'info', '未选择文件。');
|
||||||
updateModelUI(false);
|
updateModelUI(false);
|
||||||
return reject(new Error('No JSON file selected.'));
|
return reject(new Error('No files selected.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
let jsonFile = null;
|
||||||
|
let binFile = null;
|
||||||
|
|
||||||
|
// 遍历所有选择的文件,找到 .json 和 .bin
|
||||||
|
for (const file of files) {
|
||||||
|
if (file.name.endsWith('.json')) {
|
||||||
|
jsonFile = file;
|
||||||
|
} else if (file.name.endsWith('.bin')) {
|
||||||
|
binFile = file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!jsonFile) {
|
||||||
|
showStatus(MODEL_STATUS, 'error', '请选择一个 .json 模型配置文件。');
|
||||||
|
updateModelUI(false);
|
||||||
|
return reject(new Error('No JSON file found.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
showStatus(MODEL_STATUS, 'info', `正在解析 ${jsonFile.name}...`);
|
showStatus(MODEL_STATUS, 'info', `正在解析 ${jsonFile.name}...`);
|
||||||
@ -227,10 +247,11 @@ async function loadKNNModel(jsonUrl = null, binUrl = null) {
|
|||||||
});
|
});
|
||||||
modelData = JSON.parse(jsonText);
|
modelData = JSON.parse(jsonText);
|
||||||
|
|
||||||
|
// 兼容旧的单文件JSON格式
|
||||||
if (!modelData.dataFile) {
|
if (!modelData.dataFile) {
|
||||||
console.warn('模型JSON文件不包含 "dataFile" 字段,尝试以旧的单文件JSON格式加载。');
|
console.warn('模型JSON文件不包含 "dataFile" 字段,尝试以旧的单文件JSON格式加载。');
|
||||||
await loadSingleJsonModel(modelData);
|
await loadSingleJsonModel(modelData);
|
||||||
return resolve();
|
return resolve(); // 单文件模型加载成功后直接返回
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -240,21 +261,14 @@ async function loadKNNModel(jsonUrl = null, binUrl = null) {
|
|||||||
return reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputBin = document.createElement('input');
|
// 如果是多文件模式,确保也选择了 bin 文件
|
||||||
inputBin.type = 'file';
|
|
||||||
inputBin.accept = '.bin';
|
|
||||||
inputBin.multiple = false;
|
|
||||||
|
|
||||||
showStatus(MODEL_STATUS, 'info', `已加载 .json 文件。请选择对应的权重文件 "${modelData.dataFile}" (.bin)...`);
|
|
||||||
|
|
||||||
inputBin.onchange = async (eBin) => {
|
|
||||||
const binFile = eBin.target.files[0];
|
|
||||||
if (!binFile) {
|
if (!binFile) {
|
||||||
showStatus(MODEL_STATUS, 'info', '未选择 .bin 文件。');
|
showStatus(MODEL_STATUS, 'error', `请同时选择与 ${jsonFile.name} 对应的 .bin 权重文件 (${modelData.dataFile})。`);
|
||||||
updateModelUI(false);
|
updateModelUI(false);
|
||||||
return reject(new Error('No BIN file selected.'));
|
return reject(new Error('No BIN file found.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查 bin 文件名是否匹配
|
||||||
if (binFile.name !== modelData.dataFile) {
|
if (binFile.name !== modelData.dataFile) {
|
||||||
showStatus(MODEL_STATUS, 'error', `选择的 .bin 文件名 "${binFile.name}" 与 .json 中定义的 "${modelData.dataFile}" 不匹配!请选择正确的文件。`);
|
showStatus(MODEL_STATUS, 'error', `选择的 .bin 文件名 "${binFile.name}" 与 .json 中定义的 "${modelData.dataFile}" 不匹配!请选择正确的文件。`);
|
||||||
updateModelUI(false);
|
updateModelUI(false);
|
||||||
@ -270,7 +284,7 @@ async function loadKNNModel(jsonUrl = null, binUrl = null) {
|
|||||||
reader.readAsArrayBuffer(binFile);
|
reader.readAsArrayBuffer(binFile);
|
||||||
});
|
});
|
||||||
binData = new Float32Array(arrayBuffer);
|
binData = new Float32Array(arrayBuffer);
|
||||||
resolve();
|
resolve(); // 所有文件都已读取成功
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showStatus(MODEL_STATUS, 'error', `读取 .bin 文件失败: ${error.message}`);
|
showStatus(MODEL_STATUS, 'error', `读取 .bin 文件失败: ${error.message}`);
|
||||||
console.error('读取 .bin 失败:', error);
|
console.error('读取 .bin 失败:', error);
|
||||||
@ -278,9 +292,7 @@ async function loadKNNModel(jsonUrl = null, binUrl = null) {
|
|||||||
return reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
inputBin.click();
|
inputFiles.click(); // 触发一次文件选择
|
||||||
};
|
|
||||||
inputJson.click();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -634,6 +634,41 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function startPoseDetectionLoop() {
|
async function startPoseDetectionLoop() {
|
||||||
|
// 手动调整方向
|
||||||
|
window.addEventListener('keydown', (event) => {
|
||||||
|
let direction = null;
|
||||||
|
|
||||||
|
// 检查按下的键,并映射到对应的方向
|
||||||
|
switch (event.key.toUpperCase()) { // 转换为大写以确保大小写不敏感
|
||||||
|
case 'W':
|
||||||
|
direction = 'UP';
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
direction = 'DOWN';
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
direction = 'LEFT';
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
direction = 'RIGHT';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// 如果按下的不是W S A D,则不执行任何操作
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果方向被设置(即按下了W S A D之一)
|
||||||
|
if (direction) {
|
||||||
|
// 阻止某些键(如A和D)可能导致的浏览器默认行为
|
||||||
|
// 这在游戏场景中非常重要,以确保键只用于游戏控制
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
// 调用外部函数来改变蛇的方向
|
||||||
|
changeSnakeDirection(direction);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
if (!isPoseDetectionReady) return;
|
if (!isPoseDetectionReady) return;
|
||||||
|
|
||||||
async function detectAndPredict() {
|
async function detectAndPredict() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user