Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript/html5游戏中,使用2个按钮仅在3个不同的垂直位置移动_Javascript_Html_2d_Keydown - Fatal编程技术网

在javascript/html5游戏中,使用2个按钮仅在3个不同的垂直位置移动

在javascript/html5游戏中,使用2个按钮仅在3个不同的垂直位置移动,javascript,html,2d,keydown,Javascript,Html,2d,Keydown,我是html5游戏和javascript新手,这里需要一些帮助 我正在创建一个简单的2D迷你游戏,但我有一个问题。与职位有关 我有3个不同的垂直位置(或3行),p_-top,p_-mid和p_-bot。我的任务是用两个按钮在这些位置移动球 我的按钮只有向上和向下箭头。如果我按向上我将红球向上移动一个位置,如果我按向下我将红球向下移动一个位置 问题是: 如果球在p_bot,我想向上按键,它会转到p_top。如果球在p_顶部,我按下向下键,球就会转到p_机器人 我怎样才能解决这个问题?这就是我正在做

我是html5游戏和javascript新手,这里需要一些帮助

我正在创建一个简单的2D迷你游戏,但我有一个问题。与职位有关

我有3个不同的垂直位置(或3行),p_-top,p_-mid和p_-bot。我的任务是用两个按钮在这些位置移动球

我的按钮只有向上和向下箭头。如果我按向上我将红球向上移动一个位置,如果我按向下我将红球向下移动一个位置

问题是: 如果球在p_bot,我想向上按键,它会转到p_top。如果球在p_顶部,我按下向下键,球就会转到p_机器人

我怎样才能解决这个问题?这就是我正在做的。我不太确定我的算法是否在更新();是不好的,或者如果他们的按键事件侦听器有问题

//Keyboard event listener
var keysDown = {};

addEventListener("keydown", function (e) {
    keysDown[e.keyCode] = true;
}, false);
addEventListener("keyup", function (e) {
    delete keysDown[e.keyCode];
}, false);

var update = function(){
    if(38 in keysDown) { //key UP
        if(ball.y == p_bot){
            ball.y = p_mid; 
        }
        if(gninja.y == p_mid){
            ball.y = p_top;
        }
    }
    if(40 in keysDown) { //key DOWN
        if(ball.y == p_top){
            ball.y = p_mid;
        }
        if(gninja.y == p_mid){
            ball.y = p_bot;
        }
    }
};

第一个问题是,您的更新被调用为fast,您看不到中间位置,因为当您按下KeyDown对象中的键时,它总是在,并且更新都是~16ms,对吗

第一批解决方案:

如果你想让玩家在从机器人到顶端的过程中必须向上推2次,你应该只使用像这样的键 移除keydown侦听器,移除keyup中的delete:

addEventListener("keyup", function( e ){ keysDown[ e.keyCode ] = true; }, false );
然后在更新时删除密钥并检查它

if ( 40 in keysDown )
{
  delete keysDown[ 40 ];
  // do you old stuff here should work
}
第二种解决方案:

否则,如果您想使用keydown,您可以使用timestamp来防止事件更新速度快于您所能看到的(而且它更舒适,因为您可以调整它)

在更新功能之前

var lastCheck = Date.now();
function update()
{
  if ( Date.now() - lastCheck > 200 ) // 200 is 200ms, tweak this
  {
    // old stuff inside
  }
}
和提示:

然后我可以给你一个提示,如果你喜欢的话,不要使用,并寻找更好的解决方案。在这种情况下,你可以使用数组,并将你的位置索引保存在数组中,只需移动这个索引

var pos = [ 10, 50, 150 ]; // 10 is top pos and 150 bot pos
var currentPosId = 0; // player y is pos[ currentPosId ]

然后,在更新函数中,您可以检查键并执行currentPosId++或--我让您找到如何执行此操作(如果您稍后添加其他pos,则调整和添加位置会更舒适)。

非常感谢!出于某种原因,第二种解决方案不起作用,当然我会考虑你的建议!