2009年07月27日 23:23

【玩具】測試你的臉是否左右對稱

步驟一:點選上傳個人照。
步驟二:移動、縮放、旋轉照片, 以紅線為置中線, 滑鼠停留在Flash可觀看結果。

  點子來源是地圖日記的左右臉製造機, 不過懶得申請帳號, 只好自己寫一個 (雖然好像花了更多時間XD), Flash player 10 的 FileReference 類別 load()、save() 函式可以支援直接上傳/下載本機檔案, 而不用經過伺服器端, 剛好可以玩一下。


示範結果:

20090727_蒙娜麗莎對稱臉結果

  因為限制 Flash Player 10 (FP10)才能執行, 所以用了CS4來開發, 原本有點不想嘗試, 因為平時希望能和舊版本Flash Player相容, 都是用CS3製作, 所以還找了另類的方式來把FP9的檔案改成FP10可執行, 不過根據Google Analytics的記錄, 10之前版本的使用者剩下7%, 且FP10有越來越普及的趨勢, 加上Adobe也一直無意讓Flash CS3可以編譯FP10, 遲早要接觸的東西, 先摸摸看。

註:用hex editor, 如:免費的 XVI32, 把編出來的swf第4個byte從09改成0A即可, 不過不建議常態使用, 畢竟編譯結果和效能是不相同的, 只是能騙過Flash Player而執行而已。

使用的Package:


還不是Flash Player 10 的使用者可以在此更新:取得最新版 Adobe Flash player



  • esabear 發表於樂多回應(20)引用(0)Flash筆記編輯本文
    樂多分類:藝術/設計 │昨日人次:0 │累計人次:1495 │標籤:玩具,KUSO,測驗,有趣,flash
    Ads by Roodo! 

    引用URL

    http://cgi.blog.roodo.com/trackback/9535363

    回應文章

    真是好玩的東西
    | 檢舉 | Posted by jerry at 2009年08月4日 00:08
    您好!
    我是新手,想試試可以隨意對元件縮放及旋轉,看到您的網站資料
    真的很豐富,想跟您請教一下:
    我在您所提示的連結中下載了TransformTool.as,
    之後在Flash CS3中新開了一個檔案,在圖層1中放入了一個
    正方形_mc,在圖層2中加入action script如下:

    import TransformTool;
    var tool:TransformTool = new TransformTool();
    addChild(tool);
    tool.target = targetDisplayObject;

    然後按 Ctl+Enter測試,但出現一堆錯誤訊息,可以請您告知是
    哪裡出錯嗎? 謝謝!
    ---------------------------------------------
    版主回覆:
    hi ydm
    因為你沒有提供錯誤訊息 我猜是有缺檔
    如果只有TransformTool.as還不夠
    還要把TransformToolControl.asTransformToolCursor.as也下載下來

    然後建立資料夾 將3個檔案放在相對於fla目錄下的
    com/senocular/display/資料夾底下
    語法改成以下:(只有import的地方有變)

    import com.senocular.display.TransformTool;
    var tool:TransformTool = new TransformTool();
    addChild(tool);
    tool.target = targetDisplayObject;

    當然 targetDisplayObject要換成自己的影片片段的名字
    測試時會有一個warning 那是正常的
    | 檢舉 | Posted by ydm at 2010年02月3日 18:26

    您好!
    謝謝您回應!
    我下載了您所提供的其餘兩個AS檔,也更動了程式碼如下:

    import com.senocular.display.TransformTool ;
    var tool:TransformTool = new TransformTool();
    addChild(tool);
    tool.target = my_mc;

    但出現了兩個錯誤:
    (1)第3行 1067: TransformTool 類型值以隱含方式強制轉型成不相關的類型 flash.display:DisplayObject。
    (2)第4行 1119: 存取可能未定義的屬性 target (透過靜態類型 TransformTool 的參考)。

    還是無法運作,請您幫個忙,謝謝!
    | 檢舉 | Posted by ydm at 2010年02月19日 14:02

    您好!
    另外有一個問題,也請您幫忙看一下!
    要讓使用者像您這樣點選機本機的圖檔,要如何實現呢?
    我用 flash CS3 搭配 AS3,只能做到開啟檔案瀏覽界面,但一旦選定了所要的圖檔後,
    按下確定鍵,後續就沒反應了!上網爬文了一下,有人提到說必須搭配 load(),
    但 flash CS3 中的 as3並沒有提供這個方法;於是我又試著在flash CS4中編寫,
    但卻連檔案瀏覽界面都無法開啟,到底是怎麼回事?

    var myFileReference:FileReference = new FileReference();
    var imagesFilter:FileFilter = new FileFilter("*.jpg; *.gif; *.png", "*.jpg;*.gif;*.png");
    b1_btn.addEventListener(MouseEvent.CLICK,openUI);
    myFileReference.addEventListener (Event.SELECT ,getInFile); //按下按鈕事件

    // 開啟檔案瀏覽界面
    function openUI(event:MouseEvent) :void
    {
    myFileReference.browse([imagesFilter]);
    }

    // 選定要開啟的圖檔
    function getInFile(event:Event):void
    {
    var myLoader:Loader = new Loader();
    myLoader.load (new URLRequest(myFileReference.name));
    addChild(myLoader);
    }

    我希望能在flash CS3 中實現這個效果,請問要如何改呢?
    謝謝! (新手上路請諸多包函)
    | 檢舉 | Posted by ydm at 2010年02月19日 15:00

    您好!
    我花了一下午的時間,終於找出 Flash CS4 搭配 FP10的程式碼,
    開啟檔案是沒有問題,現在的問題是加入了TransformTool 類
    會出現『5001: 套件名稱 'com.senocular.display' 無法反映這個檔案的位置。請變更這個檔案中的套件定義名稱,或移動檔案。C:\Documents and Settings\ydm\桌面\對稱 Flash\com\senocular\display\TransformTool.as』
    的錯誤訊號,
    我是已照您所寫的將相關AS檔COPY到 fla檔所在的com\senocular\display目錄下,但如同上面的錯誤訊號,
    不知該如何解決? 謝謝!
    | 檢舉 | Posted by ydm at 2010年02月19日 21:43

    您好!
    問題已經解決了,謝謝!
    不過雖然可以從本機任意選擇圖檔,然後顯示在螢幕上,
    但並無法讓滑鼠去拖曳旋轉該圖,底下是我的主要程序:

    //載入記憶中圖檔並顯示在螢幕上
    function onComplete(evt:Event):void
    {
    var myLoader:Loader = new Loader();
    myLoader.loadBytes(fileRef.data);
    addChild(myLoader);
    }

    可以請您告知該何做出您的效果嗎? 謝謝!
    ---------------------------------------------
    版主回覆:
    hi ydm
    看起來應該是快成功囉
    載入完成後 要把TransformTool的target指到新載入的圖
    // 下面這二行可以事先做好 tool可以反覆使用 改變target即可
    var tool:TransformTool = new TransformTool();
    addChild(tool);
    // 更換tool的target
    tool.target = myLoader.content as Sprite;
    // 如果顯示有問題也許是被新的物件壓住了 那再加一行
    tool.parent.setChildIndex(tool, tool.parent.numChildren - 1);
    以上程式碼是憑印象打的 也許還要修一下

    祝順利
    | 檢舉 | Posted by ydm at 2010年02月20日 17:00

    您好!
    感謝您撥空回應,隨入載入本機圖片仍無法用滑鼠去點到,很奇怪!我的swf檔如下連結:

    mytest_CS4.swf


    fla檔如下連結:

    mytest.zip


    我是有嘗試先在場景中建一個mc,在將由本機隨意自選載入的圖片置入該mc中是可用滑鼠去控制的,
    但如果改成在程式中宣告movieClip再利用addChild將它實體化卻無法用滑鼠點到,
    很奇怪!一樣是mc,但結果卻不一樣!

    如果用第一種方法,那要載入100張獨立的圖片豈不是得先在場景中先建100個mc,這似乎太太........。

    大大可有方法可解,謝謝!
    | 檢舉 | Posted by ydm at 2010年02月27日 23:28

    您好!
    對不起,連結沒有做好,改進如下:swf檔如下連結:

    mytest_CS4.swf


    fla檔如下連結:

    mytest.zip

    ---------------------------------------------
    版主回覆:
    你好 我看了一下原始檔
    把下面的函式取代後, 看起來就正常了

    //載入記憶中圖檔並顯示在螢幕上
    function onComplete(evt:Event):void {
    trace("File was successfully loaded.");
    var sp:Sprite = new Sprite();
    var myLoader:Loader = new Loader();
    myLoader.loadBytes(fileRef.data);
    sp.addChild(myLoader);
    sp.mouseChildren = false;
    addChild(sp);
    }

    原因是出在addChild(myLoader);
    因為Loader本身並不是Sprite也不是MovieClip
    點下去無法轉成Sprite供TransformTool使用
    所以要再多包一層 把Loader加到一個Sprite上
    然後把Loader的滑鼠屬性取消即可

    修改後的原始檔
    http://blog.roodo.com/esabear/c853348d.fla
    | 檢舉 | Posted by ydm at 2010年02月27日 23:30

    太棒了,原來如此,真是太厲害了! 謝謝!
    | 檢舉 | Posted by ydm at 2010年03月1日 21:59

    請容許我繼續跟您請教:
    小弟想要做一個可以繪製『對稱』圖形的flash檔,如下圖所示,
    圖片

    我用滑鼠繪第一條線AB,用程式自動繪出其相對稱的線為ab;
    我用滑鼠繪第二條線CD,用程式自動繪出其相對稱的線為cd;

    但很奇怪的是,兩條線重疊的地方,顏色卻是上下顛倒的,
    也就是新畫的無法將舊畫的蓋掉,這樣就不是真的對稱了,
    這個問題想了好久,請問到底該如何解決?

    我的swf檔連結如下:
    SWF檔

    我的fla檔連結如下:
    fla檔

    謝謝!
    (對不起,不知道會不會耽誤您太多時間 ?剛入門不久,有太多疑問了)
    ---------------------------------------------
    版主回覆:
    因為你的pen2(brush2)永遠壓在brush(pen)之上
    所以後來畫的筆劃及鏡射各自畫在一上一下的圖層裡
    結果就會使位於上方的舊筆劃 壓住下方的新筆劃

    要改善這個狀況 可以在
    1.每次按下滑鼠(MOUSE_DOWN)時, 建立新的二層, 然後改畫在其上
     但是筆劃越多時 效能較差
    2.全部畫在同一層, 但是要將每一次的座標點和鏡射座標點儲存, 程式會較複雜
    | 檢舉 | Posted by ydm at 2010年03月1日 22:20

    天啊! ......
    | 檢舉 | Posted by ydm at 2010年03月2日 23:08

    鳴! 大大沒有其它簡單一點的方法了嗎 ?
    | 檢舉 | Posted by ydm at 2010年03月3日 20:56

    問題終於克服了,將兩支畫筆各自限制在固定的sprite上運作,
    同一支畫筆畫出來的就沒有上下層的問題了,謝謝!
    ---------------------------------------------
    版主回覆:
    不客氣
    恭喜問題解決了:)
    | 檢舉 | Posted by ydm at 2010年03月6日 13:16

    今天看了您的帖子之后得到了很大帮助,非常感谢。因为我正在做一个公司的咚咚,也是利用senocular transformTool这个包开发 。之前对于外部导入的图片的控制使用了bitmap.draw的方法,虽然能控制该loader的内容,单图片的画质量损失很严重,今天看到你给出的sprite.mouseChildren=false,茅塞顿开,小弟不得不发帖表示感谢。
    | 檢舉 | Posted by santiago at 2010年11月4日 16:57

    好奇怪~我可以使用movieclip物件,但卻不能用loader物件,我用loader他不可以做移動的動作,我有進去看transformTool這個類別~但還是不懂問題點在哪,是因為DisplayObjectContainer 跟 DisplayObject的差別嗎?
    ---------------------------------------------
    版主回覆:
    這要從繼承關係談起了
          Loader┐
          Stage ┼→DisplayObjectContainer→InteractiveObject→DisplayObject
    MovieClip等→Sprite┘

    可以看到
    1.MovieClip 屬於 Sprite
    2.MovieClip(Sprite) 和 Loader 同屬於 DisplayObjectContainer 也屬於 DisplayObject

    但 Sprite 和 Loader 分屬不同子分支, 而transformTool 實作為可控制 Sprite
    MovieClip 為 Sprite, 所以可以用, 但就無法作用在 Loader 上
    | 檢舉 | Posted by felisa at 2011年03月19日 16:02

    但是您的不也是loader進去的圖片去做移動旋轉等動作的嗎?
    為甚麼您loader的圖片是可以移動的呢!?
    ---------------------------------------------
    版主回覆:
    忘了原本的作法為何, 但至少有一個簡單作法:
    將loader addChild到一個空的MovieClip(或Sprite)
    其實本篇ydm網友的回應裡就有討論過了 你應該看看
    | 檢舉 | Posted by felisa at 2011年03月22日 20:56

    恩恩~真的!
    是我沒有注意到這個回應~真的很抱歉!
    | 檢舉 | Posted by felisa at 2011年03月24日 21:47

    不好意思~想在請問一個問題
    就是我也想把TextField做成以上的效果
    但我用ydm的方法做
    在移動的部分是可以的~但旋轉字體就消失
    這部分我就不懂問題出在哪了>
    ---------------------------------------------
    版主回覆:
    TextField動態文字在Flash中是不能旋轉的
    除非你嵌入字體 或者改成靜態文字 或把文字轉成圖
    | 檢舉 | Posted by felisa at 2011年04月3日 21:02

    恩恩~謝謝您!
    我會朝著您說的方向去試試看的^0^
    | 檢舉 | Posted by felisa at 2011年04月6日 11:41

    我是出來了
    你說的
    "除非你嵌入字體 或者改成靜態文字 或把文字轉成圖"
    要改成
    ""除非你嵌入字體 或者改成靜態文字 並且把文字轉成圖"
    | 檢舉 | Posted by felisa at 2011年04月7日 23:55