【问题标题】:Simulate spacebar press with touchevent in javascript/html在 javascript/html 中使用 touchevent 模拟空格键按下
【发布时间】:2016-08-19 22:02:37
【问题描述】:

我正在尝试在 Android 上移植游戏,并且在游戏中玩家按空格键进行跳跃,但我找不到任何可行的解决方案来模拟用户触摸屏幕时的空格键事件

这是我到目前为止找到的代码:

/**
 * Keep track of the spacebar events
 */
var KEY_CODES = {
  32: 'space'
};
var KEY_STATUS = {};
for (var code in KEY_CODES) {
  if (KEY_CODES.hasOwnProperty(code)) {
     KEY_STATUS[KEY_CODES[code]] = false;
  }
}
document.onkeydown = function(e) {
  var keyCode = (e.keyCode) ? e.keyCode : e.charCode;
  if (KEY_CODES[keyCode]) {
    e.preventDefault();
    KEY_STATUS[KEY_CODES[keyCode]] = true;
  }
};
document.onkeyup = function(e) {
  var keyCode = (e.keyCode) ? e.keyCode : e.charCode;
  if (KEY_CODES[keyCode]) {
    e.preventDefault();
    KEY_STATUS[KEY_CODES[keyCode]] = false;
  }
};
document.addEventListener("touchstart", function(e) {
  document.onkeydown({ keyCode: 32 });
});
document.addEventListener("touchend", function(e) {
  document.onkeyup({ keyCode: 32 });
});

我不明白为什么这不起作用...

然后这个:

// jump higher if the space bar is continually pressed
if (KEY_STATUS.space && jumpCounter) {
  player.dy = player.jumpDy;
}

以上是所有使用空格键事件的代码

Full Game code

【问题讨论】:

标签: javascript html events touch simulate


【解决方案1】:

您需要从事件中获取keyCode,尝试编写 ({ e.keyCode: 32});

【讨论】:

    【解决方案2】:

    您可以定义一个处理程序,然后包装跳转函数。用需要的事件触发它。例如:

    function jump(keyEvent) { /* code to jump*/}
    

    这是一个坏主意,但它可以为您工作。这样您就不必担心 preventDefault 方法。

    function jumpHandler(e) { e.keyCode = 32; jump(e) /*object to simulate the keydown event object*/ }
    

    为了避免对事件对象的操作,您可以像传递 keyCode 属性一样传递一个空函数。但是您将失去 preventDefault 功能。

    function jumpHandler() { jump({keyCode:32, preventDefault: function(){}}) /*object to simulate the keydown event object*/ }
    
    document.addEventListener('touchstart', jumpHandler);
    document.onKeydown = jump // here just the reference to the handler
    

    有时函数末尾的 returnig false 可能具有与 preventDefault 相同的行为,我只是告诉你是否要返回 false 而不是调用 preventDefault。

    :)

    【讨论】:

    • 在/*代码中跳转*/我可以完整跳转代码吗?它是: if (KEY_STATUS.space && player.dy === 0 && !player.isJumping) { player.isJumping = true; player.dy = player.jumpDy;跳转计数器 = 12; assetLoader.sounds.jump.play(); }
    • 是的,你可以把所有你需要的东西放入跳转功能中。只要确保您提供了所需上下文所需的一切。
    • 我正在测试我编写的代码片段并且它正在工作。你把你的游戏上传到我可以测试的地方了吗?...
    • 我正在您的网站上进行测试,它也可以正常工作。我刚刚注入了我的代码并使用 devtool 对其进行了测试,以模拟触摸事件。它有效,但普通话正在疯狂地跳跃。我不得不评论 e.preventDefaultt 因为我们的假对象没有这种方法,我将编辑我的答案以提供额外的想法。为了防止这种情况,您也必须以相同的方式模拟 keyup 事件。
    • 我可能写错了,因为它对我不起作用……这是我和你一起写的一段脚本。粘贴链接:pastebin.com/m4LekmpK
    猜你喜欢
    • 2016-03-05
    • 2015-10-19
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多