2014-01-23 4 views
2

Я смущен, как определять и вызывать методы объекта JavaScript. Я пытаюсь создать игру в JavaScript и хочу создавать объекты с функциями для управления каждым элементом. В настоящее время функция game.update вызывает ошибку при попытке вызвать player.update. Он не может найти метод. Как мне обратиться к методам определения и вызова. Я исхожу от использования java.Вызов функций объекта

//INIT 
var game; 
var paper; 
var key = [0, 0, 0, 0, 0]; // left, right, up, down 

window.onload = function() { 
    paper = Raphael("canvas", 640, 480); 
    game = new Game(); 
    game.init(); 
}; 

//GAME 
function Game() { 
    this.player = new Player(); 
    this.score = 0; 

    this.drawCanvas = function() { 
     paper.clear(); 
     paper.rect(0, 0, 640, 480, 10).attr({ 
      fill: "#fff", 
      stroke: "none" 
     }); 
     paper.text(40, 10, "Score " + this.score); 
     paper.ellipse(this.player.positionX, this.player.positionY, 10, 10); 
    } 

    this.update = function() { 
     this.player.update.call(); 
     this.drawCanvas.call()(); 
    } 

    this.init = function() { 
     this.drawCanvas(); 
     setInterval(this.update, 35); 
    } 
} 

//UNITS 

//PLAYER 
function Player() { 
    this.positionX = 100; 
    this.positionY = 100; 

    this.update = function() { 
     if (key[0]) { //left 
      this.positionX -= 3; 
      game.score += 3; 
     } 
     if (key[1]) { //right 
      this.positionX += 3; 
      game.score += 3; 
     } 
     if (key[2]) { //up 
      this.positionY -= 3; 
      game.score += 3; 
     } 
     if (key[3]) { //down 
      this.positionY += 3; 
      game.score += 3; 
     } 
     if (key[4]) { //space 

     } 

     if (this.positionX > 640) { 
      this.positionX = 640; 
     } else if (this.positionX < 0) { 
      this.positionX = 0; 
     } else if (this.positionY > 480) { 
      this.positionY = 480; 
     } else if (this.positionY < 0) { 
      this.positionY = 0; 
     } 
    } 
} 

function changeKey(which, to) { 
    switch (which) { 
     case 65: 
     case 37: 
      key[0] = to; 
      break; // left 
     case 87: 
     case 38: 
      key[2] = to; 
      break; // up 
     case 68: 
     case 39: 
      key[1] = to; 
      break; // right 
     case 83: 
     case 40: 
      key[3] = to; 
      break; // down 
     case 32: 
      key[4] = to; 
      break; // space bar; 
     case 17: 
      key[5] = to; 
      break; // ctrl 
    } 
} 
document.onkeydown = function (e) { 
    changeKey((e || window.event).keyCode, 1); 
}; 
document.onkeyup = function (e) { 
    changeKey((e || window.event).keyCode, 0); 
}; 

Я получаю следующее сообщение об ошибке:

Uncaught TypeError: Cannot read property 'update' of undefined  main.js:25 

ответ

2

Вопрос здесь, где вы» ve снял update метод от this.

this.init = function() { 
    this.drawCanvas(); 
    setInterval(this.update, 35); // <-------- passing `update` without `this` 
} 

Так что, когда вы дойдете до этой линии в update()

this.player.update.call(); 

Значение this является глобальным объектом, который не имеет player свойства, так что вы пытаетесь получить доступ к .update.call() на undefined.


Вы должны держать их оценку:

this.init = function() { 
    this.drawCanvas(); 
    var self = this; 
    setInterval(function() { 
     self.update(); 
    }, 35); 
} 

Или использовать Function.prototype.bind, чтобы создать новую функцию с this связанной постоянно функции.

this.init = function() { 
    this.drawCanvas(); 
    setInterval(this.update.bind(this), 35); 
} 
+0

Спасибо, что исправил это. Однако теперь я получаю «Uncaught TypeError: Не могу прочитать свойство« positionX »неопределенного» в строке 21. Но я посмотрю на это. –

+0

Возможно, потому, что вы не передаете значение 'this' для' .call() '. Первый аргумент, который вы ему даете, должен быть тем, что вы хотите установить как его значение this. Если вам не нужно специальное значение this this, то просто сделайте 'this.player.update();' –

+0

... и это тоже неверно ;-) 'this.drawCanvas.call()(); ' –

3

Это недопустимый синтаксис:

this.update : function(){ 

вы хотите просто это

this.update = function(){ 
+0

Но это будет SyntaxError, а не TypeError. –

+0

Я действительно забыл изменить это. Это было фактически и = знак. Я просто играл вокруг –

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