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
相关产品推荐
相关产品推荐

