javascript - 同时键盘输入(对 Angular 线游戏移动)

标签 javascript node.js input coffeescript 2d-games

我正在 Node 中开发一款 2D 游戏,其中 Angular 色需要沿对 Angular 线移动。这是一个完全在 Node 环境中的自上而下的基于文本的游戏(没有浏览器,所以我没有很好的 keydown/keyup 事件供我使用)。

我正在使用 keypress库来读取用户输入,但我不知道如何一次捕获两个键以引起对 Angular 线移动(例如向下箭头和向右箭头)。这是我目前用于水平和垂直移动的代码:

game = new Game()
game.print()

keypress(process.stdin)
process.stdin.setRawMode(true)
process.stdin.resume()
process.stdin.on('keypress', (ch, key) ->
  return unless key
  return process.stdin.pause() if key.ctrl and key.name is 'c'

  player = game.player
  switch key.name
    when 'up' 
      if key.shift then player.turnUp() else player.moveUp()
    when 'right' 
      if key.shift then player.turnRight() else player.moveRight()
    when 'down' 
      if key.shift then player.turnDown() else player.moveDown()
    when 'left' 
      if key.shift then player.turnLeft() else player.moveLeft()
    when 'enter' 
      player.repeatMove()
    when 'b' 
      player.placeBlock()

  game.update()
  game.print()
)

这是一款回合制游戏,目前游戏的运行循环根据用户输入进行改进。相反,我认为我需要做的是进行基于时间间隔的游戏更新并跟踪最近的两个按键事件以及它们之间的时间。

有没有更稳健的方式?

最佳答案

这是我对键盘管理器的个人实现:

这很容易理解。我有一个描述我的键盘状态的对象。对于任何更改,我都会发送一个事件。

tools.KeyboardController.keyPressed = function(e) {
    var evtobj = window.event? event : e;
    var key = evtobj.keyCode;

    //don't need to change anything if it's already pressed
    if(tools.KeyboardController.keyStatus[key] === true) return;
    //we store the key in an object which describe the keyboard status
    tools.KeyboardController.keyStatus[key] = true;
    //send an event to signal the touch is pressed 
    EventManager.fire("tools.KeyboardController.keyPressed."+key);
}

tools.KeyboardController.keyReleased = function(e) {
    var evtobj = window.event? event : e;
    var key = evtobj.keyCode;
    //if key is not already realese, noting to do
    if(tools.KeyboardController.keyStatus[key] === false) return;
    //set the key as not pushed
    tools.KeyboardController.keyStatus[key] = false;
    //send an event to signal the touch is released
    EventManager.fire("tools.KeyboardController.keyReleased."+key);
}

tools.KeyboardController.keyStatus = {};

document.onkeydown  = tools.KeyboardController.keyPressed;
document.onkeyup    = tools.KeyboardController.keyReleased;

关于javascript - 同时键盘输入(对 Angular 线游戏移动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585205/

相关文章:

javascript - node.js 缓冲区不为空

javascript - 使用 javascript 和正则表达式获取逗号之前的单词?

javascript - 使用 d3 获取事件监听器中输入元素的值

javascript - 如果字段为空,Passport.js 不会调用 LocalStrategy

mysql - 在两个模型上使用 hasMany 处理 Sequelize Eager Load Error

javascript - 如何在 Javascript 中选中多个复选框

javascript - 使用 ReactJS 以两位数显示 getHours() 和 getMinutes()

javascript - 如何观察用户在网页中查看的当前部分?

javascript - 使用javascript添加新元素后如何更新本地html文件?

javascript - 在图像图中突出显示矩形