feat(item) 优化移动及添加测试场景

This commit is contained in:
chicrobot committed 2026-01-04 00:55:48 +08:00
1 parent 2f7210f47e
commit b9a5180293
15 files changed
+1428 -62

No files matched your search

+354
View File
@@ -0,0 +1,354 @@
// 移动逻辑测试场景
// 本文件将当前移动逻辑拆分为不同的测试场景
// 测试场景1: 相对移动(键盘控制)
// 测试内容:
// 1. 键盘方向键输入检测
// 2. 方向向量归一化
// 3. 移动速度控制
// 4. 停止移动逻辑
function testRelativeMovement() {
console.log("=== 测试场景1: 相对移动(键盘控制) ===");
// 模拟键盘输入
const testCases = [
{ dir: { x: 1, y: 0 }, description: "向右移动" },
{ dir: { x: 0, y: 1 }, description: "向下移动" },
{ dir: { x: -1, y: 0 }, description: "向左移动" },
{ dir: { x: 0, y: -1 }, description: "向上移动" },
{ dir: { x: 1, y: 1 }, description: "向右下对角线移动" },
{ dir: { x: 0, y: 0 }, description: "停止移动" }
];
testCases.forEach(testCase => {
console.log(`测试: ${testCase.description}`);
console.log(`输入方向: (${testCase.dir.x}, ${testCase.dir.y})`);
// 计算归一化向量
const magnitude = Math.sqrt(testCase.dir.x * testCase.dir.x + testCase.dir.y * testCase.dir.y);
let normalizedDir = { x: 0, y: 0 };
if (magnitude > 0) {
normalizedDir = {
x: testCase.dir.x / magnitude,
y: testCase.dir.y / magnitude
};
}
console.log(`归一化方向: (${normalizedDir.x.toFixed(2)}, ${normalizedDir.y.toFixed(2)})`);
// 计算速度向量
const speed = 150;
const velocity = {
x: normalizedDir.x * speed,
y: normalizedDir.y * speed
};
console.log(`速度向量: (${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)})`);
console.log("------------------------");
});
}
// 测试场景2: 目标点移动
// 测试内容:
// 1. 目标点设置
// 2. 世界边界限制
// 3. 移动路径计算
// 4. 到达目标点检测
function testMoveToPoint() {
console.log("=== 测试场景2: 目标点移动 ===");
// 模拟世界边界
const worldBounds = { x: 0, y: 0, width: 1000, height: 800 };
// 测试用例
const testCases = [
{
unitPos: { x: 100, y: 100 },
targetPos: { x: 500, y: 400 },
description: "正常范围内移动"
},
{
unitPos: { x: 100, y: 100 },
targetPos: { x: 1200, y: 900 },
description: "超出世界边界的目标点"
},
{
unitPos: { x: 500, y: 400 },
targetPos: { x: 505, y: 405 },
description: "接近当前位置的目标点"
}
];
testCases.forEach(testCase => {
console.log(`测试: ${testCase.description}`);
console.log(`单位位置: (${testCase.unitPos.x}, ${testCase.unitPos.y})`);
console.log(`目标位置: (${testCase.targetPos.x}, ${testCase.targetPos.y})`);
// 应用世界边界限制
const clampedTarget = {
x: Math.max(worldBounds.x, Math.min(worldBounds.width, testCase.targetPos.x)),
y: Math.max(worldBounds.y, Math.min(worldBounds.height, testCase.targetPos.y))
};
console.log(`限制后目标: (${clampedTarget.x}, ${clampedTarget.y})`);
// 计算距离和方向
const dx = clampedTarget.x - testCase.unitPos.x;
const dy = clampedTarget.y - testCase.unitPos.y;
const distance = Math.sqrt(dx * dx + dy * dy);
console.log(`距离: ${distance.toFixed(2)}`);
// 检查是否到达目标
const arrived = distance < 5;
console.log(`是否到达目标: ${arrived}`);
if (!arrived) {
// 计算移动方向和速度
const angle = Math.atan2(dy, dx);
const speed = 150;
const velocity = {
x: Math.cos(angle) * speed,
y: Math.sin(angle) * speed
};
console.log(`移动速度: (${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)})`);
}
console.log("------------------------");
});
}
// 测试场景3: 单位选择与移动命令
// 测试内容:
// 1. 单个单位选择
// 2. 多个单位选择
// 3. 移动命令分发
function testSelectionAndCommand() {
console.log("=== 测试场景3: 单位选择与移动命令 ===");
// 模拟单位和选择状态
const mockUnits = [
{ id: 1, name: "单位1", moveRelative: () => {}, setTarget: () => {} },
{ id: 2, name: "单位2", moveRelative: () => {}, setTarget: () => {} },
{ id: 3, name: "单位3", moveRelative: () => {}, setTarget: () => {} }
];
// 测试用例
const testCases = [
{
selectedUnits: [],
activeUnit: mockUnits[0],
command: "move-relative",
dir: { x: 1, y: 0 },
description: "无选中单位,使用激活单位"
},
{
selectedUnits: [mockUnits[0], mockUnits[1]],
activeUnit: mockUnits[0],
command: "move-to-point",
target: { x: 500, y: 400 },
description: "多个选中单位,执行目标点移动"
},
{
selectedUnits: [mockUnits[2]],
activeUnit: mockUnits[0],
command: "move-relative",
dir: { x: 0, y: -1 },
description: "单个选中单位,执行相对移动"
}
];
testCases.forEach(testCase => {
console.log(`测试: ${testCase.description}`);
console.log(`激活单位: ${testCase.activeUnit.name}`);
console.log(`选中单位: ${testCase.selectedUnits.map(u => u.name).join(", ")}`);
// 确定命令目标
const targets = testCase.selectedUnits.length > 0 ? testCase.selectedUnits : [testCase.activeUnit];
console.log(`命令目标: ${targets.map(u => u.name).join(", ")}`);
if (testCase.command === "move-relative") {
console.log(`执行相对移动: (${testCase.dir.x}, ${testCase.dir.y})`);
} else if (testCase.command === "move-to-point") {
console.log(`执行目标点移动: (${testCase.target.x}, ${testCase.target.y})`);
}
console.log("------------------------");
});
}
// 测试场景4: 虚拟摇杆控制
// 测试内容:
// 1. 摇杆激活检测
// 2. 摇杆方向计算
// 3. 归一化方向输出
// 4. 停止移动处理
function testVirtualJoystick() {
console.log("=== 测试场景4: 虚拟摇杆控制 ===");
// 模拟摇杆配置
const joystickConfig = { centerX: 100, centerY: 100, radius: 50 };
// 测试用例
const testCases = [
{
pointerPos: { x: 120, y: 100 },
description: "向右轻微拖动"
},
{
pointerPos: { x: 160, y: 100 },
description: "向右拖动超出摇杆范围"
},
{
pointerPos: { x: 135, y: 135 },
description: "向右下对角线拖动"
},
{
pointerPos: { x: 100, y: 100 },
description: "摇杆中心位置(停止)"
}
];
testCases.forEach(testCase => {
console.log(`测试: ${testCase.description}`);
console.log(`摇杆中心: (${joystickConfig.centerX}, ${joystickConfig.centerY})`);
console.log(`指针位置: (${testCase.pointerPos.x}, ${testCase.pointerPos.y})`);
// 计算方向和距离
const dx = testCase.pointerPos.x - joystickConfig.centerX;
const dy = testCase.pointerPos.y - joystickConfig.centerY;
const distance = Math.sqrt(dx * dx + dy * dy);
console.log(`距离: ${distance.toFixed(2)}`);
// 限制在摇杆范围内
let limitedDx = dx;
let limitedDy = dy;
if (distance > joystickConfig.radius) {
const angle = Math.atan2(dy, dx);
limitedDx = Math.cos(angle) * joystickConfig.radius;
limitedDy = Math.sin(angle) * joystickConfig.radius;
console.log(`限制后偏移: (${limitedDx.toFixed(2)}, ${limitedDy.toFixed(2)})`);
}
// 计算归一化方向
const dirX = limitedDx / joystickConfig.radius;
const dirY = limitedDy / joystickConfig.radius;
console.log(`归一化方向: (${dirX.toFixed(2)}, ${dirY.toFixed(2)})`);
console.log("------------------------");
});
}
// 测试场景5: 移动更新逻辑
// 测试内容:
// 1. 每帧移动更新
// 2. 位置更新计算
// 3. 目标到达检测
function testMovementUpdate() {
console.log("=== 测试场景5: 移动更新逻辑 ===");
// 模拟单位和时间增量
const mockUnit = {
x: 100,
y: 100,
target: { x: 500, y: 400 },
setVelocity: (vx, vy) => { mockUnit.velocity = { x: vx, y: vy }; },
setPosition: (x, y) => { mockUnit.x = x; mockUnit.y = y; }
};
const speed = 150;
const deltaTime = 1/60; // 60fps
console.log("初始状态:");
console.log(`单位位置: (${mockUnit.x}, ${mockUnit.y})`);
console.log(`目标位置: (${mockUnit.target.x}, ${mockUnit.target.y})`);
// 模拟几帧的移动更新
for (let i = 0; i < 5; i++) {
console.log(`\n第${i+1}帧更新:`);
const dx = mockUnit.target.x - mockUnit.x;
const dy = mockUnit.target.y - mockUnit.y;
const distance = Math.sqrt(dx * dx + dy * dy);
console.log(`距离目标: ${distance.toFixed(2)}`);
if (distance < 5) {
// 到达目标
mockUnit.setPosition(mockUnit.target.x, mockUnit.target.y);
mockUnit.setVelocity(0, 0);
mockUnit.target = null;
console.log("到达目标,停止移动");
break;
} else {
// 继续移动
const angle = Math.atan2(dy, dx);
const velocity = {
x: Math.cos(angle) * speed,
y: Math.sin(angle) * speed
};
mockUnit.setVelocity(velocity.x, velocity.y);
// 更新位置
mockUnit.x += velocity.x * deltaTime;
mockUnit.y += velocity.y * deltaTime;
console.log(`速度: (${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)})`);
console.log(`新位置: (${mockUnit.x.toFixed(2)}, ${mockUnit.y.toFixed(2)})`);
}
}
console.log("\n最终状态:");
console.log(`单位位置: (${mockUnit.x}, ${mockUnit.y})`);
console.log(`目标状态: ${mockUnit.target ? "有目标" : "无目标"}`);
}
// 运行所有测试场景
function runAllTests() {
console.log("开始运行移动逻辑测试场景\n");
testRelativeMovement();
console.log("\n" + "=".repeat(50) + "\n");
testMoveToPoint();
console.log("\n" + "=".repeat(50) + "\n");
testSelectionAndCommand();
console.log("\n" + "=".repeat(50) + "\n");
testVirtualJoystick();
console.log("\n" + "=".repeat(50) + "\n");
testMovementUpdate();
console.log("\n" + "=".repeat(50));
console.log("所有测试场景运行完成");
}
// 导出测试函数
if (typeof module !== 'undefined' && module.exports) {
module.exports = {
testRelativeMovement,
testMoveToPoint,
testSelectionAndCommand,
testVirtualJoystick,
testMovementUpdate,
runAllTests
};
// Node.js环境下自动运行测试
runAllTests();
} else {
// 浏览器环境下自动运行测试
window.movementTests = {
runAllTests,
testRelativeMovement,
testMoveToPoint,
testSelectionAndCommand,
testVirtualJoystick,
testMovementUpdate
};
// 浏览器环境下自动运行测试
runAllTests();
}