2009年07月27日 23:23
【玩具】測試你的臉是否左右對稱
步驟一:點選上傳個人照。
步驟二:移動、縮放、旋轉照片, 以紅線為置中線, 滑鼠停留在Flash可觀看結果。
點子來源是地圖日記的左右臉製造機, 不過懶得申請帳號, 只好自己寫一個 (雖然好像花了更多時間XD), Flash player 10 的 FileReference 類別 load()、save() 函式可以支援直接上傳/下載本機檔案, 而不用經過伺服器端, 剛好可以玩一下。
示範結果:
因為限制 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:
- senocular - AS3 Transform Tool 用來旋轉縮放Sprite
- adobe - as3corelib 用JPGEncoder把BitmapData編碼成JPEG
還不是Flash Player 10 的使用者可以在此更新:
引用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測試,但出現一堆錯誤訊息,可以請您告知是
哪裡出錯嗎? 謝謝!
---------------------------------------------
我是新手,想試試可以隨意對元件縮放及旋轉,看到您的網站資料
真的很豐富,想跟您請教一下:
我在您所提示的連結中下載了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.as和TransformToolCursor.as也下載下來
然後建立資料夾 將3個檔案放在相對於fla目錄下的
com/senocular/display/資料夾底下
語法改成以下:(只有import的地方有變)
import com.senocular.display.TransformTool;
var tool:TransformTool = new TransformTool();
addChild(tool);
tool.target = targetDisplayObject;
當然 targetDisplayObject要換成自己的影片片段的名字
測試時會有一個warning 那是正常的
hi ydm
因為你沒有提供錯誤訊息 我猜是有缺檔
如果只有TransformTool.as還不夠
還要把TransformToolControl.as和TransformToolCursor.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);
以上程式碼是憑印象打的 也許還要修一下
祝順利
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
你好 我看了一下原始檔
把下面的函式取代後, 看起來就正常了
//載入記憶中圖檔並顯示在螢幕上
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.全部畫在同一層, 但是要將每一次的座標點和鏡射座標點儲存, 程式會較複雜
因為你的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 上
這要從繼承關係談起了
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網友的回應裡就有討論過了 你應該看看
忘了原本的作法為何, 但至少有一個簡單作法:
將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中是不能旋轉的
除非你嵌入字體 或者改成靜態文字 或把文字轉成圖
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
