近來突然覺得,將按鈕這類簡單控件預先由引擎定義好根本沒有必要,反而嚴重限制了創意發揮。因爲引擎固化它們的實現,便會固定於某種特定的模式上。比如按鈕,標準的實現最多就是爲按下、懸停等狀態提供不同的表現,通常就是圖片和文字的差別。而遊戲作爲一種創意作品,可能要更活潑的模式,比如懸停時放大、抖動動畫、在按鈕上放其它修飾等等。可能的創意非常之多,無法用固定的模式來全部支持。
那麼如何用腳本來定製呢?當前 Web 網頁就提供了一個很好的例子,網頁開發者用 HTML 和 JavaScript 可以做出各式各樣的按鈕、菜單等控件。其原理只是簡單的標籤元件組合以及顯示屬性的修改。如:
<div class=”buttonNormal” onMouseHover=”...” onMouseOut=”...” onClick=”...”>
Button Face
</div>
借鑑同樣的方法,遊戲腳本也可以定義自己的控件樣式。當然,重用時必須要簡單,幸運的是 JavaScript 有對對象的支持,那麼只要寫一個按鈕對象就行了,而使用該按鈕類型時就完全不用關心它是如何實現的了,和使用引擎內置控件一樣。於是,做了下嘗試,用腳本實現了一種簡單的按鈕對象:
function Button ( parent , x , y , width , height , text , onClickFunc )
{
var elem = Gui . CreateElement ( "Element" , parent , x , y , width , height );
writeln ( x , y , width , height );
this . Element = elem ;
elem . SetImage ( "Gui/ui2.png" , 144 , 48 , 16 , 16 );
elem . ImageStretchMode = "NineGrid" ;
elem . ImageColor = Color . Black ;
elem . Text = text ;
elem . add_Click ( onClickFunc );
elem . add_MouseEnter ( function () {
elem . ImageColor = Color . White ;
elem . TextColor = Color . Black ;
});
elem . add_MouseLeave ( function () {
elem . ImageColor = Color . Black ;
elem . TextColor = Color . White ;
});
}
創建三個按鈕的效果如下