2011年4月27日 星期三

Bitmap 粒子(一)

package
{
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.filters.BitmapFilterQuality;
 import flash.filters.BlurFilter;
 import flash.geom.Point;
 [SWF(width="1024", height="768", frameRate="30", backgroundColor="#000000", pageTitle="粒子測試")]
 public class particale extends Sprite
 {
  private var _bitmapData:BitmapData;
  private var _photosphereMap:Bitmap;
  private var _sprite:Sprite = new Sprite();   
  //活動場景大小
  private var _mapWidth:Number = 400;
  private var _mapHeight:Number = 400;
  //顆粒大小
  private var _particaleSize:Number = 10;  
  //位置與量
  private var _position:Point;
  private var _vector:Point;
  //濾鏡強度
  private var blurX:Number = 1.5;
  private var blurY:Number = 1.5;

  public function particale()
  {
   super();
   init();
  }
  private function init():void
  {
   initPhotosphereMap();
   deployPhotosphere();
   initPostiton();
   initVector();
   onStart();
  }

加密工具

SWF加密工具
主要讓反向工程破解軟體,反向出來後程式碼內容成為奇怪的結構難以閱讀。


JavaScript
  • T4nk JS
HTML
  • Encrypt HTML

將SWF包成.exe

2011年4月26日 星期二

BitmapData Draw API 運用 : 將圖片切片

Draw API 圖片切片基本原理
public function draw(source:IbtimapDrawable,x:Number , y:Number , widht:Number , height:Number):Bitmap
{
 var rectangle:Rectangle = new Rectangle(0,0,widht+0.5,height+0.5);
 var bd:BitmapData = new BitmapData(widht+1,height+1);
 var matrix:Matrix = new Matrix(1, 0, 0, 1, -x, -y);
 bd.draw(sourceImage,matrix,null,null,_rectangle);
 return new BitmapData(bd);
}
 
原理解說:
這是Draw API
public function draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:flash.geom:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
 
主要是使用ClipRect與matrix搭配來做到切片效果
  • ClipRect是取一個固定點的可視窗口(將會由Rectangle來定義),在這窗口外的範圍圖片將不可見,所以我們draw的範圍也就是在這窗口中。
  • 而藉由Matrix的垂直與水平位移來讓圖片各部份移到窗口。
  • new Rectangle(0,0,widht+1,height+1); 與 new BitmapData(widht+1,height+1);會將長官都加1是因為有些狀況下,因為來源圖片想切的長寬無法整除,會造成無法貼齊圖片的現象,所以簡單的方式是以加1象素來解決。

控制使用實體的數量(一)

假設我需要拼圖切片,而拼圖最大數量為9*9,那麼可能數值有2*2~9*9的實體,但是使用者可能沒有選擇到9*9最大數量來玩拼圖,那麼既然他沒用那麼大就不該產生那麼多,所以如下
可以產出正確的實體數量,數量最大值由輸入參數column來控制,程式如下:

//這裡邏輯可以限定產生最大的實體為(9x9)
private var _storge:Vector.<Object>;
private function creatdInstance(column:int):void
{
 var startCount:int = _storge.length;
 var endCount:int = column*column;
 for( startCount ; startCount < endCount ; startCount++)
 {
  _storge[startCount] = createImageDrawProxy(startCount);
 }
}
private function selected(column:int):void
{
 creatdInstance(column);
}
 
//如此當selected被呼叫如下
  1. selected(4);
  2. selected(2);
  3. selected(6);
如此會先產生16個object,但第二次呼叫selected(2)時,因為不能滿足條件所以不會執行,但若是selected(6)在執行,會再從第17個開時產生至36個為止。

另外還有一種控管實體數量的方式叫做Pool,在Flex List組件中的ItemRenderer中即有使用到此觀念,其次在遊戲中畫面中產生的swf數量以及像是google地圖切片顯示也都會使用到Pool方式。

2011年4月25日 星期一

避免重複程式碼:flash/flex開發中對於遠端處理常用偵聽式提出

package com.loaderProxy
{
 import flash.events.Event;
 import flash.events.EventDispatcher;
 import flash.events.HTTPStatusEvent;
 import flash.events.IEventDispatcher;
 import flash.events.IOErrorEvent;
 import flash.events.ProgressEvent;
 import flash.events.SecurityErrorEvent;
 public class EventListenerProxy extends EventDispatcher
 {
  public function EventListenerProxy(target:IEventDispatcher=null)
  {
   super(target);
  }  
  //event handel method
  public var completeHandler:Function = function(event:Event):void {};
  public var openHandler:Function = function(event:Event):void{};
  public var progressHandler:Function = function(event:ProgressEvent):void{};
  public var securityErrorHandler:Function = function(event:SecurityErrorEvent):void{};
  public var httpStatusHandler:Function = function(event:HTTPStatusEvent):void{};
  public var ioErrorHandler:Function = function(event:IOErrorEvent):void{};
  public function addLoaderEventListener(target:IEventDispatcher):void
  {
   addEventListenerProxy(target , Event.COMPLETE ,completeHandler);
   addEventListenerProxy(target , Event.OPEN, openHandler);
   addEventListenerProxy(target , ProgressEvent.PROGRESS, progressHandler);
   addEventListenerProxy(target , SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   addEventListenerProxy(target , HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
   addEventListenerProxy(target , IOErrorEvent.IO_ERROR, ioErrorHandler);
  }

  public function removeLoaderEventListener(target:IEventDispatcher):void
  {
   removeEventListenerProxy(target , Event.COMPLETE ,completeHandler);
   removeEventListenerProxy(target , Event.OPEN, openHandler);
   removeEventListenerProxy(target , ProgressEvent.PROGRESS, progressHandler);
   removeEventListenerProxy(target , SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
   removeEventListenerProxy(target , HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
   removeEventListenerProxy(target , IOErrorEvent.IO_ERROR, ioErrorHandler);
  }
  //EventListener Proxy
  public function addEventListenerProxy(target:IEventDispatcher , type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
  {
    target.addEventListener(type, listener, useCapture, priority, useWeakReference);

  }
  public function removeEventListenerProxy(target:IEventDispatcher , type:String, listener:Function, useCapture:Boolean = false):void
  {
   target.removeEventListener(type , listener , useCapture );
  }
 }
}
而更好的話將event handel method所有的method宣告到一個Interface,如此若是需要不同動作處理者,可實作該Interface來實現。

因此可以:
public var handel:IHandelMethod  = new LoaderHandelMethod();

addEventListenerProxy(target , Event.COMPLETE ,handel.completeHandler);
如此程式碼可以簡化並能鬆綁個物件間之關係

2011年4月24日 星期日

Bad smells in Code:Duplicated Code

Duplicated Code (重複的程式碼)
Duplicated Code會讓程式不好維護,也會讓程式變的冗長,常見的重複狀況如下:
  • 一個Class內有兩個個函式具有相同的運算式,這時可以採用Extract Method
    將其提煉出來成為一個函式。
  • 兩個具有兄弟關係的Class(繼承同一個父類別),兩Class內存在相同運算式的函式,可以使用Pull Up Method方式,將其函式提煉出來放置父類別中,解決Duplicated Code。
  • 兩個沒有關係的Class也會出現相同運算式的程式碼,可以考慮將這重複的運算式寫成另外一個Classb讓其運用,這感覺類似使用策略模式,或是過程代理。

2011年4月16日 星期六

MySQL5.1 DataType 日期 (Date)

日期
資料名稱byte數值範圍格式說明
DATE 3'1000-01-01'到'9999-12-31''YYYY-MM-DD'日期:允許使用字串或數字為DATE分配值。
DATETIME 8'1000-01-01 00:00:00'到'9999-12-31 23:59:59''YYYY-MM-DD HH:MM:SS'日期和時間的組合:
允許使用字串或數字為DATETIME分配值。
TIMESTAMP(M) 4'1970-01-01 00:00:00'到2037年'YYYY-MM-DD
HH:MM:SS'
時間戳記:TIMESTAMP用於INSERT或UPDATE操作時記錄日期和時間。如果你不分配一個值,表中的第一個TIMESTAMP列自動設置為最近操作的日期和時間。也可以通過分配一個NULL值,將TIMESTAMP列設置為當前的日期和時間。

TIMESTAMP值返回後顯示為'YYYY-MM-DD HH:MM:SS'格式的字符串,顯示寬度固定為19個字符。如果想要獲得數字值,應在TIMESTAMP 列添加+0。
註釋:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持。
TIME 3'-838:59:59'到'838:59:59''HH:MM:SS' 時間:MySQL以'HH:MM:SS'格式顯示TIME值,但允許使用字串或數字為TIME列分配值。
 YEAR (2|4) 1二位:70到69(1970~2069)。

四位:1901到2155和0000。
YYYY兩位或四位格式的年。預設是四位格式。在四位格式中,允許的值是1901到2155和0000。在兩位格式中,允許的值是70到69,表示從1970年到2069年。 MySQL以YYYY 格式顯示YEAR值,但允許使用字串或數字為YEAR列分配值。

引用與參考資料:
MySQL官方文件

MySQL5.1 DataType 整數與浮點數

說明:
  • M:要顯示的位數,最大有效範圍是255。
  • D:要顯示的小數位數,最大可能的值是30,但是應該不大於M-2。
  • M和D若省略,則會根據計算機硬體來決定。單精度精確約7位小數。
  • 數值列指定ZEROFILL,MySQL會自動為該列加上UNSIGNED屬性。
  • ZEROFILL,自動填0,若有個int(4)資料型態,若填入一個數值1那他會變成0001。
  • UNSIGNED:表示無號數型態。
  • 如果指定UNSIGNED,不允許負值。
數值:
整數
資料名稱bit數值範圍選項說明
TINYINT (M)8有號:-128~127
無號:0~255
UNSIGNED、
ZEROFILL
SMALLINT(M) 16有號:-32768~32767
無號:0~65535
UNSIGNED、ZEROFILL
MEDIUMINT(M) 24有號:-8388608~8388607
無號:0~16777215
UNSIGNED、ZEROFILL
INT(M)32有號:-2147483648~2147483647
無號:0~4294967295
UNSIGNED、ZEROFILL
INTEGER(M)32有號:-2147483648~2147483647
無號:0~4294967295
UNSIGNED、ZEROFILL
BIGINT[(M)] 64有號:-9223372036854775808~9223372036854775807
無號:0~18446744073709551615
UNSIGNED、ZEROFILL


浮點數
資料名稱bit數值範圍選項說明
 FLOAT (M,D)32-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。 UNSIGNED、ZEROFILL單精度浮點數
DOUBLE (M,D)64-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。 UNSIGNED、ZEROFILL雙精度浮點數
DOUBLE PRECISION(M,D) 64 UNSIGNED、ZEROFILLDOUBLE同義詞
REAL(M,D) 32 UNSIGNED、ZEROFILLFLOAT同義詞
FLOAT(p)

 UNSIGNED、ZEROFILL
p表示精度(以位數表示),但MySQL只使用該值來確定是否結果列的資料型態為FLOAT或DOUBLE。如果p值是0~24,資料型態將為沒有M或D值得FLOAT。如果p值是25~53,則資料型態將為沒有M或D值得DOUBLE。
DECIMAL(M,D) UNSIGNED、ZEROFILL壓縮的“嚴格”定點數。 M是小數位數(精度)的總數,D是小數點(標度)後面的位數。小數點和(負數)的'-'符號不包括在M中。如果D是0,則值沒有小數點或分數部分。 DECIMAL整數最大位數(M)為65。支持的十進制數的最大位數(D)是30。如果D被省略, 預設是0。如果M被省略, 預設是10。
DEC(M,D) UNSIGNED、ZEROFILLDECIMAL的同義詞
NUMERIC(M,D) UNSIGNED、ZEROFILLDECIMAL的同義詞
FIXED(M,D)  UNSIGNED、ZEROFILL
FIXED同義詞適用於與其它服務器的兼容性。



參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#choosing-types

2011年4月14日 星期四

PHP字串連接

PHP中字串連接是使用點 .

<?php 
$stringA = "Hello World" ;
$stringB = " JT"; 
echo $stringA . $stringB;
 ?>

Java & C# & Actionscript 可使用 + 運算子來連接字串