Sunday, December 9, 2007

MDM + as3corelib : 存檔寫 log (文字檔 + 圖檔)

// MDM Version (http://www.multidmedia.com/)
// encoder from as3corelib (http://code.google.com/p/as3corelib/)

/*

如果你要它存 PNG 結果掛掉的話,有可能是因為 轉成 png 以後太大了

(記憶體佔用太多,血淋淋的經驗,死的不明不白,完全看不出來為什麼4 張只存了一張以後好像就沒動靜了)
可以先改用 JPG 存檔並調整他的壓縮比例 JPGEncoder(60),這樣存的檔案體積會比較小,比較不容易掛

*/

import mdm.*;
import com.adobe.images.PNGEncoder;
import com.adobe.images.JPGEncoder;


//Declare global variables

var fileFolderPath:String; // 資料夾的位置
var fileName:String; // 文字檔(log)檔名
var uniqueName:String;

// 用 Flash CS3 的話一定要先用這個指令來 Initiate
mdm.Application.init(this,OnInit); 

// 可接收關掉程式時的 Event
mdm.Application.enableExitHandler();


function OnInit():void {
OpenFile();
}

function OpenFile() {
var myDate:Date = new Date();
var folderExists:Boolean;

uniqueName = myDate.toDateString() + " - "
+ myDate.hours
+"_" + myDate.minutes
+"_" + myDate.seconds ;

fileFolderPath = mdm.System.Paths.desktop + "Record-" + uniqueName + "\\";
folderExists = mdm.FileSystem.folderExists(fileFolderPath);
if( folderExists == true ){
; // 資料夾已經存在
}
else{
// 資料夾不存在就create一個
mdm.FileSystem.makeFolderUnicode(fileFolderPath);
}

// log 檔名
fileName = "Log.txt";

// 在第一行寫入試著在第一行寫入 "#Log\n"
mdm.FileSystem.saveFileUnicode(fileFolderPath + fileName, "#Log\n");

}

// 要寫 log 的時候就把 string pass 給 WriteLog(your_string)
function WriteLog(msg:String) {
appendFile(msg);
}

function appendFile(eMsg:String) {

mdm.FileSystem.appendFileUnicode(fileFolderPath + fileName, eMsg);
}

// 回傳畫著這個 MovieClip 的 BitmapData
function mc2Bitmap(mc1:MovieClip):BitmapData {
var myBitmap:BitmapData = new BitmapData(mc1.width, mc1.height, true, 0);
myBitmap.draw(mc1);
return myBitmap;
}

// 將 MovieClip 轉成 名為 fileName.png 的 PNG 圖檔

function MovieClipToPNG( target_mc:MovieClip, fileName:String):void {
BitmapDataToPNG( mc2Bitmap(target_mc) , fileName );
}

// 將 MovieClip 轉成 名為 fileName.jpg 的 JPG 圖檔

function MovieClipToJPG( target_mc:MovieClip, fileName:String):void {

BitmapDataToJPG( mc2Bitmap(target_mc) , fileName );
}


// 將 BitmapData 轉成 名為 fileName.png 的 PNG 圖檔

function BitmapDataToPNG( targetB:BitmapData, fileName:String ):void {

var baString:String;
var bpd:BitmapData = targetB;
var ba:ByteArray;
var resultString:String;

ba = PNGEncoder.encode(bpd);

var g:Number;
g = 0;

resultString = ba[0];

// MDM 的存檔格式(由 | 分隔)
for (g = 1; g < ba.length; g++) {
resultString += "|" + ba[g];
}

mdm.FileSystem.BinaryFile.setData (resultString);
mdm.FileSystem.BinaryFile.writeData( root["fileFolderPath"] + fileName + ".png" );


}


// 將 BitmapData 轉成 名為 fileName.jpg 的 JPG 圖檔

function BitmapDataToJPG( targetB:BitmapData, fileName:String )
:void {

var baString:String;
var bpd:BitmapData = targetB;
var ba:ByteArray;
var resultString:String;

var jpgEncorder:JPGEncoder = new JPGEncoder(60);

ba = jpgEncorder.encode (bpd);

var g:Number;
g = 0;

resultString = ba[0];

// MDM 的存檔格式(由 | 分隔)
for (g = 1; g < ba.length; g++) {
resultString += "|" + ba[g];
}

mdm.FileSystem.BinaryFile.setData(resultString);
mdm.FileSystem.BinaryFile.writeData( root["fileFolderPath"] + fileName + ".jpg" );


}

Thursday, December 6, 2007

SWF, EXE, MDM 的 exe 都能關掉程式的 function

import mdm.*;

mdm.Application.init(this,OnInit);
mdm.Application.enableExitHandler();


function OnInit():void {
//mdm.Dialogs.prompt("Zinc with Flash CS3, Text Saver!");
}

// 想關程式的時候就 call MyClose()

function MyClose(){
fscommand( "quit" ); // for flash player
mdm.Application.exitWithCode(0); // for mdm

}

/*
這樣子不管單純用 swf, or swf -> exe 都可以透過 fscommand 來關程式 (用 Flash IDE開發, Debug Mode的時候)

而在用 mdm 包裝後, mdm.Application.exitWithCode(0) 就可以關程式了

所以不管你是在什麼階段都能用。
*/

Monday, December 3, 2007

Note : Adobe Flex 2 (Training from the Source)


Lesson 24 Using Shared Objects
Shared Objects 可以由複雜的資料結構組成(話是這樣說沒錯,但是目前的經驗是,也只有簡單的資料型別可以,BitmapData 等大型的東西就要轉成Byte 寫進去,再自己 parse出來了)。學到的重點是使用前最好 instantiate 給它 ex. example.data.accounts = new Array();。另外就是,如果存的東西比較複雜 ex. boolean + array => example.data.accounts = {hasWork:Boolean, buyBooks:Array}。

Note: Essential ActionScript 3.0


Chap 13 Exceptions and Error Handling

講的是 try/ catch/finally 的使用跟邏輯。有學過Java 的人應該很熟練。


Chap 14 Garbage Collection

Programmer 無法強迫System 做 Garbage Collection,甚至連提示它可以 collect 的指令好像沒有,所以一個objct 就算 reference 被設成 null,還是有可能繼續作用(這個還滿重要的,不是設成 null 就沒事了)。你只能自己讓 Deactivate Object(進入可回收狀態,回收時間仍然由系統決定),也就是
  1. 拿掉 Event Handler
  2. 停止 timer 跟 intervals
  3. 停止 playhead (不繼續播放)
  4. 把唯一由自己reference 到的object 也 deactivate。

另外一點就是,如果可以重複使用一個Object就重複使用,而 不是因為方便就一直new,這樣很容易就會把記憶體用光(雖然, 這樣就可以觸發 Garbage Collection!!!)。

使用 MDM 包裝 swf 檔成為全螢幕執行的設定方式

Style-> Window Settings : No Border
Size/Position-> Window Size: MovieSize
Extras : Maximized

from Jones

Friday, November 30, 2007

Thursday, November 29, 2007

放大 Bitmap 的時候(或是內含Bitmap 的 DisplayObject) 可提昇Display 品質的參數



// 設定了 smoothing, pixelSnapping 後就好很多

var tempBitmapData:BitmapData;
var tempBitmap:Bitmap;
var temp_mc:MovieClip;
temp_mc = new MovieClip();

function mc2Bitmap(mc1:MovieClip):BitmapData {
var myBitmap:BitmapData = new BitmapData(mc1.width, mc1.height, true, 0);
myBitmap.draw(mc1);
return myBitmap;
}


tempBitmapData = mc2Bitmap( new WhiteBackBoy1());
// WhiteBackBoy1 : 有內容的 MovieClip (自這裡是把他的內容"印"成 BitmapData )

tempBitmap = new Bitmap( tempBitmapData );
tempBitmap.pixelSnapping = PixelSnapping.AUTO;
tempBitmap.smoothing = true;

temp_mc.addChild( tempBitmap );
addChild( temp_mc );

stage.addEventListener( KeyboardEvent.KEY_DOWN , KeyDownEventHandler);


function KeyDownEventHandler(event:KeyboardEvent) {
if (event.keyCode == Keyboard.UP) {
trace("Keyboard.UP");
temp_mc.scaleX *= 1.1;
temp_mc.scaleY *= 1.1;
} else if (event.keyCode == Keyboard.DOWN) {
trace("Keyboard.DOWN");
temp_mc.scaleX /= 1.1;
temp_mc.scaleY /= 1.1;
}
}



Wednesday, November 28, 2007

SharedObject 的 data 可以傳給其他 function 當作 reference 來改 data 下面的屬性的值

// 也就是說,你不一定直接用 shared object 的 data 下的屬性來改值,可以把 reference 傳給其他 function 後,讓那些 function 自己改

var bytes:ByteArray = new ByteArray();
var example:SharedObject = SharedObject.getLocal( "example8");
var tempList:Array;

var targetObject:Object;

function Target( o:Object ) {
targetObject = o;
targetObject.times = 10;
}
function AddTarget() {
targetObject.times++;
}

if ( example.data.times == undefined ) {
example.data.times = new Number();
var i:Number;
i = 0;
example.data.times = i;
trace("i:" + i); // first time, 0
trace("Before Target():" + example.data.times);// first time, 0
Target( example.data );
trace("After Target():" + example.data.times);// first time, 10
AddTarget();
AddTarget();

AddTarget();

AddTarget();

AddTarget();

trace("After 5 AddTarget():" + example.data.times);// first time, 15
example.flush();
}
else{
trace("example.data.times last time:" + example.data.times); // from the second time, 15
}

SharedObject 的data 下的屬性是多個屬性合成的時候的宣告方法

//bS:SharedObject
// bS.data.page1, bS.data.page2, bS.data.page3, ... bS.data.pagei 是我想存的資料(每筆資料有兩個成員 Boolean, ByteArray)
// cutFinished :Boolean
// cutPointLIst:ByteArray
// 記得要 new instance 給這些變數


bS.data["page" + i] = {cutFinished:Boolean, cutPointList:ByteArray};

bS.data["page" + i].cutFinished = new Boolean(); // 記得要 new instance 給這些變數
bS.data["page" + i].cutFinished = 你想給他的Boolean 值;
bS.data["page" + i].cutPointList = new ByteArray(); // 記得要 new instance 給這些變數
bS.data["page" + i].cutPointList = 你想給他的ByteArray;
bS.flush();




改場景(Scene)名稱順序

Windows -> Other Panels -> Scene

可以在裡面
  1. 增加Scene
  2. 更改Scene名稱
  3. 改變Scene 之間的順序

Saturday, November 24, 2007

不負責任的 Flash 筆記本 開張了 ^-^

最近一直都跟 Flash, ActionScript 3.0 混在一起 跌倒了好多次 也學到很多東西

所以不自量力的把自己的一些小筆記 po 上 blog 來

一來整理一下經驗跟大家分享 二來自己以後可能也會再用到 XD