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

移动端浏览器BattleCity游戏战场内滑动延迟及Chrome兼容问题

解决移动端BattleCity坦克滑动控制延迟及Chrome失效问题

我之前也碰到过类似的移动端触摸交互问题,结合你的场景和代码来看,这大概率是移动端浏览器对可滚动/交互元素的触摸默认行为干扰导致的——尤其是Chrome移动端会对表格这类元素的触摸操作做特殊处理(比如判断是否触发滚动),直接造成你的触摸事件监听出现延迟甚至完全失效。下面给你几个针对性的解决方案:

1. 阻止战场表格的默认触摸行为

在触摸事件触发时,如果目标是战场表格内的元素,立刻阻止浏览器的默认行为(比如滚动、缩放),这样可以消除Chrome的触摸延迟并确保事件能正常传递到你的逻辑里。修改你的触摸事件代码如下:

class Direction{ 
  Point first, last; 
  Game game; 

  void startListening(){ 
    window.onTouchStart.listen((ev) { 
      // 判断触摸目标是否属于战场表格
      if (ev.target is TableElement || ev.target is TableCellElement) {
        ev.preventDefault(); // 阻止默认滚动/触摸行为
      }
      last = null; 
      first = ev.touches.first.client; 
    }); 

    window.onTouchMove.listen((ev){ 
      if (ev.target is TableElement || ev.target is TableCellElement) {
        ev.preventDefault(); 
      }
      last = ev.touches.first.client; 
    }); 

    // 保留原有的touchEnd和键盘监听逻辑
    window.onTouchEnd.listen((ev) { 
      if(last == null || first.distanceTo(last) < 20) 
        game.player.shoot(); 
      else { 
        Point d = first - last; 
        if(d.x.abs() > d.y.abs()){ 
          if( first.x > last.x){ 
            game.player.changeDirection(Directions.left); 
          } else{ 
            game.player.changeDirection(Directions.right); 
          } 
        } else{ 
          if(first.y > last.y){ 
            game.player.changeDirection(Directions.up); 
          } else{ 
            game.player.changeDirection(Directions.down); 
          } 
        } 
      } 
    }); 

    window.onKeyPress.listen((k) { 
      //Shoot 
      if(k.which == 32) { 
        game.player.shoot(); 
      } 
      //Up 
      if(k.which == 119 || k.keyCode == KeyCode.UP){ 
        game.player.changeDirection(Directions.up); 
      } 
      //Down 
      if(k.which == 115 || k.keyCode == KeyCode.DOWN){ 
        game.player.changeDirection(Directions.down); 
      } 
      //Left 
      if(k.which == 97 || k.keyCode == KeyCode.LEFT){ 
        game.player.changeDirection(Directions.left); 
      } 
      //Right 
      if(k.which == 100 || k.keyCode == KeyCode.RIGHT){ 
        game.player.changeDirection(Directions.right); 
      } 
    }); 
  } 
}

2. 优化战场表格的CSS属性

直接通过CSS禁用表格的触摸默认行为,比JS层面的拦截更高效,能彻底解决Chrome的触摸延迟问题:

#battle-field-table {
  touch-action: none; /* 禁用所有触摸默认行为,比如滚动、缩放 */
  overflow: hidden; /* 防止表格出现滚动条 */
  user-select: none; /* 禁止文本选择,避免干扰触摸操作 */
}

3. 调整触摸事件监听的目标

与其监听window的触摸事件,不如直接绑定到战场表格元素上,这样可以减少事件冒泡的损耗,同时更精准地处理战场内的操作:

// 假设你的战场表格有id为battleField
Element battleField = querySelector('#battleField');
battleField.onTouchStart.listen((ev) {
  ev.preventDefault();
  last = null;
  first = ev.touches.first.client;
});
// 同理修改touchMove和touchEnd的监听目标为battleField

问题根源说明

移动端浏览器(尤其是Chrome)会对可能触发滚动的元素(比如表格、div等)添加300ms左右的触摸延迟,用来判断用户是要滑动滚动还是执行自定义操作。当你在战场表格内滑动时,浏览器优先处理滚动逻辑,导致你的触摸事件被延迟甚至忽略;而战场外没有可滚动元素,所以事件能正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:23