基于 Javascript 组件的游戏设计

标签 javascript inheritance prototypal-inheritance

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

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

gameObject.prototype = new Moves;
gameObject.prototype = new IsVisible;

IsVisible 对象覆盖了 Moves 对象作为 gameObject 原型(prototype)。

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

我不熟悉 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;
}

最佳答案

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

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

function Player(name) {
    this.name = name;
    WorldSpace.apply(this);
    Active.apply(this);
}

就是这样。简单吧?让我解释一下 apply 功能有效:

  1. JavaScript 中的每个函数都有一个特殊的指针,称为this。 .
  2. 当你正常调用函数时this通常指向全局对象(例如 window )。
  3. 当您调用以关键字 new 开头的函数时JavaScript 创建该函数的一个实例,并且 this指向那个实例。
  4. JavaScript 还有两个函数callapply这是每个函数的方法,允许您使用 this 的任何值调用该函数指针。

基本上当我调用 WorldSpace.apply 时与 this作为第一个参数,this WorldSpace 中的指针功能点 thisPlayer .您实际上是在使用 WorldSpaceActive构造函数为 mixins .

如果您想了解更多有关 JavaScript 中继承如何工作的信息,我建议您阅读这篇文章 answer .您是否考虑过使用 framework让您的生活更简单?

关于基于 Javascript 组件的游戏设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336520/

相关文章:

javascript - 如何使用 Javascript 或 JQuery 从 Salesforce1 应用程序导航到 iOS 13 中的其他 native 应用程序?

javascript - 如何在 localStorage 中存储列表

java - 抽象方法实现与抽象方法覆盖。这两个对于抽象类意味着相同吗?

JavaScript 扩展类

JavaScript 原型(prototype)继承困惑——我在这里错过了什么?

javascript - JQuery 按特定值搜索 JSON

javascript - 在mongodb中插入数据时添加条件

c# - 用具体类型覆盖抽象方法

javascript - 原型(prototype)继承中的 call() 需要什么

javascript - Object.create( parentObject{ nestedObject :{} } )