寫在前面
不讀文章,只對程式碼感興趣可以直接跳轉到這裡 https://github.com/AlloyTeam/AlloyGameEngine
然後star一下,多謝支援:)。
前幾天發了篇向ES6靠齊的Class.js,當初jr為什麼不把父類的例項暴露給子類,其原因還是為了延續原型繼承的習慣,子類重寫就會覆蓋掉父類的方法,父類的方法就會丟,如下面的程式碼,就堆疊溢位了:
var Parent = function () {
}
Parent.prototype.a = function () {
}
var Child = function () {
}
Child.prototype = new Parent();
Child.prototype.a = function () {
this.a();
}
var child = new Child();
child.a();
而jr的Class.js可以讓你通過this._super訪問父類同類方法,修復了原型繼承同名無法訪問父類的弱點,當然也可以hack一下,先賦給變數或者某個屬性。如:
var Parent = function () {
}
Parent.prototype.a = function () {
alert(1)
}
var Child = function () {
}
Child.prototype = new Parent();
Child.prototype.parentA = Child.prototype.a;
Child.prototype.a = function () {
this.parentA();
}
var child = new Child();
child.a();
但是這樣的話,程式碼不就很醜陋了嗎!?
所以AlloyRenderingEngine選擇使用了JR的Class.js,然後在其基礎之上擴充套件了靜態方法和屬性,以及靜態建構函式。
所以就變成了這樣:
var Person = Class.extend({
statics:{
//靜態建構函式會直接被Class.js執行
ctor:function(){
//這裡的this相當於Person
},
Version:"1.0.0",
GetVersion:function(){
return Person.Version;
}
},
ctor: function(isDancing){
this.dancing = isDancing;
},
dance: function(){
return this.dancing;
}
});
var Ninja = Person.extend({
ctor: function(){
this._super( false );
},
dance: function(){
// Call the inherited version of dance()
return this._super();
},
swingSword: function(){
return true;
}
});
AlloyRenderingEngine繼承
AlloyRenderingEngine內建了Container物件,用來管理元素,Stage物件也是繼承自Container物件,
還有,Container物件繼承自DisplayObject,所以Container物件也能夠設定scale、x、y、alpha、rotation、compositeOperation…等,設定的屬效能夠疊加到子元素上。
x、y、rotation、scaleX、scaleY、skewX、skewY…等直接矩陣疊加,也就是子元素的呈現跟父容器、父容器的父容器、父容器的父容器的父容器…都有關係;
其實alpha是乘法疊加(如:容器的透明度是0.5,容器內部的元素透明度為0.9,最後容器內部元素呈現的透明度就是0.45);;
compositeOperation先查詢自己,自己沒定義,再向上查詢,直到找到定義了compositeOperation的,就使用該compositeOperation,有點類似決定定位元素找父容器的感覺。
很多情況下,我們需要繼承Container物件來封裝一些自定義的物件。
比如封裝一個按鈕:
var Button = Container.extend({
ctor: function (image) {
this._super();
this.bitmap = new Bitmap(image);
this.bitmap.originX = this.bitmap.originY = 0.5;
this.add(this.bitmap);
//滑鼠指標的形狀
this.cursor = "pointer";
this._bindEvent();
},
_bindEvent: function () {
this.onHover(function () {
this.scale = 1.1;
}, function () {
this.scale = 1.0;
})
this.onMouseDown(function () {
this.scale = 0.9;
})
this.onMouseUp(function () {
this.scale = 1.1;
})
}
});
使用這個button就很方便了:
var stage = new Stage("#ourCanvas");
var button = new Button("button.png");
button.x = 100;
button.y = 100;
button.onClick(function () {
console.log("你點選我了");
})
stage.add(button);
簡單吧!
線上演示
地址
Class.js:https://github.com/AlloyTeam/AlloyGameEngine/blob/master/src/are/base.js
AlloyGameEngine:https://github.com/AlloyTeam/AlloyGameEngine