
本教程详细介绍了如何在 matter.js 物理引擎中集成鼠标交互控制。我们将利用 `matter.mouseconstraint` 和 `matter.mouse` 模块,实现通过鼠标拖动场景中的物理体。文章重点讲解了高 dpi 屏幕下鼠标坐标缩放的关键配置 `matter.mouse.setscale`,并提供了一个完整的示例代码,帮助开发者快速掌握 matter.js 的鼠标交互功能。
Matter.js 是一个用于 Web 的 2D 物理引擎,它提供了创建刚体、复合体、约束以及模拟物理交互的能力。要实现鼠标交互,我们主要会用到以下两个核心模块:
首先,我们需要在 HTML 页面中引入 Matter.js 库,并设置一个用于渲染的 <canvas> 元素。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Matter.js 鼠标控制示例</title>
<!-- 引入 Matter.js 库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.min.js"></script>
<style>
body { margin: 0; overflow: hidden; } /* 移除默认边距,隐藏滚动条 */
canvas { display: block; background-color: #f0f0f0; } /* 确保 canvas 独占一行 */
</style>
</head>
<body>
<!-- 用于渲染物理世界的 canvas 元素 -->
<canvas id="matterCanvas" data-pixel-ratio="2"></canvas>
<script>
// Matter.js 模块别名
var Engine = Matter.Engine,
World = Matter.World,
Bodies = Matter.Bodies,
Composite = Matter.Composite,
Mouse = Matter.Mouse,
MouseConstraint = Matter.MouseConstraint;
// 创建物理引擎
var engine = Engine.create();
var world = engine.world;
// 获取窗口尺寸
var w = window.innerWidth;
var h = window.innerHeight;
// 获取 canvas 元素并设置尺寸
var canvas = document.getElementById('matterCanvas');
var context = canvas.getContext('2d');
canvas.width = w - 130; // 示例中减去一些边距
canvas.height = h * 0.888; // 示例中设置高度比例
// 创建物理体:两个方块和地面
var boxA = Bodies.rectangle(w * 0.5 + 30, h * 0.7, 80, 80);
var boxB = Bodies.rectangle(w * 0.5 + 60, 50, 80, 80);
var ground = Bodies.rectangle(w * 0.5 - 1, h * 0.888 + h * 0.05 - 30 + 1.5, w, h * 0.1, { isStatic: true });
// 将所有物理体添加到世界中
Composite.add(world, [boxA, boxB, ground]);
// ... 后续的鼠标控制和渲染代码将在此处添加
</script>
</body>
</html>在上述代码中,我们初始化了 Matter.js 引擎和世界,并创建了几个基本的物理体(两个方块和一个静态地面)。canvas 元素上的 data-pixel-ratio="2" 属性是一个关键点,它表示 canvas 的实际渲染分辨率是其 CSS 尺寸的两倍,这在 Retina 或其他高 DPI 屏幕上很常见,可以使渲染更清晰。然而,这也意味着鼠标坐标需要进行相应的缩放。
要添加鼠标交互,我们需要创建 Matter.Mouse 实例来监听 canvas 上的鼠标事件,然后将其与 Matter.MouseConstraint 结合,将鼠标行为转换为物理世界中的约束。
// ... (接上面的代码)
// 1. 创建鼠标实例
// Matter.Mouse.create 方法接收一个 HTML 元素作为参数,通常是 canvas
var mouse = Mouse.create(canvas);
// 2. 处理高 DPI 屏幕下的鼠标坐标缩放
// 如果 canvas 设置了 data-pixel-ratio 属性,鼠标坐标需要按此比例缩放,
// 否则 Matter.js 内部的鼠标坐标与渲染坐标不匹配,导致拖动不准确。
// 示例中的 canvas 有 data-pixel-ratio="2",所以需要 x:2, y:2 的缩放。
Mouse.setScale(mouse, { x: 2, y: 2 });
// 3. 创建鼠标约束实例
// MouseConstraint.create 接收引擎和鼠标实例作为参数
var mouseConstraint = MouseConstraint.create(engine, {
mouse: mouse,
constraint: {
stiffness: 0.2, // 约束的刚度
render: {
visible: false // 不显示鼠标约束线
}
}
});
// 4. 将鼠标约束添加到世界中
// 这样鼠标约束才能参与物理模拟
Composite.add(world, mouseConstraint);
// ... (后续的自定义渲染循环代码)关键点解释:
在 Matter.js 中,通常可以使用 Matter.Render.create() 来自动处理渲染和引擎更新。但如果需要更精细的控制,或者像本例中那样使用 canvas 的 2D 上下文进行自定义绘制,则需要手动实现渲染循环。
// ... (接上面的鼠标控制代码)
// 自定义渲染循环函数
(function render() {
// 请求下一帧动画
window.requestAnimationFrame(render);
// 清除 canvas
context.clearRect(0, 0, canvas.width, canvas.height);
// 获取世界中的所有物理体
var bodies = Composite.allBodies(engine.world);
context.beginPath(); // 开始绘制路径
// 遍历所有物理体并绘制
for (var i = 0; i < bodies.length; i += 1) {
var vertices = bodies[i].vertices;
context.moveTo(vertices[0].x, vertices[0].y);
for (var j = 1; j < vertices.length; j += 1) {
context.lineTo(vertices[j].x, vertices[j].y);
}
context.lineTo(vertices[0].x, vertices[0].y); // 闭合路径
}
context.lineWidth = 3;
context.fillStyle = '#fff'; // 填充颜色
context.strokeStyle = '#000'; // 描边颜色
context.fill(); // 填充
context.stroke(); // 描边
// 关键:在自定义渲染循环中手动更新物理引擎
// 如果不调用此方法,物理世界将不会模拟和更新
Engine.update(engine);
})();关键点解释:
将以上所有代码片段组合起来,就得到了一个完整的 Matter.js 鼠标控制示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Matter.js 鼠标控制集成指南</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.min.js"></script>
<style>
body { margin: 0; overflow: hidden; }
canvas { display: block; background-color: #f0f0f0; border: 1px solid #ccc; }
</style>
</head>
<body>
<canvas id="matterCanvas" data-pixel-ratio="2"></canvas>
<script>
// Matter.js 模块别名
var Engine = Matter.Engine,
World = Matter.World,
Bodies = Matter.Bodies,
Composite = Matter.Composite,
Mouse = Matter.Mouse,
MouseConstraint = Matter.MouseConstraint;
// 创建物理引擎
var engine = Engine.create();
var world = engine.world;
// 获取窗口尺寸
var w = window.innerWidth;
var h = window.innerHeight;
// 获取 canvas 元素并设置尺寸
var canvas = document.getElementById('matterCanvas');
var context = canvas.getContext('2d');
canvas.width = w - 130; // 示例中减去一些边距
canvas.height = h * 0.888; // 示例中设置高度比例
// 创建物理体:两个方块和地面
var boxA = Bodies.rectangle(w * 0.5 + 30, h * 0.7, 80, 80);
var boxB = Bodies.rectangle(w * 0.5 + 60, 50, 80, 80);
var ground = Bodies.rectangle(w * 0.5 - 1, h * 0.888 + h * 0.05 - 30 + 1.5, w, h * 0.1, { isStatic: true });
// 将所有物理体添加到世界中
Composite.add(world, [boxA, boxB, ground]);
// 1. 创建鼠标实例
var mouse = Mouse.create(canvas);
// 2. 处理高 DPI 屏幕下的鼠标坐标缩放
// 如果 canvas 的 data-pixel-ratio 为 2,则鼠标坐标也需缩放 2 倍
Mouse.setScale(mouse, { x: 2, y: 2 });
// 3. 创建鼠标约束实例
var mouseConstraint = MouseConstraint.create(engine, {
mouse: mouse,
constraint: {
stiffness: 0.2,
render: {
visible: false // 隐藏鼠标拖动时显示的约束线
}
}
});
// 4. 将鼠标约束添加到世界中
Composite.add(world, mouseConstraint);
// 自定义渲染循环函数
(function render() {
window.requestAnimationFrame(render);
// 清除 canvas
context.clearRect(0, 0, canvas.width, canvas.height);
var bodies = Composite.allBodies(engine.world);
context.beginPath();
for (var i = 0; i < bodies.length; i += 1) {
var vertices = bodies[i].vertices;
context.moveTo(vertices[0].x, vertices[0].y);
for (var j = 1; j < vertices.length; j += 1) {
context.lineTo(vertices[j].x, vertices[j].y);
}
context.lineTo(vertices[0].x, vertices[0].y);
}
context.lineWidth = 3;
context.fillStyle = '#fff';
context.strokeStyle = '#000';
context.fill();
context.stroke();
// 关键:在自定义渲染循环中手动更新物理引擎
Engine.update(engine);
})();
</script>
</body>
</html>通过遵循本教程的步骤,你将能够成功地在 Matter.js 应用中集成鼠标交互控制,为用户提供直观且有趣的物理模拟体验。
以上就是Matter.js 鼠标交互控制集成指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号