做爲一個pixi.js,p5.js等圖形庫的使用者,我以爲他們的上手成本體如今:git
1.你得先去學習它們庫的語法與層級/事件概念。github
2.在沒讀源碼前它們就是一個黑盒,出了奇怪的bug難以去定位,網上的中文經驗也不多,要想把它們使用好須要時間去積累經驗。canvas
3.不少時候我僅僅只是想去實現並不複雜的canvas互動效果,卻要引用一個很是大的庫。api
這個庫就是爲了解決這些矛盾,它的特色是:app
下面是這個庫的使用實例dom
let app = new Moa.App(document.querySelector(".stage"));
let rect = app.Obj(200, 200, 100, 100, ctx => {
ctx.fillStyle = "#ffffff";
ctx.fillRect(0, 0, 100, 100);
});
rect.on("mouseenter", function(e) {
this.draw = ctx => {
ctx.fillStyle = "#c0ebff";
ctx.fillRect(0, 0, 100, 100);
};
});
app.run()
複製代碼
draw
函數完成視圖的變換。對於一個熟悉原生canvas語法的人來講幾乎沒有上手成本。
在這個庫中,全部可視的東西都是由繪圖對象Obj
組成,咱們調用app.Obj
便可新生成一個繪圖對象,它的參數分別是此對象的起始座標x
,此對象的起始座標y
,此對象的碰撞區域寬度width
,此對象的碰撞區域高度height
,此對象的繪圖函數draw
,以及一個可選參數此對象的層級zIndex
。函數
在上面的例子中,有這樣一段代碼學習
ctx => {
ctx.fillStyle = "#ffffff";
ctx.fillRect(0, 0, 100, 100);
}
複製代碼
這個回調函數會被註冊爲此Obj
的繪圖函數draw
,而在實際調用時,這個ctx並非canvas.getContext('2d')
獲得的ctx,而是它的變異,它全部方法必要的座標都變成了相對座標。ui
下面展現了一段將這個對象變爲可拖拽對象的代碼this
let ifDrag = false;
const p = {
x: undefined,
y: undefined
};
rect.on("mousedown", function(e) {
ifDrag = true;
p.x = e.x;
p.y = e.y;
});
rect.on("mouseup", function(e) {
ifDrag = false;
});
rect.on("mousemove", function(e) {
if (ifDrag) {
this.x += e.x - p.x;
this.y += e.y - p.y;
p.x = e.x;
p.y = e.y;
}
});
複製代碼
支持["click", "mousemove", "mouseup", "mousedown", "mouseover", "mouseenter", "mouseleave"]
注意這裏只有調用了Obj.on("eventname", cb)
的Obj
纔會被加入下面的層級比較中,若是歷來沒有調用過on
方法,那麼這個Obj在層級中是一個可穿透的對象。
這個庫中的層級分爲三個層級,低層級,普通層級,高層級。沒有設置zIndex默認爲普通層級。
好比這樣創造一個Obj
let rect = app.Obj(200, 200, 100, 100, ctx => {
ctx.fillStyle = "#ffffff";
ctx.fillRect(0, 0, 100, 100);
}, 1);
複製代碼
最後多了一個參數1
做爲zIndex
,若果它大於0,則會被推入高層級,undefined
則會推入普通層級,小於0則會推入低層級。渲染時會先根據zIndex渲染低層級,再根據普通層級的生成順序渲染普通層級,最後再根據zIndex渲染高層級。
事件也一樣遵循和渲染同樣的前後順序,兩個Obj
重疊,只會觸發層級最高的那一個的事件。
完善中,bug不知道還有多少,歡迎issue。