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

p5.js中mousePressedOver()是否支持移动端触摸?替代方案是什么?

关于p5.play中mousePressedOver的移动端触摸检测问题

首先明确:mousePressedOver() 默认不支持移动端触摸检测,它只监听鼠标的mousedown事件,不会响应触摸设备的touchstart等触摸事件。

替代方案:手动处理触摸事件

利用p5.js原生的触摸API,结合p5.play精灵的坐标判断方法,就能实现触摸检测,具体有两种方式:

方式1:新增触摸判断函数

在代码中添加一个判断触摸点是否在精灵内的函数,然后在原条件中加入该判断:

// 自定义函数:判断是否有触摸点在目标精灵上
function isTouchOver(sprite) {
  if (touches.length > 0) {
    // 获取第一个触摸点的坐标(支持多点触摸可遍历touches数组)
    const touchX = touches[0].x;
    const touchY = touches[0].y;
    // 使用p5.play精灵的contains方法判断点是否在精灵范围内
    return sprite.contains(touchX, touchY);
  }
  return false;
}

// 修改原条件判断
if (keyDown("left") || mousePressedOver(left) || isTouchOver(left)) {
  sofia.velocityX = -1;
  sofia.velocityY = 0; // 注意:原代码的sofiavelocityY是拼写错误,应为sofia.velocityY
}

方式2:在触摸事件回调中处理

直接在p5.js的touchStarted回调里处理触摸逻辑,标记触摸状态后在主循环中使用:

let isTouchingLeft = false;

function touchStarted() {
  // 检查触摸点是否在left精灵上
  isTouchingLeft = left.contains(touches[0].x, touches[0].y);
  return false; // 阻止默认触摸行为,避免冲突
}

function touchEnded() {
  isTouchingLeft = false; // 触摸结束后重置状态
}

// 主循环中的判断
if (keyDown("left") || mousePressedOver(left) || isTouchingLeft) {
  sofia.velocityX = -1;
  sofia.velocityY = 0;
}

注意事项

  • p5.js中触摸事件(touchStarted/touchEnded)和鼠标事件可能在部分设备上同时触发,若需避免冲突,可以通过touches.length判断当前是否为触摸操作,再跳过鼠标事件的处理。
  • 确保精灵的collider属性正确设置(比如默认的'rectangle'或自定义形状),否则contains方法可能无法准确判断点是否在精灵内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:14