【问题标题】:Having problems when using objects passed through an array使用通过数组传递的对象时出现问题
【发布时间】:2015-07-31 16:37:26
【问题描述】:

我有一个公共的“子弹”数组,我将一个私有子弹对象推入其中。它有 x 和 y 属性,我想更改它的 y 属性,这样每次我按下空格键时,它都会创建一个项目符号对象,将其推入项目符号数组,然后调用一个函数,该函数循环遍历数组并更新每个项目符号的 y属性。

但是,每次我按空格键时都会出错:

未捕获的类型错误:无法读取未定义的属性“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();
            }
        }
    }

【问题讨论】:

标签: javascript arrays undefined


【解决方案1】:

您应该使用

  if((bullet && bullet.y + bullet.height) >= 0) {
      bullet.y--;
  } else {
      bullets.splice(i, 0);
  }

【讨论】:

  • bullets.splice[i, 0]; -> bullets.splice(i, 1);
  • @aduch 哎呀,只是复制 OP 发布的内容并没有意识到这是错误的 :)
【解决方案2】:

这里:

for(var i = 0; i <= bullets.length; i++)

应替换为:

for(var i = 0; i < bullets.length; i++)

在您的代码中,最后一次迭代得到bullets[bullets.length],即undefined。错误就来了。

这个错误:

未捕获的类型错误:无法读取未定义的属性“y”

表示对象为undefined,因此无法访问其上的属性y。因此,请始终确保在访问对象的属性之前定义您的对象。

【讨论】:

  • 啊,非常感谢!这样就解决了问题。
  • @CerpinTaxt 很高兴。您可以投票或接受答案:)。谢谢。
猜你喜欢
  • 2022-01-21
  • 2012-09-06
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2023-02-05
  • 2011-07-25
  • 2012-03-03
相关资源
最近更新 更多