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

JS Canvas类马里奥游戏移动端上滑触发跳跃功能实现求助

解决移动端上滑触发跳跃的问题

核心问题

你之前用touchmove事件直接触发跳跃,会导致只要触摸移动就重复触发,而非仅在上滑动作时触发。需要通过记录触摸起始位置、计算滑动方向与距离,来精准判断上滑操作。

实现步骤与代码

  1. 初始化关键变量
    用于记录触摸起始位置、控制跳跃权限、设置触发阈值:
let touchStartY;
let canJump = true; // 仅当玩家在地面时允许跳跃
const JUMP_TRIGGER_DISTANCE = 20; // 触发跳跃的最小上滑距离(可按需调整)
  1. 绑定触摸起始事件
    在手指刚接触屏幕时,记录初始Y坐标:
document.addEventListener('touchstart', (e) => {
  touchStartY = e.touches[0].clientY;
});
  1. 绑定触摸移动事件,判断上滑触发跳跃
    计算滑动的Y轴差值,仅当向上滑动且超过阈值、同时允许跳跃时,执行跳跃逻辑:
document.addEventListener('touchmove', (e) => {
  e.preventDefault(); // 阻止页面滚动干扰游戏操作
  const currentTouchY = e.touches[0].clientY;
  const slideDistance = currentTouchY - touchStartY;

  // 向上滑(slideDistance为负)+ 超过触发阈值 + 处于可跳跃状态
  if (slideDistance < -JUMP_TRIGGER_DISTANCE && canJump) {
    player.velocity.y -= 15; // 执行你的跳跃速度设置
    canJump = false; // 触发后禁止空中二次跳跃
  }
});
  1. 重置跳跃权限
    在游戏主循环中,检测玩家是否落地,重置canJump:
function gameLoop() {
  // ...其他游戏逻辑(比如碰撞检测、玩家位置更新)
  
  // 假设你有判断玩家是否在地面的变量(比如player.isOnGround)
  if (player.isOnGround) {
    canJump = true;
  }

  requestAnimationFrame(gameLoop);
}

额外说明

  • e.preventDefault():如果游戏页面存在滚动,这行代码可以避免触摸滑动时页面滚动,保证操作专注于游戏。
  • 阈值调整:JUMP_TRIGGER_DISTANCE可根据玩家手感调整,建议在15-30px之间测试。
  • 防重复触发:canJump变量是模拟马里奥"仅地面可跳跃"的核心逻辑,避免空中无限跳的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:22:44