我也在使用Canvas上的Backbone.js
進行紙牌遊戲,並且遇到了這個問題。我目前正在做的是有一個CardView
,它具有el
作爲畫布標記,以便在初始化時創建畫布。卡片的所有圖紙都在此視圖的render
方法上完成。但是,此畫布不會被添加到DOM
。
然後我有一個Hand
,這是一個Backbone.Collection
來持有卡集合。這個集合有一個Backbone.View
附加到遊戲畫布(DOM
中唯一和大的一個)。該視圖還包含Backbone.View
的數組。然後,我有:
render: function() {
var that = this;
this.ctx.save();
_(this._views).each(function(view) {
that.ctx.drawImage(view.render().el, 0, 0);
that.ctx.translate(view.el.width, 0);
});
this.ctx.restore();
},
基本上,我每個視圖的畫布到使用上下文的drawImage
遊戲畫布。
我addEventListener
到HandView
的畫布(這是它的el
)來處理點擊。在這個處理程序中,我檢查對應的鼠標位置,然後操縱該視圖。
你要知道,這僅僅是什麼我嘗試,因爲我是新來的太Backbone.js
。這可能是最糟糕的方式,但我希望你能看到其中的一種方法。
我希望我們能檢查鼠標對不存在於DOM的畫布。如果可能的話,我們只需addEventListener
至CardView
的畫布,然後讓它翻譯並重新渲染。不需要HandView
的畫布循環顯示其視圖。
這就是我開始學習的結論。所以基本上我需要將所有命中測試和畫布繪製代碼放在Backbone.Model中?或者你認爲擴展Backbone.View以獲得畫布引用而不是'el'引用是有意義的嗎? – 2011-05-30 20:53:31
我不會擴展'Backbone.View',但我會問:從我的模型類中分離出我的視圖類是否有好處?換句話說,是否有不止一種方法來繪製特定的模型,或者有多種類型的模型可以使用相同的畫布代碼?如果是這樣,那麼使用'Backbone.Model'和你自己的'CanvasView'類;如果沒有,只要讓每個'Backbone.Model'子類都包含自己的畫布代碼就會更簡單,正確的MVC就會被詛咒。 – 2011-05-30 23:22:45