使用通过数组传递的对象时出现问题
Having problems when using objects passed through an array
我有一个 public 'bullets' 数组,我正在将一个私有项目符号对象推入其中。它具有 x 和 y 属性,我想更改它的 y 属性 以便每次按下 space 键时它都会创建一个项目符号对象,将其推入项目符号数组,然后调用一个循环函数通过数组并更新每个项目符号的 y 属性.
然而,每次我按下 space 键时,我都会得到一个错误:
未捕获的类型错误:无法读取未定义的 属性 'y'
这有点超出我的理解范围,我不确定如何编写才能使 bullets 数组中的项目符号对象不是 'undefined'。
如果有人有任何建议,我将不胜感激。
//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();
}
}
}
此处:
for(var i = 0; i <= bullets.length; i++)
应替换为:
for(var i = 0; i < bullets.length; i++)
在您的代码中,最后一次迭代得到 bullets[bullets.length]
,即 undefined
。于是报错了。
这个错误:
Uncaught TypeError: Cannot read property 'y' of undefined
表示对象是undefined
,所以无法访问其上的属性y
。因此,在访问对象的属性之前,请始终确保您的对象已定义。
您应该使用 < 而不是 <= 小于或等于将比项目符号数组多迭代一次,从而导致您的循环迭代一个不存在的元素。除了不使用 <= 和使用 < 之外,您还可以检查项目符号是否存在,并且仅在满足条件时才执行 if 或 else 块。
if((bullet && bullet.y + bullet.height) >= 0) {
bullet.y--;
} else {
bullets.splice(i, 0);
}
我有一个 public 'bullets' 数组,我正在将一个私有项目符号对象推入其中。它具有 x 和 y 属性,我想更改它的 y 属性 以便每次按下 space 键时它都会创建一个项目符号对象,将其推入项目符号数组,然后调用一个循环函数通过数组并更新每个项目符号的 y 属性.
然而,每次我按下 space 键时,我都会得到一个错误:
未捕获的类型错误:无法读取未定义的 属性 'y'
这有点超出我的理解范围,我不确定如何编写才能使 bullets 数组中的项目符号对象不是 'undefined'。
如果有人有任何建议,我将不胜感激。
//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();
}
}
}
此处:
for(var i = 0; i <= bullets.length; i++)
应替换为:
for(var i = 0; i < bullets.length; i++)
在您的代码中,最后一次迭代得到 bullets[bullets.length]
,即 undefined
。于是报错了。
这个错误:
Uncaught TypeError: Cannot read property 'y' of undefined
表示对象是undefined
,所以无法访问其上的属性y
。因此,在访问对象的属性之前,请始终确保您的对象已定义。
您应该使用 < 而不是 <= 小于或等于将比项目符号数组多迭代一次,从而导致您的循环迭代一个不存在的元素。除了不使用 <= 和使用 < 之外,您还可以检查项目符号是否存在,并且仅在满足条件时才执行 if 或 else 块。
if((bullet && bullet.y + bullet.height) >= 0) {
bullet.y--;
} else {
bullets.splice(i, 0);
}