2015-08-14 69 views
1

我一直在制作一个游戏来练习编程,而我在使用Jquery .click()函数时遇到了问题。我的代码中有两个按钮,即开始按钮和攻击按钮。当我点击开始按钮时,.click()函数也会触发另一个按钮的代码,这会导致我的主菜单冻结并且不会绘制游戏屏幕。我已经使用了单独的ID作为按钮,但它们都似乎识别了单击开始按钮。我无法让它在JSFiddle中工作,但所有的代码都在那里。有人可以告诉我如何使用多个按钮?为什么jquery .click()触发多个函数?

//start button 
$('#startButton').click(function() { 
    stage.state = "battle"; 
    stage.update(); 
}) 

//attack button 
$('#attack').click(firstTurn()); 

//attack button code 
function firstTurn() { 
    console.log("firstTurn Fired"); 
    if(p1.speed > opp.speed){ 
     turn = 1; 
    } else{ 
     turn = 0; 
    } 
    battle(); 
}; 

function battle(){ 
    var battling = 1; 
    while(battling == 1) { 
     if(turn == 0) { 
      p1.health = p1.health-opp.attack; 
      $("#textBox").append('<p>'+opp.name+' hit you for '+ opp.attack+' points.</p><br/>'); 
      draw(); 
      sleep(1000); 
      console.log("attacked"); 
     } else{ 
      opp.health = opp.health-p1.attack; 
      $('#textBox').append('<p> You hit '+opp.name+' for '+p1.attack+' points.</p><br/>'); 
      draw(); 
      sleep(1000); 
     } 
    } 
}; 

https://jsfiddle.net/memersond/m3gvv8y6/

+1

究竟什么是'睡眠()'该怎么办? ...哦,我明白了。这绝对不是延迟执行JavaScript的方式。该代码将冻结整个浏览器。 – Pointy

+0

你能推荐另一种方式来完成任务吗?我假设如果你是正确的,这就是冻结我的代码 – user2905256

+0

你得到的是**忙碌循环**。你只是在给定的时间内烧掉客户端的CPU周期,使用电池,让风扇旋转等等。在JavaScript中,你使用超时来达到这个目的,因为它们根本没有烧坏CPU(或者是非常小的数量)。但是,您必须重新安排逻辑的工作方式。就你而言,可能是因为你可以设置一个“不做任何事情”的标志,并在1秒后超时。 – Pointy

回答

10
$('#attack').click(firstTurn()); 

应该是:

$('#attack').click(firstTurn); 

你要传递的功能作为参考,没有它立即执行。

+0

谢谢,修正了主菜单中的冻结,但现在当我点击攻击按钮时它冻结。任何想法为什么? – user2905256

+0

我试图从p1.health和visa vera中减去opp.attack的值。为什么我需要一个数组来做到这一点? – user2905256

+0

@ user2905256你没有。对不起,从写它的方式看起来你试图访问一个复杂的对象属性。 – War10ck

0
$('#attack').click(firstTurn()); 

这将导致firstTurn()监听器启动时被调用,使用选项之一:

$('#attack').click(firstTurn); 

$('#attack').click(function() { 
    firstTurn() 
}); 
相关问题