JavaScript游戏敌人继承 - Phaser框架

时间:2017-01-22 19:53:51

标签: javascript phaser-framework

我正在尝试制造两种类型的敌人,第一种是有两种方法的机器人:睡眠和巡逻。

我的第二个敌人是飞行敌人。目的是从机器人继承睡眠方法,但修改巡逻方法。

任何人都可以告诉我,我的飞行敌人在修改巡逻方法时如何继承机器人?

以下是我的代码。当我创建flyingEnemy时,它的巡逻方法会覆盖机器人的巡逻方法,并且所有敌人都有相同的行为。

//-------------------------- ROBOT ENEMY 

var SuperSmash = SuperSmash || {};

SuperSmash.Enemy = function(game, x, y, key, velocity, tilemap, player) {
  Phaser.Sprite.call(this, game, x, y, key);

  this.game = game;
  this.tilemap = tilemap;
  this.player = player;

};

SuperSmash.Enemy.prototype = Object.create(Phaser.Sprite.prototype);
SuperSmash.Enemy.prototype.constructor = SuperSmash.Enemy;

SuperSmash.Enemy.prototype.update = function() {
  this.currentstate();
};

SuperSmash.Enemy.prototype.sleep = function() {
};

SuperSmash.flyingEnemy.prototype.patrol = function() {
  var direction
  if (this.body.velocity.x > 0) {
    this.scale.setTo(1, 1);
    direction = 1;
  } else {
    this.scale.setTo(-1, 1);
    direction = -1;
  }

  var nextX = this.x + direction * (Math.abs(this.width) / 2 + 1);
  var nextY = this.bottom + 1;
  var nextTile = this.tilemap.getTileWorldXY(nextX, nextY, this.tilemap.tileWidth,   this.tilemap.tileHeight, 'collisionlayer');

  if (!nextTile) {
    this.body.velocity.x *= -1;
  }
};



    // --------------------------- FLYING ENEMY

    var SuperSmash = SuperSmash || {};

    SuperSmash.flyingEnemy = function(game, x, y, key, velocity, tilemap, player) {
      SuperSmash.Enemy.call(this, game, x, y, key);

      this.game = game;
      this.tilemap = tilemap;
      this.player = player;

      this.animations.add("fly", [0]);
    };

    SuperSmash.flyingEnemy.prototype = Object.create(SuperSmash.Enemy.prototype);
    SuperSmash.flyingEnemy.prototype.constructor = SuperSmash.flyingEnemy;

    SuperSmash.Enemy.prototype.patrol = function() {
      "use strict";
       SuperSmash.game.physics.arcade.moveToObject(this, this.player, 200);
    };

1 个答案:

答案 0 :(得分:1)

尝试:

//Defining methods (Robot)
SuperSmash.Enemy.prototype.sleep = function() {
  //Code
  console.log('Call sleep() from Robot');
};

SuperSmash.Enemy.prototype.patrol = function() {
  //Code
  console.log('Call patrol() from Robot');
};

//In FlyingEnemy
SuperSmash.flyingEnemy.prototype.sleep = function() {
   //Inheriting the method Sleep
   SuperSmash.Enemy.prototype.sleep(this);
   console.log('Call sleep() from flyingEnemy');
}

SuperSmash.flyingEnemy.prototype.patrol = function() {
   //Override
   console.log('Call patrol() from flyingEnemy');
}

如果问题仍然存在,可能是由于这条线(我不太确定):

SuperSmash.flyingEnemy.prototype = Object.create(SuperSmash.Enemy.prototype);

如果它继续相同,它会尝试使用Sprite来覆盖它,或者它会继承flyEnemy所需方法的原型,在这种情况下它们只有2:

SuperSmash.flyingEnemy.prototype = Object.create(Phaser.Sprite.prototype);