Javascript-Can';无法使设置间隔正常工作。
这是我在这些板上的第一篇帖子,如果我做错了什么,我很抱歉。 我整天都在寻找这个问题的答案。 我正试图做一个简单的游戏,但是大肠杆菌感染的检测让我很痛苦。我不确定它有什么问题,要么是我在数组中错误地存储了敌人,要么是在检查冲突时没有正确地引用数组。任何帮助都将不胜感激Javascript-Can';无法使设置间隔正常工作。,javascript,setinterval,collision,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.
<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>
var paper=Raphael(0,0300450);
var x_Pos=130;
变量y_Pos=400;
var new_Pos;
var player=paper.rect(x_Pos,y_Pos,40,5,10);
var_A=新数组();
var gold_A=新数组();
var-goldie=0;
var=1;
var\u计数=0;
var key_Down=错误;
var t_X=0;
var t_Y=0;
var k_X=0;
var k_Y=0;
//var-alive=false;
//var-next=true;
敌人;
var金;
创建_all();
函数create_all()
{
对于(变量i=0;i<45;i++)
{
var x=((Math.random()*200)+50);
敌人=纸。圆圈(x,-10,10);
敌人属性({fill:'black'});
敌人推(敌人);
var anim=Raphael.animation({cx:x,cy:500},7000);
敌人A[i].动画(动画延迟(i*500));
}
对于(var j=0;j<15;j++)
{
var x2=((Math.random()*200)+50);
金=纸。圆(x2,-10,5);
gold.attr({fill:'yellow'});
金推(金);
var anim2=Raphael.animation({cx:x2,cy:500},15000);
gold_A[j].动画(动画2.延迟(j*1000));
}
检查命中率(敌人);
}
功能检查\u命中(阵列)
{
var e_a=数组;
var e_abb;
对于(var m=0;m=此.Y_位置)
{
如果(t_X>=X_位置和&t_X 260)
{
x_Pos=260;
}
document.getElementById(“test”).innerHTML=“GOLD:+goldie+”生存左:“+LIVES;
播放动画({x:x_Pos,y:y_Pos},500);
}
document.onkeydown=函数(事件)
{
var x_Pos=player.x_Pos;
var key_Code=event.keyCode;
如果(向下键==错误)
{
如果(键代码==65 | |键代码==37)//A或左
{
按键向下=真;
新位置=x位置-5;
设置左侧播放器位置(10);
}
//当“A”键按下时,玩家每秒向左移动屏幕2个字符。
如果(键代码==68 | |键代码==39)//D或右
{
按键向下=真;
new_Pos=x_Pos+5;//var timer=setTimeout('set_Player_Pos(new_Pos)'500)}
将播放器位置设置为右(10);
}
}
}
document.onkeyup=函数(事件)
{
key_Code=null;
按键向下=错误;
}
setInterval设置一个周期性任务。您不必在处理程序中递归调用它。因此,请改用setTimeout,或者只调用setInterval一次:
setInterval(function() {
check_Hit(enemy_A);
}, 200);
更新:
我无法为您调试,但我可以在您的代码中看到一些问题:
- setInterval(check_Hit,200)不会传递任何参数来检查_Hit,因此该函数将严重失败
- 方法Array.pop()删除数组的最后一个元素,不接受任何参数
- 你的意思是要从数组中删除第m个元素吗?如果你这样做(例如使用e_.splice(m,1)),元素m+1将取代它,在下一次迭代中,你将增加m,从而跳过一个元素
希望这会有所帮助。谢谢您的快速回复。这确实有帮助,但碰撞只检测到一个敌方物体。知道为什么吗?