2012/4/30

程式的命名規則

因為這個東西寫了很久
一邊寫程式一邊進步
一進步就改變程式風格
又沒有良好維護 code 的時候
程式碼就會有風格不統一的情形

然後程式的命名就亂了
我在想要怎樣命名才是最佳解

我採用的事件流程是CJSignal

我的signal命名規則 :

signal的命名應該是 時間+名詞+動詞 的形式
比方說
onMouseClick
beforeMouseClick
afterMouseClick
onViewChange

函數本身則是避免使用這樣的形式
函數應該使用 動詞 or 動詞+名詞 的形式
比方說
mouseClick.add(onMouseClick);  //這樣不好
onMouseClick.add(mouseClick);  //這樣不好
onMouseClick.add(handleMouseClick);  //這樣比較好

函數名稱盡量要跟函數內容有關 而不是跟函數執行的時間點有關

onMouseClick.add(goToHappyEnding);  //這樣更好




2012/4/23

AS3 try catch on EventDispatcher.dispatchEvent()

當 try catch 遇到 EventDispatcher

public function TestClass() 
{
    try {
        eventDispatch().dispatchEvent(new Event("TEST"));
    }
    catch (err:Error)
    {
        trace(err);
    }
}
public function eventDispatch():EventDispatcher{
    var ed:EventDispatcher = new EventDispatcher();
    ed.addEventListener("TEST",crashFunction);
    return ed;
}
public function crashFunction(e:Event = null):void {
    var a:Array ;
    a.concat();
}

請問上面的程式會 ?
1. 觸發 trace
2 .進入執行階段錯誤

以下內容要按讚才顯示  [讚]

























答案是2. 會進入執行階段錯誤

我另外測了callback

public function TestClass() 
{
    try {
        crashCallback(crashFunction);
    }
    catch (err:Error)
    {
        trace(err);
    }
}
public function crashCallback(f:Function):void {
    f();
}
public function crashFunction(e:Event = null):void {
    var a:Array ;
    a.concat();
}


結果是 callback 會觸發 trace

於是自己做了一個簡單版的EventDispatcher

public class MyEventDispatcher 
{
    public var functionArray:Array = [];
    public function addEventListener(f:Function):void {
        functionArray.push(f);
    }
    public function dispatchEvent():void {
        for each(var f:Function in functionArray)
            f();
    }
}

public class TestClass extends Sprite
{
    public function TestClass() 
    {
        try {
            eventDispatch().dispatchEvent();
        }
        catch (err:Error)
        {
            trace(err);
        }
    }
    public function eventDispatch():MyEventDispatcher{
        var ed:MyEventDispatcher = new MyEventDispatcher();
        ed.addEventListener(crashFunction);
        return ed;
    }
    public function crashFunction(e:Event = null):void {
        var a:Array ;
        a.concat();
    }
}

結果也是觸發 trace

內建的 eventDispatcher 到底是.../]\?


2012/4/18

在虛擬世界展示實體商品 - online game 和家具業者的異業結盟

我在2008年提過這個概念

但那時候沒想過異業結盟的事情

如果說我玩魔獸世界 (或其他的3D線上遊戲)

在遊戲中看到的任何家具都是有實體商品的

在遊戲裡面可以看到產品的詳細資訊(尺寸、材質、價格等)

然後可以直接在遊戲裡面買下那個家具

接下來就會有物流把家具送到你家了


有兩種可能性
1. 家具業者出 3D model 給遊戲業者,讓遊戲業者布置遊戲場景

2. 家具業者去生產遊戲中的家具(考慮遊戲畫風 這是比較可行的方案)



然後除了家具 還有其他商品的異業結盟

例如服飾業者生產遊戲中的某些經典裝備

cosplay 的進入障礙就變低了


遊戲業者要做的事就是在遊戲中增加購物流程

整個遊戲 就是虛擬賣場

2012/4/13

actionscript 修改 package 造成 svn 差異比對失效

svn 是版本控制軟體

他能幫你做程式碼的差異備份 但是前提是檔案名稱要相同

當我修改 Class1.as 的 package 路徑時

我被迫要移動  Class1.as 到正確的資料夾路徑 (對應 package)

因為移動檔案會被分解為刪除檔案和新增檔案這兩個動作

而刪除的檔案與新增的檔案無關

結果造成 svn 無法與先前版本的 Class1.as 作差異比對了

完全不曉得要怎麼解決這個問題


上次龍哥的意見是說把修改 package 的事情記錄在 svn 的版本說明裡

至少這樣還找得到先前的位置

不曉得有沒有其他更好的解法

2012/4/10

BitmapData.setPixel32 bug

var color1:uint = 0x01010101;
var bitmapData:BitmapData = new BitmapData(1,1,true, color1);
var color2:uint = bitmapData.getPixel32(0,0);
trace(color1 == color2);

以上的程式輸出 :
false

var color1:uint = 0x01010101;
var bitmapData:BitmapData = new BitmapData(1,1,true, color1);
bitmapData.setPixel32(0,0,color1);
var color2:uint = bitmapData.getPixel32(0,0);
trace(color1 == color2);
trace(color1.toString(16));
trace(color2.toString(16));

以上的程式輸出 :
false
1010101
1000000


從這兩個 case 我們知道在 setPixel32 設定顏色跟 BitmapData 建構式傳入顏色是一樣的結果


var color1:uint = 0x010179ff;
var bitmapData:BitmapData = new BitmapData(1,1,true, color1);
var color2:uint = bitmapData.getPixel32(0,0);
trace("color1 = " + color1.toString(16));
trace("color2 = " + color2.toString(16));

以上的程式輸出 :
color1 = 10179ff
color2 = 10000ff


var color1:uint = 0x010180ff;
var bitmapData:BitmapData = new BitmapData(1,1,true, color1);
var color2:uint = bitmapData.getPixel32(0,0);
trace("color1 = " + color1.toString(16));
trace("color2 = " + color2.toString(16));

以上的程式輸出 :

color1 = 10180ff
color2 = 100ffff


從這兩個 case 我們知道他是根據 A 的值對RGB分別作某個四捨五入的行為


我猜是為了繪圖加速之類的事情作的吧


不過這個真的會害死人 = =

2012/4/3

BlurFilter.blurX 255 limit


BlurFilter 的說明文件裡面提到

blurX   屬性
blurX:Number
語言版本:       ActionScript 3.0
執行階段版本:   AIR 1.0, Flash Player 9

水平模糊化量。
有效值為 0 到 255 (浮點)。

預設值為 4。
2 的冪次方數值 (如 2、4、8、16 和 32) 是經過最佳化的,
以便在顯示時會比其它值更為快速。

有效值最大為 255

但我需要值域不限制在 255 以內的模糊濾鏡

所以我準備自己實作一個 Filter

於是我去看了 BitmapFilter 這個 Class

BitmapFilter 類別是所有影像濾鏡特效的基底類別。

BevelFilter、BlurFilter、ColorMatrixFilter、ConvolutionFilter、
DisplacementMapFilter、DropShadowFilter、GlowFilter、GradientBevelFilter 和
 GradientGlowFilter 類別都可以擴充 BitmapFilter 類別。 您可以將這些濾鏡特效套
用至任何顯示物件。

您無法直接實體化或擴充 BitmapFilter。

所以我無法自己實作Filter

請問我如果要對一個 Shape 物件使用值域超過255的 BlurFilter 要怎麼作?

我想到一個很蠢的方法

那就是

1. 取得 Shape 的 BitmapData

2. 實作一個模糊濾鏡函數
   輸入 BitmapData
   輸出模糊後的 BitmapData

3. 改用 Bitmap 類別作物件顯示

請問這個問題除了這個方法還有別的解法嗎?