2011-12-21 77 views
1

嘿,我想知道如何添加到我的函数draw();我的画布引擎中使用绘制来更新其中的所有内容。我想要做的是创建一个独立的引擎,可以说不做编辑,而是更新完全与它相关的新事物。对于示例 -通过另一个javascript文件添加到函数

function draw(){ 
    gameloop(); 
    cameraWrapper(); 
    context2D.clearRect(0,0,canvas.width, canvas.height); 
} 

现在说我创建一个新的应用程序,并使用这个引擎。我希望能够只需创建一个链接到发动机的独立文件说一个球员的对象。

player = new object(); 
function playerupdate(){ 
    stuff; 
    stuff; 
} 

现在我怎么会说添加playerupdate()函数进入的engine.js的抽签()函数,而编辑的engine.js文件?这会像原型吗?如果是这样,即使它不是和示例将不胜感激!

如果您有任何问题,请提问,

在此先感谢!

回答

2

我认为继承有点太复杂了......你可以用钩子来实现所有你想要的。

尝试这样:

var postDrawHooks = []; 
var draw = function(){ 
    // do stuff 
    postDrawHooks.forEach(function(hook){hook()}); 
} 

var playerUpdate = function(){...}; 
postDrawHooks.push(playerUpdate); 
+0

谢谢,这正是我需要的! – 2011-12-21 23:37:18

+0

嘿,我正在玩这个,但像cameraWrapper(播放器)呢?由于某种原因,如果函数在括号内包含某些内容(例如(player)),它不会让我推送它?有任何想法吗? – 2011-12-21 23:56:41

+0

您可以将钩子签名更新为'postDrawHooks.forEach(function(hook){hook(player)});'并在您的函数中接受该参数...'var playerUpdate = function(player){...} ;' – 2011-12-23 05:53:53

1

基本上它是一个原型。如果你不希望自己与prototypeing你可以使用一个“国产”继承复杂:

Function.prototype.method = function(name, func) { 
     this.prototype[name] = func; 
     return this; 
    }; 

    Function.method('inherits', function(parent) { 
     var d = {}, p = (this.prototype = new parent()); 
     this.method('uber', function uber(name) { 
      if(!(name in d)) { 
       d[name] = 0; 
      } 
      var f, r, t = d[name], v = parent.prototype; 
      if(t) { 
       while(t) { 
        v = v.constructor.prototype; 
        t -= 1; 
       } 
       f = v[name]; 
      } else { 
       f = p[name]; 
       if(f == this[name]) { 
        f = v[name]; 
       } 
      } 
      d[name] += 1; 
      r = f.apply(this, Array.prototype.slice.apply(arguments, [1])); 
      d[name] -= 1; 
      return r; 
     }); 
     return this; 
    }); 

现在是“类”(存在JS没有这样的事情,但是这是正确的术语),你可以通过使用myCls.inherits(parentCls)使其继承另一个“类”

+0

我真的不明白这一点尚未...我敢新的JavaScript和编程一般,但我想我很快就会需要这一点,并会牢记这一点!谢谢! – 2011-12-21 23:38:09

1

是有一个原因,你不能触发这些框架行动的事件?这样,听取“抽奖”事件的任何东西都可以通过这种方式挂钩他们的逻辑?如果没有实际的三项赛,像由@sudhir建议挂钩乔纳森会的工作,但我建议建立一个方法来注册通用挂钩,这样你可以调用像

game.register('draw',myFunctionReference); 

和游戏对象

register : function (hook,func) { 
    registeredHooks.push({'name' : hook, 'callback': func}); 
} 

和抽奖:

function draw(){ 
    gameloop(); 
    cameraWrapper(); 
    context2D.clearRect(0,0,canvas.width, canvas.height); 
    for (i=0; i < registeredHooks.length; i++) { 
     var hook = registeredHooks[i]; 
     if (hook.name == 'draw') hook.callback(); 
    } 
} 
相关问题