2016-09-07 4 views
0

Я уже всюду смотрел на stackoverflow, но не смог найти ответа.Закрытие Javascript (это)

Uncaught TypeError: this.rsGame не является функцией (то же самое о this.addEnemy)

let game = new Phaser.Game(600,600); 
let speed = 500; 


let scyla = { 

    preload:() => { 
     game.load.image('bg', 'assets/bg.png'); 
     game.load.image('pl', 'assets/pl.png'); 
     game.load.image('enemy', 'assets/enemy.png'); 

    }, 
    create:() => { 

     game.physics.startSystem(Phaser.Physics.ARCADE) 

     game.add.sprite(0,0, 'bg'); 

     this.player = game.add.sprite(300, 500, 'pl'); 
     this.player.anchor.set(0.5); 

     game.physics.arcade.enable(this.player); 
     this.cursors = game.input.keyboard.createCursorKeys(); 

     this.enemies = game.add.group(); 

     // this.timer = game.time.events.loop(200, this.addEnemy(), this); 
    }, 
    update:() => { 

     this.player.body.velocity.x = 0; 
     this.player.body.velocity.y = 0; 

     if (this.cursors.left.isDown) 
      this.player.body.velocity.x = speed * -1; 

     if (this.cursors.right.isDown) 
      this.player.body.velocity.x = speed; 

     if (this.cursors.up.isDown) 
      this.player.body.velocity.y = speed * -1; 

     if (this.cursors.down.isDown) 
      this.player.body.velocity.y = speed; 

     if (this.player.inWorld === false) 
      this.rsGame(); 
    }, 
    rsGame:() => { 
     game.state.start('scyla'); 

    }, 
    addEnemy:() => { 
     let enemy = game.add.sprite(300, 100, 'enemy'); 
     game.physics.arcade.enable(enemy); 
     enemy.body.gravity.y = 200; 

     this.enemies.add(enemy); 
     enemy.checkWorldBounds = true; 
     enemy.outOfBoundsKill = true; 
    } 
} 

game.state.add('scyla', scyla); 
game.state.start('scyla'); 

Я пытался что-то вроде

let self = this 

заносить окна объекта в любом случае. Это что-то делать с закрытием, но я не понимаю, точно

не знаю, как решить эту проблему:/

ответ

1

функции Стрелки набора this к лексической области. Вы пытаетесь получить доступ к объекту scyla, но функция стрелки устанавливает его на window (или что-то другое this равно на момент объявления scyla).

Либо ссылка scyla непосредственно:

scyla.rsGame(); 

или записывать свои методы с использованием стандартных функциональных выражений:

update: function() { 
    ... 
    if (this.player.inWorld === false) 
     this.rsGame(); 
} 

или сокращенный метод деклараций:

update() { 
    ... 
    if (this.player.inWorld === false) 
     this.rsGame(); 
} 
+1

Или краткие декларации метода: 'update() {' – Bergi

0

функция Стрелки сохранить значение this, когда они объявлен.

Используйте регулярное выражение функции. Не используйте для этого функции стрелок.

preload: function preload() { 
    // etc 
} 
0

Функции стрелки лексически ограничены this. Вам необходимо использовать обычные функции в вашем случае, чтобы this получил привязку, как обычно. Изменение:

update:() => { 

To:

update: function () { 

и аналогично для других свойств scyla.

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