使用Ember编写基于画布的游戏

时间:2013-07-14 18:15:05

标签: javascript canvas ember.js

我是Ember的新手,我正在尝试使用Ember来编写基于画布的游戏。这款游戏的刷新速度非常慢(基本上是基于回合的,所以不需要获得巨大的FPS)。

每个模型都有大量的视图侧渲染(计算轨迹等),我非常喜欢Ember数据模型和用法。

我目前的工作方式是,对于集合中的每个模型对象,我在视图中调用方法“draw”,并将canvas上下文作为参数传递。然后它将自己绘制在画布上相对于中心点的适当位置。

我现在正在添加点击事件,当我点击某个对象时,我正在考虑进行模态对话。问题是,这个代码在哪里去了?我目前在模型中添加它,但(特别是因为我无法访问路由器),它真的不属于那里。同样,我的模型目前因为我对渲染代码的喜好而过于混乱。

点击事件(画布坐标)和画布绘图代码应该放在哪里?我认为理想情况下,我应该使用装饰器模式,但我不确定如何将其融入Ember框架。

编辑:代码示例:这是主视图,最初加载画布:

Space.CanvasView = Ember.View.extend({
  tagName: 'canvas',

  didInsertElement: function(){
    this._super();
    var context = this.draw();
    this.get('controller').send('draw', context)
  },

  draw: function(){
    canvas = this.get('element');
    context = canvas.getContext('2d');
    var w = $(window).width();
    var h = $(window).height();
    canvas.width = w;
    canvas.height = h;
    context.fillRect (0, 0, w,h);
    context.centerX = w/2;
    context.centerY = h/2;
    return context;
  }
});

然后,在主父视图中:

Space.System = DS.Model.extend({
  name: DS.attr('string'),
  //attributes and various other model methods that do some maths

  draw: function(context){
    var drawRadius = this.get('radius');
    // 30 lines of drawing on the canvas
    context.fill();
    this.get('orbitals').forEach(function(orbital){
      orbital.draw(context);
    })
  },

  setContext: function(context){
    var sys = this
    this.get('orbitals').then(function(){
      sys.clickHandlers(context);
      sys.draw(context);
    })
    window.onresize = function(e){sys.draw(context)};
  },

  clickHandlers: function(context){
    system = this;
    context.canvas.addEventListener('click', function(ev){
      system.get('orbitals').map(function(orbital){
        if(orbital.withinOrbital(context, ev.clientX - context.canvas.offsetLeft, ev.clientY - context.canvas.offsetTop)){
          console.log(orbital);
        }
      })
    }, false)
  }

同样,每个Orbital然后实现它自己的draw方法,将上下文作为将其绘制到画布上的参数。

1 个答案:

答案 0 :(得分:1)

我知道这已经在上面的回复中讨论了,但我也会说Ember不是游戏开发的工具。但从好的方面来看,似乎有很多JS游戏引擎。看看https://gist.github.com/bebraw/768272,查看其中一堆列表。

与JS的其他领域一样,似乎有十亿个,我对它们没有经验,所以我不能给出建议,但看一看,看看哪个对你最有意义。如果你找到任何好的,请告诉我......我会对你找到的东西感兴趣。