基于Javascript组件的游戏设计

基于Javascript组件的游戏设计,javascript,inheritance,prototypal-inheritance,Javascript,Inheritance,Prototypal Inheritance,我正在node.js服务器上开发一个基于浏览器的游戏。我试图实现一个基于组件的继承结构,但是我不确定javascript继承的概念 据我所知,如果我想从两个组件对象继承,例如函数Moves(){}和函数IsVisible(){},通常的原型继承不起作用: gameObject.prototype = new Moves; gameObject.prototype = new IsVisible; isIsVisible对象将移动对象覆盖为游戏对象原型 下面是我尝试创建一个继承函数,该函数将目标

我正在node.js服务器上开发一个基于浏览器的游戏。我试图实现一个基于组件的继承结构,但是我不确定javascript继承的概念

据我所知,如果我想从两个组件对象继承,例如
函数Moves(){}
函数IsVisible(){}
,通常的原型继承不起作用:

gameObject.prototype = new Moves;
gameObject.prototype = new IsVisible;
is
IsVisible
对象将
移动对象覆盖为
游戏对象
原型

下面是我尝试创建一个继承函数,该函数将目标对象和任意数量的组件对象作为参数。然后,目标对象从这些组件继承行为和变量

我不熟悉javascript继承,想知道下面的方法是否是在javascript中实现多重继承类型结构的好方法

有没有其他行之有效的做法来处理这个问题?(如果是问题…)

任何帮助都将不胜感激

function inherit(o){

    var proto = o;
    for(var i = 1; i < arguments.length; i++){
        var component =  new arguments[i]();
        for(var x in component){
            proto[x] = component[x];
        }
    }
}

function Player(name){

    var o = {};
    o.name = name;
    inherit(o, WorldSpace, Active);
    return o;

}

function WorldSpace(){
    this.pos = {x:0, y:0};
    this.orientation=0;
}

function Active(){
    this.acceleration = 1;
    this.velocity = {x:0,y:0};
    this.rotation = 0;
    this.rotationSpeed = (Math.PI*2)/30;
    this.throttle = false;
    this.currentSpeed = 0;
    this.maxSpeed = 10;
}
函数继承(o){
var-proto=o;
for(var i=1;i
从我在代码中看到的情况来看,您并不真正需要多重继承。您只是试图将来自不同构造函数的代码混合到一个构造函数中。这是可能的,而且在JavaScript中实现起来非常简单

首先,让我们为
Player
重写您的代码:

function Player(name) {
    this.name = name;
    WorldSpace.apply(this);
    Active.apply(this);
}
就这样。简单对吧?让我解释一下该功能是如何工作的:

  • JavaScript中的每个函数都有一个名为this
  • 的特殊指针
  • 正常调用函数时,此通常指向全局对象(例如
    窗口
  • 当您调用前面带有关键字
    new
    JavaScript的函数时,会创建该函数的一个实例,并且
    指向该实例
  • JavaScript还有两个函数
    call
    apply
    ,它们是每个函数的方法,允许您使用
    这个
    指针的任何值调用该函数
  • 因此,当我调用
    WorldSpace.apply
    并将
    this
    作为第一个参数时,
    WorldSpace
    函数中的
    this
    指针指向
    播放器中的
    this
    。实际上,您使用的是
    WorldSpace
    Active
    构造函数


    如果您想更多地了解JavaScript中继承是如何工作的,我建议您阅读本文。您是否考虑过使用a来简化您的生活?

    从我在您的代码中看到的情况来看,您实际上不需要多重继承。您只是试图将来自不同构造函数的代码混合到一个构造函数中。这是可能的,而且在JavaScript中实现起来非常简单

    首先,让我们为
    Player
    重写您的代码:

    function Player(name) {
        this.name = name;
        WorldSpace.apply(this);
        Active.apply(this);
    }
    
    就这样。简单对吧?让我解释一下该功能是如何工作的:

  • JavaScript中的每个函数都有一个名为this
  • 的特殊指针
  • 正常调用函数时,此通常指向全局对象(例如
    窗口
  • 当您调用前面带有关键字
    new
    JavaScript的函数时,会创建该函数的一个实例,并且
    指向该实例
  • JavaScript还有两个函数
    call
    apply
    ,它们是每个函数的方法,允许您使用
    这个
    指针的任何值调用该函数
  • 因此,当我调用
    WorldSpace.apply
    并将
    this
    作为第一个参数时,
    WorldSpace
    函数中的
    this
    指针指向
    播放器中的
    this
    。实际上,您使用的是
    WorldSpace
    Active
    构造函数


    如果您想更多地了解JavaScript中继承是如何工作的,我建议您阅读本文。您是否考虑过使用a来简化您的生活?

    尝试将Player设置为构造函数,并使用传统的javascript继承方式,这在web上随处可见。@Bergi javascript不支持多重继承,因此使用
    person.prototype=new WorldSpace;person.prototype=new-Active
    不起作用。您不需要多重继承,只需要混合-您的代码中没有原型。AaditMShah是完全正确的。@Bergi您的产品线现在是我的Googlish:尝试让Player成为构造函数,并使用传统的javascript继承方式,这在web上随处可见。@Bergi javascript不支持多重继承,因此使用
    person.prototype=new WorldSpace;person.prototype=new-Active
    不起作用。您不需要多重继承,只需要混合-您的代码中没有原型。阿迪姆沙是完全正确的。@Bergi你的台词现在是我的谷歌语:太棒了,我知道一定有更好的方法。我目前没有考虑一个框架来专注于学习核心javascript。谢谢你的帮助。太棒了,我知道一定有更好的方法。我目前没有考虑一个框架来专注于学习核心javascript。谢谢你的帮助。