我有一个公共'子弹'数组,我正在推动私人子弹对象。它有x和y属性,我想改变它的y属性,这样每次按下空格键就会创建一个子弹对象,将其推入子弹阵列,然后调用循环数组的函数并更新每个子弹的y属性。
但是,每次按空格键都会出错:
未捕获的TypeError:无法读取未定义的属性“y”
这稍微超出了我的理解,我不知道如何写这个,以便子弹阵列中的子弹对象不是'未定义'。
如果有人有任何建议我会非常感谢你的帮助。
//called every frame
function playGame()
{
movePlayer();
playerShoot();
moveBullet();
}
//PLAYER SHOOT FUNCTION
//If the space key is down, player.shoot is true and the bullet object is created.
function playerShoot()
{
if(player.shoot)
{
var bullet = Object.create(spriteObject);
bullet.width = 16;
bullet.height = 16;
bullet.x = (player.width - bullet.width) / 2;
bullet.y = (player.height - bullet.height) / 2;
bullets.push(bullet);
player.shoot = false;
}
}
//MOVING THE BULLET
function moveBullet()
{
if(bullets.length !== 0)
{
for(var i = 0; i <= bullets.length; i++)
{
var bullet = bullets[i];
console.log("bullet: " + bullet);
//bullet.y causes error: Uncaught TypeError: Cannot read property 'y' of undefined
if((bullet.y + bullet.height) >= 0)
{
bullet.y--;
}
else
{
bullets.splice[i, 0];
}
}
}
}
//RENDERING THE BULLETS
function renderBullet()
{
if(bullets.length !== 0)
{
for(var i = 0; i <= bullets.length; i++)
{
var bullet = bullets[i];
bullet.render();
}
}
}
答案 0 :(得分:4)
你应该使用&lt;而不是&lt; =小于或等于将比bullets数组迭代一次,导致循环遍历非现有元素。除了不使用&lt; =和使用&lt;您还可以检查子弹是否存在,只有在满足条件时才执行if或else块。
if((bullet && bullet.y + bullet.height) >= 0) {
bullet.y--;
} else {
bullets.splice(i, 0);
}
答案 1 :(得分:2)
这里:
for(var i = 0; i <= bullets.length; i++)
应替换为:
for(var i = 0; i < bullets.length; i++)
在您的代码中,最后一次迭代获得bullets[bullets.length]
,即undefined
。错误就出现了。
此错误:
未捕获的TypeError:无法读取属性&#39; y&#39;未定义的
表示对象为undefined
,因此无法访问其上的属性y
。因此,在访问其中的属性之前,请务必确保定义对象。