2011-04-14 87 views
0

我想做一个小小的pacman游戏来训练我的JavaScript技能。为了移动pacman,我使用与移动功能相关的onkeyup事件函数。警报弹出后没有返回焦点到浏览器

我仍然有问题。每当pacman死亡(或游戏结束)时,我总是使用警告框来提醒用户发生了什么。尽管如此,在按下OK按钮让pacman再次移动之后,我必须点击浏览器窗口才能响应键盘事件。

不知怎的,我相信这是一个窗口焦点问题,仍尝试使用一些焦点(主要在警告框之后),而且似乎没有办法。

有人可以给我一般指针什么可能是解决方案吗?

PS:在游戏构造中,我使用的是动态创建的图像,在页面上只有2个带有ID的文本标签。

编辑:在的onkeyup相关联的代码:

功能muda_sentido(事件) {

//baixo 
    if(event.keyCode == 40) 
    { 
     pacman_status = status[2]; 
     imagem_pacman.src = "Imagens/pacmanb.gif"; 
     imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmanb.gif"; 
    } 
    //direita 
    else if(event.keyCode == 39) 
    { 
     pacman_status = status[0]; 

     imagem_pacman.src = "Imagens/pacmand.gif"; 
     imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmand.gif"; 
    } 
    //cima 
    else if(event.keyCode == 38) 
    { 
     pacman_status = status[3]; 
     imagem_pacman.src = "Imagens/pacmanc.gif"; 
     imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmanc.gif"; 
    } 
    //esquerda 
    else if(event.keyCode == 37) 
    { 
     pacman_status = status[1]; 
     imagem_pacman.src="Imagens/pacmane.gif" 
     imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmane.gif"; 
    } 

}

html正文内容是双H2标签(可以不加它代码格式导致它出现在预览器上)每个ID都有一个ID。

和周围的节目,我有类似:

警报( “吃豆子死了!”)

而且问题是在这之后。

2编辑:设法抓住了一段代码,位于提示框(只是改变了,现在看它在只有一个地方):

功能pacman_morreu() {

alert("O pacman morreu!"); 

    if(pacman_vidas==0) 
    { 
     alert("Game Over!"); 
     reinicia_tabuleiro(); 

    } 
    else 
    { 
     pacman_vidas--; 
     vidas.innerHTML = "Número de vidas: "+ pacman_vidas; 
    } 
    pintaEcra(); 
} 

代码中列出的功能只会做矩阵操作操作(没有什么特别的)。

编辑3:按照要求,这里有云:

功能reinicia_tabuleiro(){

pacman_vidas = 3; 
    vidas.innerHTML = "Número de vidas: 3"; 
    pontuacao.innerHTML = "Pontuação: 0"; 
    pontos = 0; 
    for(i=1;i<24;i++) 
    { 
     for(j=1;j<24;j++) 
     { 
      if(tabuleiro[i][j] == 0) 
       tabuleiro[i][j] = 2; 
     } 
    } 


} 
+0

你能为此发布js代码吗? – 2011-04-14 00:23:31

+0

你的'onkeyup'事件绑定到'window'吗? – Eliasdx 2011-04-14 00:23:58

+0

和你的w/e你的onkeyup事件的html与 – 2011-04-14 00:29:42

回答

0

对不起,伙计,我没有看到任何会引起此。你使用的是什么浏览器?我在IE和FF上做类似的测试,并在点击警告框中的“确定”后获得窗口焦点。你有没有试过使用Firebug?这是一个伟大的程序调试JavaScript。我会高度推荐它用于你正在做的这个pacman项目。您的代码中可能有一处错误,导致这种情况在上面显示的代码中不太明显。

+0

我在FF4上测试,不幸的是我不能有萤火虫运行vause它有新版本的内存泄漏....不管怎样,我会尽力解决这个问题奇怪的问题 – John 2011-04-15 00:25:32

+0

好吧,如果你想出一个帖子:)祝你好运! – 2011-04-15 16:08:52

0

我刚刚通过类似的问题与keydown和Firefox 5.0。当页面加载和所有我的$(window).keydown(...)事件都正常工作时,该窗口关注。

然后,在我显示警报后,没有任何事件触发。结果是,在我关闭警报后,窗口不会自动关注。我能够通过强制窗口在模糊时重新调整焦点来解决问题。我使用jQuery所以这里是它看起来就像是我:

$(window).blur(function(){ 
    setTimeout(function(){ 
     $(window).focus(); 
    }, 0); 
}); 

超时是必要的,因为火狐(&也许其他浏览器)不会让你一个模糊事件时立即关注。

这可能会产生意想不到的后果,因为您基本上不会让窗口模糊。例如,单击地址栏将不会工作,因为该窗口立即将焦点拉回。要挖掘更深的洞,您可以为您的回调设置“重新聚焦”标志,以便知道是否放弃焦点。这里的基本思路:

var doRefocusWindow = false; 

$(window).blur(function(){ 
    if(!doRefocusWindow) return; 
    doRefocusWindow = false; 
    setTimeout(function(){ 
     $(window).focus(); 
    }, 0); 
}); 

... 

doRefocusWindow = true; 
alert("Game Over"); 
0

那么现在,我没有解决这个问题,但我有一个解决方法。 不要使用alertbox,使用lightbox(具有更高z-index值的div),并根据javascript中的条件使div显示和隐藏。 我希望这会有所帮助。