Javascript - 无法使SetInterval正常工作。

时间:2014-04-17 11:27:12

标签: javascript setinterval collision

这是我在这些主板上的第一篇文章,对不起,如果我做错了什么。 我一整天都在寻找这个问题的答案。 我试图制作一个简单的游戏,但是这种分裂检测正在扼杀我。我不确定它的问题是什么,它是我在数组中错误地存储敌人,还是在我检查碰撞时没有正确引用数组。任何帮助将不胜感激。

<script>

var paper = Raphael(0,0,300,450);
var x_Pos = 130;
var y_Pos = 400;
var new_Pos;
var player = paper.rect(x_Pos,y_Pos,40,5,10);
var enemy_A = new Array();
var gold_A = new Array();
var goldie = 0;
var lives = 1;
var enemy_Count = 0;
var key_Down = false;
var t_X = 0;
var t_Y = 0;
var k_X = 0;
var k_Y = 0;
//var alive = false;
//var next = true;
var enemy;
var gold;
create_all();
function create_all()
{
            for (var i = 0; i < 45; i++)
            {

                var x = ((Math.random()*200)+50);
                enemy = paper.circle(x, -10, 10);
                enemy.attr({fill: 'black'});
                enemy_A.push(enemy);
                var anim = Raphael.animation({cx:x, cy:500},7000);
                enemy_A[i].animate(anim.delay(i*500));

            }

                for (var j = 0; j < 15; j++)
                {
                var x2 = ((Math.random()*200)+50);
                gold = paper.circle(x2, -10, 5);
                gold.attr({fill: 'yellow'});
                gold_A.push(gold);
                var anim2 = Raphael.animation({cx:x2, cy:500},15000);
                gold_A[j].animate(anim2.delay(j*1000));

            }
        check_Hit(enemy_A); 
}


function check_Hit(array) 
{ 
    var e_a = array;
    var e_abb;
    for (var m = 0; m < e_a.length ; m++) 
    { 
    e_abb = e_a[m].getBBox();
    t_X = e_abb.x + e_abb.width/2;
    t_Y = e_abb.y + e_abb.height/2;
    if (t_Y >= this.y_Pos) 
    { 
        if (t_X >= x_Pos && t_X <= x_Pos + 40) 
        {
        damageHealth(); 
        e_a[m].remove();  
        e_a.pop(m); 

        } 
        }
    }setInterval(check_Hit, 200);
}

function collectGold()
{
    this.goldie = goldie + 10;
}
function damageHealth()
{
    this.lives = lives - 1;
    if (lives == 0)
    {
        //alive = false;
    }
}


function set_Player_Pos_Left(x)
{

    x_Pos = x_Pos - x;
    if (x_Pos < 0)
    {
        x_Pos = 0;
    }
    document.getElementById("test").innerHTML = "GOLD: " + goldie + "LIVES LEFT: " + lives;
    player.animate({x:x_Pos,y:y_Pos},500);
}
function set_Player_Pos_Right(x)
{

    x_Pos = x_Pos + x;
    if(x_Pos > 260)
    {
        x_Pos = 260;
    }
    document.getElementById("test").innerHTML = "GOLD: " + goldie + "   LIVES LEFT: " + lives;
    player.animate({x:x_Pos,y:y_Pos},500);
}
document.onkeydown = function(event) 
{
    var x_Pos = player.x_Pos;
    var key_Code = event.keyCode; 
    if (key_Down == false)
    {
    if (key_Code == 65 || key_Code == 37) //A OR LEFT
        {
            key_Down = true;
            new_Pos = x_Pos - 5;
            set_Player_Pos_Left(10);
        }
        //Whilst 'A' key is down, player moves left screen 2 co-ords a second.
    if (key_Code == 68 || key_Code == 39) //D OR RIGHT
        {
            key_Down = true;
            new_Pos = x_Pos + 5; //var timer = setTimeout('set_Player_Pos(new_Pos)',500);}
            set_Player_Pos_Right(10);
        }
    }
}

    document.onkeyup = function(event)
    {
        key_Code = null;
        key_Down = false;
    }




</script>

1 个答案:

答案 0 :(得分:1)

setIntervals设置定期任务。您不必在处理程序中以递归方式调用它。所以要么使用setTimeout,要么只调用一次setInterval:

setInterval(function() {
    check_Hit(enemy_A); 
}, 200);

更新:

我无法为您调试此内容,但我可以在您的代码中看到一些问题:

  • setInterval(check_Hit,200)不会将任何参数传递给check_Hit,因此该函数会失败。
  • 方法Array.pop()删除数组的最后一个元素,不带任何参数。
  • 你的意思是从数组中删除第m个元素?如果你这样做(例如使用e_a.splice(m,1)),元素m + 1将取代它,在下一次迭代中,你将增加m,从而跳过一个元素。

希望这会有所帮助。