在javascript/html5游戏中,使用2个按钮仅在3个不同的垂直位置移动
我是html5游戏和javascript新手,这里需要一些帮助 我正在创建一个简单的2D迷你游戏,但我有一个问题。与职位有关 我有3个不同的垂直位置(或3行),p_-top,p_-mid和p_-bot。我的任务是用两个按钮在这些位置移动球 我的按钮只有向上和向下箭头。如果我按向上我将红球向上移动一个位置,如果我按向下我将红球向下移动一个位置 问题是: 如果球在p_bot,我想向上按键,它会转到p_top。如果球在p_顶部,我按下向下键,球就会转到p_机器人 我怎样才能解决这个问题?这就是我正在做的。我不太确定我的算法是否在更新();是不好的,或者如果他们的按键事件侦听器有问题在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_机器人 我怎样才能解决这个问题?这就是我正在做
//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,则调整和添加位置会更舒适)。非常感谢!出于某种原因,第二种解决方案不起作用,当然我会考虑你的建议!