You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在摇杆未移动时持续向WebSocket发送数据?

解决nipple.js摇杆到达边界后停止触发move事件的问题

当用nipple.js做摇杆控制服务器角色时,默认的move事件只在摇杆位置变化时触发——一旦摇杆被拉到边界或按住不动,事件就会停止,没法持续向WebSocket发方向指令。要解决这个问题,用定时器+状态记录的方式就能实现持续发送:

核心思路

  1. 摇杆触发start事件时,记录当前方向/角度数据,启动定时器每隔固定时间发最新状态
  2. move事件里实时更新摇杆状态
  3. end事件触发时,清除定时器停止发送

完整实现代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/nipplejs/0.10.0/nipplejs.min.js"></script>
<div id="container"></div>
#container {
  height: 200px;
  width: 200px;
  background-color: rgb(203 213 225);
}
// 初始化WebSocket连接(替换成你的服务器地址)
const ws = new WebSocket('ws://your-server-address');

const container = document.getElementById("container");
const manager = nipplejs.create({
  zone: container,
  color: "rgb(14 116 144)"
});

// 存储当前摇杆状态
let joystickState = {
  angle: null,
  direction: null
};
let sendInterval = null;

// 摇杆开始拖动时启动定时发送
manager.on("start", (evt, data) => {
  joystickState.angle = data.angle;
  joystickState.direction = data.direction;
  
  // 每隔100ms发送一次状态(可根据需求调整间隔)
  sendInterval = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      ws.send(JSON.stringify(joystickState));
      console.log("发送摇杆状态:", joystickState);
    }
  }, 100);
});

// 摇杆移动时更新状态
manager.on("move", (evt, data) => {
  joystickState.angle = data.angle;
  joystickState.direction = data.direction;
});

// 摇杆结束拖动时停止发送
manager.on("end", () => {
  clearInterval(sendInterval);
  sendInterval = null;
  
  // 可选:发送停止指令让服务器角色停止移动
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(JSON.stringify({action: "stop"}));
  }
});

关键说明

  • 定时器间隔可按需调整:50ms更灵敏,200ms更省带宽
  • 就算摇杆拉到边界不动,定时器也会持续发最后记录的方向数据,保证服务器能收到持续控制指令
  • end事件里的停止指令可让服务器及时处理角色停止逻辑

内容的提问来源于stack exchange,提问作者CoolSteve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:25:17