2013-02-25 3 views
0

Я пытаюсь сделать игру для Windows 8 с помощью HTML/Javascript и WinJS, и в настоящее время у меня возникают проблемы с «прототипами», которые ведут себя статически, когда я их не хочу. Я никогда не использовал Javascript в такой степени или с таким количеством объектов, поэтому я, вероятно, сделал тупо простую ошибку, но я не могу понять, что.Объекты прототипа экземпляра ведут себя статически?

Во-первых здесь некоторые из кода (это длинный класс) Я говорю:

(function() { 
    "use strict"; 

    WinJS.Namespace.define("Race", { 
     Car: WinJS.Class.derive(
      Race.Common, 
      //Constructor method. 
      function (slotNum, slotData, canvas, stage, preload, pixelScale) { 
       this.canvas = canvas; 
       this.stage = stage; 
       this.preload = preload; 
       this.pixelScale = pixelScale; 

       this.slotNum = slotNum; 
       this.slotData = slotData; 
      }, 
      //Instance properties and methods. 
      { 
       /** Properties **/ 
       slotNum: 0, 
       slotData: {}, 
       position: { x: 0, y: 0, r: 0 }, 
       lastPosition: { x: 0, y: 0, r: 0 }, 

       /**Methods **/ 
       /** 
       * 
       */ 
       calcRotation: function() { 
        //get angle between last position and current position 

        this.lastPosition.r = this.position.r; 
        this.position.r = this.getAngle(this.lastPosition.x, this.lastPosition.y, this.position.x, this.position.y); 
       }, 
      }, 
      //Static properties and methods. 
      { 
       //Debug properties. 
       showDebug: true, 
       debugCarColors: ['red', 'yellow', 'blue', 'green'], 
      } 
     ) 
    }); 
}()); 

Итак, есть четыре экземпляра Race.Car, каждый с различным набором slotData. Это прекрасно работает - каждый экземпляр имеет свой собственный набор slotData и собственный slotNum. Я могу подтвердить это с помощью точек останова (поскольку он циклически проходит через автомобили, slotData специфичен для каждого экземпляра). Поскольку я занимался только позицией до сих пор, это, похоже, функционировало правильно.

У меня возникла проблема с тем, однако, это lastPosition. Это устанавливается на lastPosition для последнего автомобиля, а не lastPosition для этого автомобиля. Я бы подумал определить его в разделе «экземпляры» раздела WinJS.Class.define (а не в статических членах), и использование этого.lastPosition делает это очевидным.

Почему это не так, как я ожидал, и что я делаю неправильно? Большое спасибо

+0

Вы можете попытаться объявить в явной форме lastPosition к нулю? Поэтому в конструкторе добавьте this.lastPosition = null. –

+0

Просто выдает ошибку «невозможно установить свойство x неопределенной». Если я использую «обычные» свойства (positionX, positionY, lastPositionX, lastPositionY), все работает нормально. Я предполагаю, что определение позиции как литерала объекта, вместо того, чтобы делать что-то вроде новых Coords (x, y, r), является проблемой на данный момент, но, похоже, сложно определить класс только для пары координат. – Fourjays

+0

А, так это должно работать, когда вы добавляете this.lastPosition = {x: 0, y: 0, r: 0} в конструктор? –

ответ

1

При вызове объекта, попробуйте добавить его по умолчанию в конструкторе, например:

function (slotNum, slotData, canvas, stage, preload, pixelScale) { 
      this.canvas = canvas; 
      this.stage = stage; 
      this.preload = preload; 
      this.pixelScale = pixelScale; 

      this.slotNum = slotNum; 
      this.slotData = slotData; 
      this.lastPosition = { x: 0, y: 0, r: 0 }; 
     }, 

Приветствия :-)

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