2015-07-31 4 views
1

У меня есть публичный массив «bullets», в который я ввожу частный объект пули. Он имеет свойства x и y, и я хочу изменить его свойство y, чтобы каждый раз, когда я нажимаю клавишу пробела, он создает объект пули, толкает его в массив маркеров, а затем вызывает функцию, проходящую через массив, и обновляет каждую пулю y имущество.Проблемы при использовании объектов, прошедших через массив

Однако каждый раз, когда я нажимаю клавишу пробела я получаю сообщение об ошибке:

Uncaught TypeError: Не удается прочитать свойство «у» неопределенной

Это немного выше моего понимания, и я не знаю, как Я могу написать это так, чтобы объекты пули в массиве 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(); 
      } 
     } 
    } 
+0

Также см http://stackoverflow.com/questions/8004617/javascript-cannot-read-property-bar-of-undefined – britter

ответ

2

Здесь:

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 на нем. Поэтому всегда проверяйте свой объект перед доступом к ним.

+0

Ах спасибо большое! Это решило проблему. –

+0

@CerpinTaxt Мое удовольствие. Вы можете поддержать или принять ответ :). Благодарю. – Joy

4

Вы должны использовать < вместо < = меньше или равно будет повторять итерацию в один раз больше, чем массив маркеров, в результате чего ваш цикл будет итерации по не существующему элементу. В дополнение к тому, что не используется < = и с использованием < вы также можете проверить, существует ли пуля, и выполнять только те блоки if или else, если условие выполнено.

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

'bullets.splice [i, 0];' -> 'bullets.splice (i, 1);' – axelduch

+0

@aduch whoops, просто копируя то, что размещал OP, не понимал, что это было неправильно :) – Yahkob

Смежные вопросы