Javascript 扩展Phaser.js类

Javascript 扩展Phaser.js类,javascript,oop,phaser-framework,Javascript,Oop,Phaser Framework,我正在使用Phaser框架,我想创建一个新类来保存Phaser中sprite类的所有属性,所以我试着这么做 var mario = function(){ Phaser.Sprite.call(this); // inherit from sprite }; 但是出现了一个错误“UncaughtTypeError:undefined不是函数” 然后我试着 var mario = function(){ this.anything = ""; }; mario.protot

我正在使用Phaser框架,我想创建一个新类来保存Phaser中sprite类的所有属性,所以我试着这么做

var mario = function(){

    Phaser.Sprite.call(this); // inherit from sprite
};
但是出现了一个错误“UncaughtTypeError:undefined不是函数”

然后我试着

var mario = function(){

   this.anything = "";

};

mario.prototype = new Phaser.Sprite();
好的,它可以工作,但它调用了phaser构造函数,我不想创建sprite,直到我创建了
var heroObj=new mario()


我该怎么办?

像这样试试。我添加了一个名称空间以避免全局变量

var YourGameNSpace = YourGameNSpace || {};

YourGameNSpace.Mario = function (game) {
    'use strict';

    Phaser.Sprite.call(this, game);
};

// add a new object Phaser.Sprite as prototype of Mario 
YourGameNSpace.Mario.prototype = Object.create(Phaser.Sprite.prototype);
// specify the constructor
YourGameNSpace.Mario.constructor = YourGameNSpace.Mario;

//add new method
YourGameNSpace.Mario.prototype.init = function () {
    'use strict';
    ...
};
在您可以实例化它之后:

var mario = new YourGameNSpace.Mario(game);

现在使用ES6就容易多了,例如:

export default class CustomSprite extends Phaser.Sprite {
    constructor(game){
        super(game, 0, 0);
        this.addChild(game.add.sprite(0, 0, 'someSprite'));
        game.stage.addChild(this);
    }
    update() {
        //move/rotate sprite
    }
}
然后,您可以像这样导入和使用它:

this.customSprite = new CustomSprite(this.game);
this.customSprite.x = 400;
this.customSprite.y = 100;

下面是一个让您开始学习的样板文件:

我编写了一小套JS实用程序,包括继承(甚至可能是抽象的)类:


如果您感兴趣,.

谢谢,它可以工作,但是您能解释一下“Object.create”是什么吗?Object.create()方法使用指定的原型对象和属性创建一个新对象。
this.addChild(game.add.sprite(0,0,'someSprite'))的用途是什么?在我的例子中,这一行创建了第二个精灵。这只是向自定义精灵添加另一个精灵的示例。您也可以将其删除。是否可以在扩展类中获取
game
,而不将其传递到
new
方法中?这是非常旧的代码,您现在更愿意将其添加到场景而不是游戏中。实际上,您不需要保留引用,因为“this.scene”将返回精灵的场景。
var Unit = squishy.extendClass(Phaser.Sprite, 
function (game, x, y, sprite, ...) {
    // ctor

    // Call the the base (Sprite) ctor
    this._super(game, x, y, sprite);

    // ...
},{
    // methods
    update: function() {
        // ...
    }
});