2012/12/13

台灣大哥大提供的話務分析

我想知道我的網內通話時間、網外通話時間、市話通話時間各占多少

要去哪裡看?

網路客服 / 帳單服務 (要先登入)



帳單/通話明細查詢



 話務分析 (似乎要先開啟電子帳單功能 才有)


選擇月份 / 瀏覽



結果 (似乎根據所選擇的方案會看到不同結果,似乎要是VIP才有此功能)




轉載時請轉載連結 謝謝

台灣大哥大的資費方案分析 - 針對網內

台灣大哥大目前的資費方案有15個

我想知道有沒有方案是在任何情況下都是最好的方案

或者是任何情況下都是最差的方案

或是在某個情況下我該選擇哪一種費率

於是我們需要圖表

假設我們只撥打網內 (在地生活只撥打區內)

可以得到這麼一張精美的圖

我知道大家都看不清楚 這個線這麼密誰知道哪個是哪個

我只需要講包絡曲線的部分 (也就是最佳方案的部分)

最佳方案按照順序分別是

平均網內通話時數 < 1小時 選擇 一般月租200
平均網內通話時數 < 2.5小時 選擇 新市話299
平均網內通話時數 < 5小時 選擇 網內一族401
平均網內通話時數 > 5小時 選擇 網內一族801


可是有些人就是會偏好於某類型的資費方案

在地生活
平均區內通話時數 < 2小時 選擇 在地生活268
平均區內通話時數 < 4小時 選擇 在地生活568
平均區內通話時數 > 4小時 選擇 在地生活968

這個方案的優點是只要我住在某個固定區域不管打給誰,也不管他住哪,只要對方是使用手機 ,就可以用網內計費

我們可以大膽假設選此方案的使用者絕對不會打出網外電話
那麼這個方案的弱點是只要撥市話就破功了 ,市話又貴又沒有免費額度
關於網外和市話的分析 (下回揭曉)


網內一族
平均網內通話時數 < 1.5小時 選擇 網內一族301
平均網內通話時數 < 5小時 選擇 網內一族401
平均網內通話時數 > 5小時 選擇 網內一族801

我知道這樣的計算對於301 601 901來說很不公平
所以在這邊說明一下301 601 901 的特殊用途:
301 : 免費的網內簡訊300則
601 : 免費的網內簡訊不限數量
901 : 可指定 1 個網內門號「最愛專線」有10000元的免費通話 (大約35個小時左右,1天1小時)

看久了之後會覺得網內一族801是個神方案(網內網外市話的表現都很好)


一般月租
平均網內通話時數 < 2小時 選擇 一般月租200
平均網內通話時數 < 3.5小時 選擇 一般月租600
平均網內通話時數 < 7小時 選擇 一般月租900
平均網內通話時數 > 7小時 選擇 一般月租1500

很好 我們在這裡發現了一個完全無用的方案
因為一般月租300跟一般月租200的線完全重疊了
其實他們的差異是發生在有市話和網外的情況下 (下回揭曉)


新市話通通省

平均網內通話時數 < 2.5小時 選擇 新市話
平均網內通話時數 > 2.5小時 選擇 通通省

這個東西其實很難估計他的實際月付金額
因為他有特殊能力

新市話 : 網內前3分鐘免費  官網沒提上限值
通通省 : 網內前10分鐘免費 最多可以弄到2000分鐘的免費

只好大膽假設每個月會有10通完整的免費使用來估計
當然不嫌累的話用通通省也可以每講10分鐘就掛一次電話之類的
這樣可以弄200次 平均一天弄6次1小時 就跟最愛專線差不多



接下來看看以價格來區分

低月租費

平均網內通話時數 < 4小時 選擇 一般月租200
平均網內通話時數 > 4小時 選擇 在地生活268

基本上 只需要考慮一般月租200
因為超過4小時的網內通話就不會選低月租費


中月租費
平均網內通話時數 < 9小時 選擇 網內一族401
平均網內通話時數 > 9小時 選擇 在地生活568

基本上 只考慮網內一族401
因為超過9小時的網內通話就不會選低月租費


高月租費
平均網內通話時數 < 3.5小時 選擇 通通省
平均網內通話時數 > 3.5小時 選擇 網內一族801

基本上 只考慮網內一族801
因為低於 3.5小時的網內通話要考慮的是中月租費



結論

如果可以控制撥打對象變成網內的話 
就如同第一張圖所說的
低月租 選擇 新市話
中月租 選擇 網內一族401
高月租 選擇 網內一族801

我們也大概得到了一個概念
通話時間 < 2小時 選擇 低月租
通話時間 < 5小時 選擇 中月租
通話時間 > 5小時 選擇 高月租


轉載時請轉載連結 謝謝

台灣大哥大的 iPhone 5特惠方案分析


這是 台灣大哥大的iPhone 5特惠方案

大家都會算每個方案24個月總共要付多少金額然後挑最便宜的

如果按照這種方式去計算的話

得到下面這個表格

總支出 1100方案 1398方案 1667方案 2199方案
16G手機 35300 38952 40008 52776
32G手機 39300 43452 43908 52776
64G手機 43300 47452 47908 52776

(總支出 = 方案月租 * 24 + 手機價格)

然後一對照發現阿~原來1100方案是最便宜的

然後就選了 GG~

以下精算後的結論 :1100 方案真的是最便宜的

不想看分析文的可以不用往下看了



實際上

我們的總支出 = iPhone 5 + 月租費 + 上網費

但是因為我們主要是想買 iPhone 5 才會去選擇上面的方案

也就是說,無論如何今天 iPhone 5 跟行動上網的錢是付定了

所以我們排除iPhone 5在Apple官網上的價格和行動上網的價格(699*24)

得到這樣的表格

月租費總支出 網內一族401 通通省699 在地生活968 2199方案
16G手機 -3376 276 1332 14100
32G手機 -2976 1176 1632 10500
64G手機 -2376 1776 2232 7100


實際月租 網內一族401 通通省699 在地生活968 2199方案
16G手機 -141 12 56 588
32G手機 -124 49 68 438
64G手機 -99 74 93 296
(實際月租 = 月租費總支出 ÷ 24)

其實我們應該考量平常的通話量,然後選擇對自己來說最省錢的月租費方案

如何查自己的通話量

於是我們需要這樣的圖


假設我們只撥打網內 (在地生活只撥打區內) ,沒有撥打網外也沒有撥打市話

當然如果說完全無法控制網內不網內的話就免談了直接選在地生活就對了

從圖中可以看出通通省方案是最差的

而最佳的選擇如下:

平均網內通話時數 < 4小時 選擇 網內一族401
平均網內通話時數 < 6小時 選擇 在地生活968
平均網內通話時數 > 6小時 選擇 一般月租1500

如此的選擇才會是真正最省的選擇

通通省方案在這裡表現不佳是因為我們前面的假設是沒有撥打網外也沒有撥打市話

現在加入每個月30分鐘的網外和30分鐘的市話後再作一次分析


在地生活968卻變成了最差的方案了

而最佳的選擇如下:

平均網內通話時數 < 1.5小時 選擇 通通省
平均網內通話時數 < 4.5小時 選擇 網內一族401
平均網內通話時數 > 4.5小時 選擇 一般月租1500

同樣對64G的手機分析
不考慮網外和市話



網外和市話各30分鐘


也會得到差不多的結論

但如果是正常方案的情況下呢? 也就是說 iPhone 買空機的情況下




這裡只分析了 4 個方案,結果發現這個世界其實只需要 2 個  (其實是因為網外和市話考慮的值太小造成 2 個方案無用武之地)

但是台灣大哥大有15個方案

對於正常方案的分析更深入的文章

如何查自己通話量

轉載時請轉載連結 謝謝

2012/11/20

學習的順序

我發現學習一件事情需要很多東西的配合

人類作事情的流程我認為是這樣

環境的輸入 → 腦部演算法的運作 → 肢體的輸出

在學習一件事情時會先從最基礎的肢體輸出開始

速度、精準度和熟練度是重要的

直到腦中所想可以像反射動作一樣的迅速時

才能稱得上是一個良好的駕駛員



再來是根據環境決定該作出什麼策略

足夠了解自己機體的性能 根據機體性能不同 作出的策略也會不同

大部分情況是不了解自己機體的性能

所以要先從了解自己極限在哪開始

有時候看到高手作極限挑戰就覺得自己也可以

那些都是幻覺


最後是環境的輸入 有些參數是沒人提點的話 根本不會去想到要參考的

在資訊分析的初期就被我們遺棄的參數也許就是個重要的參數


這就要靠天份了 或者看看別人的演算法參考了那些環境變數


- 最近玩球女的感想

球女的技能組是複雜的 能作的事情很多

所以需要考慮很多事情才能行動

以下是學習流程

熟悉角色技能快捷鍵、射程、傷害值

技能施放的順序、走位等

適合面對什麼角色 不適合面對什麼角色

什麼時候該打會戰 什麼時候不該打會戰

所謂的環境變數例如

附近的我方/敵方人數

我方/敵人有沒有大絕/召喚者技能

有些資訊並不是一個新手會去考慮的


如果講到騎車的話

十字路口直行時要考慮對向左轉車道的狀況

這也是出了幾次狀況才注意到的


結論 :

1. 提高速度 精準度 熟練度

2. 了解自己的極限

3. 知道各種策略和思考方向

並不是只有在遊戲裡才是這樣

2012/10/29

ETREX的記憶體

昨天重灌從XP 改成 WIN 7

脫離了 4G記憶體的限制

於是去買了4條8G記憶體噴了$3400元



用起來的感覺 : 開 LOL 跟 minecraft 之前不用再關 Chrome 了

可以準備買雙螢幕了

之前的狀況就算買了第二個螢幕應該也沒辦法用

2012/10/1

移除畫面上的 flash 時清除 flash 所占用的記憶體?


=== 目標 ===



  移除畫面上的 flash 時能夠清除 flash 所占用的記憶體


=== 實驗 ===



假設操作 HTML 字串等於操作記憶體
新增 Object Tag 增加記憶體使用量
移除 Object Tag 減少記憶體使用量


畫面上放兩個按鈕
  addFlash
  removeFlash

按一下 addFlash 新增一個 Object Tag
按一下 removeFlash 移除所有 Object Tag


=== 實作 ===


  === HTML的部分 ===


<a href="#" id="addFlash">add flash</a>
<a href="#" id="removeFlash">remove flash</a>
<div id="flashContainer"></div>


  === js的部分 ===

  $(function(){
      $("#addFlash").click(function(){
          var random  = 'a' + Math.floor(Math.random() * 1000000000);
          $("#flashContainer").append('<div id="'+ random+ '" />');
          swfobject.embedSWF("test.swf", random , "908", "560", "10.0.0");
      });

      $("#removeFlash").click(function(){
          $("#flashContainer").html("");
      });
  });


=== 實驗結果 ===



chrome, firefox, safari在按下removeFlash時
系統記憶體使用量在1秒內明顯下降,好像沒按過addFlsah一樣

但是 IE 不意外,在按下removeFlash時
系統記憶體使用量開始緩緩下降,過了一分鐘還沒降到該降到的位置

不知道 IE 怎麼達到移除 flash 時釋放記憶體?

(其實也不能說他沒有釋放,只是他釋放得很慢)

2012/8/23

Quadratic Bezier Curve Fitting Algorithm

手繪二次貝茲曲線 - 根據滑鼠路徑



問題 :
如何根據使用者的滑鼠軌跡
得到一個二次貝茲曲線

flash graphics 的 curveTo 畫出的線就是二次貝茲曲線
這條線需要三個參數 p0, p1, p2

graphics.moveTo(p0.x, p0.y);
graphics.curveTo(p1.x, p1.y, p2.x, p2.y);

所以我們要解決的問題是給定一個滑鼠軌跡座標陣列 x0,x1,...,xk
求出 p0, p1, p2 的值


解法:
我發現這篇論文寫得很好
http://figment.cse.usf.edu/~sfefilat/data/papers/TuBCT10.16.pdf


他簡單假設


p0 = x0
p2 = xk


接下來只要解 p1, 用一個逐步逼近最佳解的方式, 先假設p1在某個位置


算出目前誤差值 e
應該偏移的方向 Δp
更新 p1 = p1 + Δp
重作上面三行直到 e 的值不再變小為止


作法很簡單
但這裡還有很多細節沒講到
有興趣的人可以慢慢看論文
利用這篇論文可以實作出適合用在 flash 上的手繪曲線程式

2012/8/10

成功嶺受訓前後

成功嶺受訓前:

整天用電腦
整天吹冷氣
喝的是冰水
不知道三餐要吃什麼
想洗澡就洗澡 想吃飯就吃飯 想大便就大便
自以為家裡很整齊
時間過得很快

成功嶺受訓時:

沒電腦
沒冷氣
喝的是溫水
三餐都吃冷菜
定時洗澡  定時吃飯 想大便要趁休息時間夠長的時候
所有的物品都放在指定的位置
時間過的超慢 成功嶺就跟精神時光屋一樣 但集合時間卻很趕

成功嶺受訓後:

摸滑鼠感覺很陌生
吹冷氣會不舒服
喝冰水會不舒服
每間店都是人間美味
想洗澡就洗澡 想吃飯就吃飯 想大便就大便 超爽
忍不住就整理了起來 棉被的折法被制約了
發現一天24小時其實很長 到底是受訓時浪費時間還是受訓前浪費時間已經搞不清楚


碰冰的會不舒服 好像是感冒了 應該跟受訓沒關係 = =

2012/7/15

MissingMouse / 消消鼠

MissingMouse / 消消鼠

遊戲畫面


遊戲連結


https://etrex.tw/flash/missing_mouse/missing_mouse.html

遊戲簡介

為了瞭解人類有沒有所謂的絕對鼠感
我作了這樣的一個小遊戲

常玩遊戲的玩家們
你可以利用這個遊戲來練手感


也可以利用這個遊戲來調整出適合自己滑鼠移動的靈敏度
這是一個類似打地鼠的小遊戲
用滑鼠點擊黑圈進行遊戲
每次遊戲時間 45 秒

畫面上方的標題列變色表示時間流逝
遊戲結束後會顯示成績

分數計算

連續正確點擊可累積 combo 次數
每次正確點擊會增加 combo 次數的分數
錯誤點擊時則會扣除 combo 次數的分數,並且 combo 次數歸零

所以錯誤點擊的損失是很高的
而遊戲難度會隨著 combo 次數調整

combo 01~05 次:滑鼠游標淡出
combo 06~10 次:滑鼠移到黑圈上的效果淡出
combo 11~50 次:黑圈的大小改變



2012/7/13

為什麼機會總是在選擇之後才出現

情境1 : 

我想買房子,看了幾間房子之後挑了一間決定買了,後來才看到更棒的房子和優惠方案

情境2 :

我想找工作,看了幾間公司之後挑了一間決定報到了, 後來才看到更好的職缺

情境3 :

我想買生活用品(like 衛生紙、沐浴乳),去賣場逛了一下之後決定買了, 後來才在其他賣場看到大特價


為什麼機會總是在選擇之後才出現?


其實這是因為選擇性注意

我用這一張圖片來說明為什麼

因為從你開始注意到你下決策的時間太短了

重點是你下了決策之後還會持續注意這種機會

所以不用抱怨 因為這是常態

2012/7/10

有關保險的問題


Q1 : 保險的保額是常數,不考慮物價的改變嗎?

Q2 : 保險公司倒了會發生什麼事?

Q3 : 如果我有保險,但是我不知道我有保險。當我觸發保障事項時,因為我沒有去申請理賠,所以我就沒領到保險金,就等同於我沒有保險嗎?

Q4 : 同上題,如果這是個壽險,申請理賠的人一定不是我,更不容易知道我有保險,所以等於我沒有保險嗎?

Q5 : 我可以查出目前我所有的保險嗎?去哪裡查?

2012/6/26

如何利用 user 幫你抓 bug

如何利用 user 幫你抓 bug - 第12回AS讀書會




投影片:
slideShare link
google doc link

程式:
google doc link
dropbox link

2012/5/24

從 Event 改寫為 Signal 的注意事項

Signal 的命名採用[發生時間+主詞+動詞]
舉例 :
onClick
onKeyDown
beforeMouseDown
onMouseDown
afterMouseDown


只在對象為 this 時作 Event 轉 Signal
CJSignal 舉例 :



假設原先的 code 是這樣
public class Button extends Sprite 
{
}

public class Panel extends Sprite 
{
    private var button:Button = new Button();
    public function Panel(){
        button.addEventListener(MouseEvent.CLICK, function():void{
            this.dispatchEvent(new Event("onButtonClick"));
        });
    }
}



改法1:
像這樣直接把 addEventListener 改成 signal 的作法不好
public class Button extends Sprite 
{
}


public class Panel extends Sprite 
{
    private var button:Button = new Button();
    public var onButtonClick:NativeSignal = new NativeSignal(button, MouseEvent.CLICK);
}



改法2:
應該這樣做
public class Button extends Sprite 
{
    public onClick:NativeSignal = new NativeSignal(this, MouseEvent.CLICK);
}

public class Panel extends Sprite 
{
    private var button:Button = new Button();
    public function get onButtonClick():NativeSignal{
        return button.onClick;
    }
}



這是因為 button 可能會被 new 一次以上
如果用改法1的寫法
會產生多餘的 Signal 物件
也會造成程式碼重複

2012/5/19

hinet自動連線 在windows登入之前

hinet 非固定制ADSL 是需要撥號連線的

會有一個連線按鈕給你按

圖可以參考 hinet 提供


即使你把網路連線放到啟動裡面

開機後執行也只是跳出這個框框

還是需要手動點一下才會連線


當然這個少點一下是可以避免

不過就算你把他改成自動連線了

也是要在登入windows後 才會觸發啟動


問題來了

我有一台電腦從頭到尾就只想要用遠端連線

我需要一開機 在未登入windows之前就讓他連上網路

這樣我才能用遠端連線去登入windows

啟動辦不到 該怎麼辦?

答案是工作排程

我看了這篇文章後成功設定完成了

這樣我就不需要多買一組螢幕 鍵盤 滑鼠去控制第二台電腦

2012/5/16

賭博性質的商品競標網站

當初看到這篇文章的時候
覺得怎麼可能有這種拍賣網站
[密技公開] 如何以2元買到1990元的iPad周邊? 揭露以小搏大的競標真正內幕


這種類型的拍賣網站是這樣賺錢的
[人生智慧] 歷經十年的真實試驗-金錢拍賣會-讓你體悟人性陷阱

結果最近真的陸續看到這種網站的出現
BID & BUY
來福福袋

這兩個網站的遊戲規則不太相同
但本質是相同的

建議如果要玩的話
先看仔細遊戲規則再玩

--

感謝 plurk 上的網友提供關鍵字 : 競標網

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 類別作物件顯示

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


2012/3/20

Draw Something 必勝攻略

在此公布 Draw Something 的必勝法

我連圖片都不用看 就能猜到答案了


為什麼呢?

我們在猜題的時候,畫面下方可以看到12個候選字母

此時把12個候選字母記下來

然後重開遊戲再進入猜題

候選字母會跟上次不同,但是正確的字母每次都會出現

所以沒出現的字母就可以排除了


必勝法總共兩個步驟

1. 不斷重開遊戲 收集正確的字母 正確的字母數量會和填空數量相同

2. 把正確的字母輸入到 http://www.scrabblefinder.com/

即可直接取得答案


一般來說重開1~2次就可以知道答案了

2012/3/16

Flash TextField Font Size Limit

Flash 的動態文字字型大小限制在 127 以下

以下實驗證明 flash 的動態文字字型大小是受限的
我用程式產生字型大小 116 ~ 130 的 TextField 並作滑鼠感應
當滑鼠移動到 TextField 上時顯示字型大小
證明字型大小最大只能到 127

demo
 http://dl.dropbox.com/u/7377053/flash/textFieldFontSizeTest.html

Source
http://dl.dropbox.com/u/7377053/flash/textFieldFontSizeTest.fla

code
 http://paste.plurk.com/show/948935/

tooltip.targetAlpha = 0;
var textFormat:TextFormat = new TextFormat();
function getTextField(size:int):TextField{
    var t:TextField = new TextField();
    t.text = "A";
    textFormat.size = size;
    t.selectable = false;
    t.setTextFormat(textFormat);
    t.autoSize = TextFieldAutoSize.LEFT;
    t.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
    t.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
    return t;
}

function onMouseOver(e:MouseEvent):void{
    var t:TextField = (TextField)(e.target);
    tooltip.targetAlpha = 1;
    tooltip.t.text = t.getTextFormat().size;
}
function onMouseOut(e:MouseEvent):void{
    var t:TextField = (TextField)(e.target);
    tooltip.targetAlpha = 0;
}
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event):void{
    tooltip.x += (this.mouseX - tooltip.x) * 0.2;
    tooltip.y += (this.mouseY - tooltip.y) * 0.2;
    tooltip.alpha += (tooltip.targetAlpha - tooltip.alpha) * 0.2;
}

for(var i = 116 ; i <= 130 ; i ++ )
{
    var t:TextField = getTextField(i);
    var n = this.numChildren - 1;
    t.x = n % 5 * 100;
    t.y = Math.floor(n /5) * 100;
    this.addChild(t);
}
this.addChild(tooltip);

Try yourself
1. 開flash CS X
2. 弄個靜態文字 字型大小設成 200
3. 把靜態文字切換到動態文字

會發現字變小了

怎麼解決這個問題?

用 Sprite 裝 TextField 再對 Sprite 作放大

2012/3/9

HTML5 Canvas eraser demo using EaselJS

原理
  html5 canvas 的橡皮擦怎麼作?
  用context.globalCompositeOperation
  根據Canvas Composite Operations Tutorial & Demo
  我們知道只要寫

    context.globalCompositeOperation = "destination-out"

  就可以作出橡皮擦功能
  但我們不直接用他
  因為我們要透過 EaselJS 來操作 canvas
  所以我們變成要寫

  DisplayObject.compositeOperation = "destination-out";

demo

code

<html>
<head>
    <title></title>
    <script type="text/javascript" src="../lib/easel.js"></script>
    <script type="text/javascript" src="../lib/jquery-1.7.1.js"></script>
    <script type="text/javascript">
        $(function(){
            var canvas = $("#canvas")[0];
            var stage = new Stage(canvas);
            var shape1 = new Shape();
            var shape2 = new Shape();
            var color = "rgba(255,0,0,1)";
            shape1.graphics.setStrokeStyle(16, "round", "round")
                    .beginStroke(color)
                    .moveTo(100, 300)
                    .lineTo(300, 100)
                    .endStroke();
            shape2.graphics.setStrokeStyle(16, "round", "round")
                    .beginStroke(color)
                    .moveTo(100, 100)
                    .lineTo(300, 300)
                    .endStroke();
            shape2.compositeOperation = "destination-out";
            stage.addChild(shape1);
            stage.addChild(shape2);
            stage.update();
        });
    </script>
    </head>
<body>
<canvas id="canvas" width="640" height="480"></canvas>
</body>
</html>

這是用 http://tohtml.com/ 貼code的功能,感覺還不錯

html canvas link

Canvas Composite Operations Tutorial & Demo (混色模式教學)
http://mrcoles.com/blog/canvas-composite-operations-demo-animation/

EaselJS新手上路
http://blog.eddie.com.tw/2011/09/10/introduction-to-easeljs/

HTML5 Canvas eraser demo using EaselJS (橡皮擦教學)
http://etrex.blogspot.com/2012/03/html5-canvas-raser-demo-using-easeljs.html