2010年12月27日 星期一

Generate SWF

大家好,我是奶綠茶
在 flash 裡,想要透過程式 , 在 runtime 時產生一個新的 swf 檔
可以使用 swfassist
但無法自定類別或是屬性。

今天來介紹另一套類別:as3-commons-bytecode
這套類別可自定一個新的類別, 加入自定的屬性和方法,然後另存一個新的 swf 檔
但目前奶綠我試的結果,無法加入圖片或影格(如果有好心人事試出來的話,也請指教一下)
1. 先下載他的 類別包, 要載四個 swf
as3commons-bytecode-0.9.swc
as3commons-lang-0.3.1.swc
as3commons-logging-1.2.swc
as3commons-reflect-1.3.3.1.swc
都在他的 project 頁面裡。

測試
/**
 * @author milkmidi
 * @see http://milkmidi.blogspot.com
 * @version 1.0.1
 * @date created 2010/12/27/
 */
package  {  
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.FileReference;
 import flash.system.ApplicationDomain;
 import flash.utils.ByteArray;
 import org.as3commons.bytecode.abc.enum.Opcode;
 import org.as3commons.bytecode.emit.IAbcBuilder;
 import org.as3commons.bytecode.emit.IClassBuilder;
 import org.as3commons.bytecode.emit.IMethodBuilder;
 import org.as3commons.bytecode.emit.impl.AbcBuilder;
 import org.as3commons.reflect.AccessorAccess;
 public class MyDemo1 extends Sprite {   
  protected static const PACKAGE :String = "milkmidi.generated";
  protected static const CLASS  :String = "MyGeneratedClass";
  protected static function getPackageAndClassName():String { return PACKAGE + "." + CLASS;  }
  
  private var _abcBuilder   :IAbcBuilder;
  public function get abcBuilder():IAbcBuilder { return _abcBuilder; }
  
  private var _classBuilder  :IClassBuilder;
  public function get classBuilder():IClassBuilder { return _classBuilder; }
  
  public function MyDemo1()  {
   init( PACKAGE , CLASS );
   generatProperties();
   generated(); 
  } 
  private function init(pPackage:String , pClass:String):void {
   _abcBuilder = new AbcBuilder();
   _classBuilder = _abcBuilder.definePackage(pPackage).defineClass(pClass);    
  }
  protected function generatProperties():void {   
   // generate public  property
   _classBuilder.defineProperty("myName", "String", "milkmidi");   
   
   // generate set/get
   _classBuilder.defineAccessor("myInt", "int", 100).access = AccessorAccess.READ_ONLY;   
   
   // generate method
   /*
    * public function multiplyByHundred(pValue:int):int{
    *  return pValue * 100;
    * }
    * */
   var _methodBuilder:IMethodBuilder = _classBuilder.defineMethod("multiplyByHundred");
   _methodBuilder.returnType = "int";
   _methodBuilder.defineArgument("int");
   _methodBuilder.addOpcode(Opcode.getlocal_0)
                 .addOpcode(Opcode.pushscope)
                 .addOpcode(Opcode.getlocal_1)
                 .addOpcode(Opcode.pushint, [100])
                 .addOpcode(Opcode.multiply)
                 .addOpcode(Opcode.setlocal_1)
                 .addOpcode(Opcode.getlocal_1)
                 .addOpcode(Opcode.returnvalue);  
  }  
  protected function generated():void{
   /*  另存成一個實體的 .swf 檔。
   var _bytesSWF :ByteArray = abcBuilder.buildAndExport();
   new FileReference().save( _bytesSWF  ,getPackageAndClassName() +".swf");   
   return;
   //*/
   
   _abcBuilder.addEventListener(Event.COMPLETE, _abcBuilderCompleteHandler);
   //loads the generated class into the current application domain
   _abcBuilder.buildAndLoad(ApplicationDomain.currentDomain);    
  }
  protected function _abcBuilderCompleteHandler(e:Event):void {   
   var _clazz   :Class = ApplicationDomain.currentDomain.getDefinition(PACKAGE + "." + CLASS) as Class;   
   var _instance  :Object = new _clazz();
   trace(_instance);
   trace("myName:"+_instance.myName);
   trace("myInt:"+_instance.myInt);
   var _result:int = _instance.multiplyByHundred(5);
   trace("multiplyByHundred() > 10 :"+_result);
  } 
  
  
 }//__________________________________________________________________________________ End Class
}//__________________________________________________________________________________ End Package


進階, 使用 interface
先準備一個 interface
package iface {

 public interface IVO {
  
  function get date():String;
  function get value():int;
 }
 
}

測試
/**
 * @author milkmidi
 * @see http://milkmidi.blogspot.com
 * @version 1.0.1
 * @date created 2010/12/27/
 */
package  {  
 import flash.display.BitmapData;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.IOErrorEvent;
 import flash.system.ApplicationDomain;
 import iface.IVO;
 import org.as3commons.bytecode.abc.enum.Opcode;
 import org.as3commons.bytecode.emit.IAbcBuilder;
 import org.as3commons.bytecode.emit.IClassBuilder;
 import org.as3commons.bytecode.emit.IMethodBuilder;
 import org.as3commons.bytecode.emit.impl.AbcBuilder;
 import org.as3commons.reflect.AccessorAccess;
 public class MyDemo2 extends MyDemo1 {   
  public function MyDemo2()  {       
   
  }
  override protected function generatProperties():void {   
   classBuilder.implementInterface("iface.IVO");
   classBuilder.defineAccessor("date", "String", "2010.12.14").access = AccessorAccess.READ_ONLY;  
   classBuilder.defineAccessor("value", "int", 999).access = AccessorAccess.READ_ONLY;  
   //classBuilder.defineAccessor("bitmapData", "flash.display.BitmapData", new BitmapData(1,2)).access = AccessorAccess.READ_ONLY;  
   //classBuilder.defineProperty("bitmapData", "flash.display.BitmapData", new BitmapData(1, 2));       
   //trace(123);
  }
  override protected function _abcBuilderCompleteHandler(e:Event):void {
   var _clazz   :Class = ApplicationDomain.currentDomain.getDefinition( getPackageAndClassName() ) as Class;
   var _instance  :IVO = new _clazz() as IVO;
   trace("date:" + _instance.date);
   trace("value:" + _instance.value);
  }
 
 }//__________________________________________________________________________________ End Class
}//__________________________________________________________________________________ End Package

轉載請註明出處 http://milkmidi.blogspot.com/2010/12/generate-swf.html

2010年12月14日 星期二

FlashCS5 Physics

大家好,我是奶綠茶
在 Flash 裡要製作 Physics 效果, 大家該馬上連想到 Box2D
其實 Flash CS5 就有內建這樣的類別, 只是目前 Adobe 還沒公開


你可以在這個路徑下找到 Physics 類別
X:\Program Files\adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs


小弟我玩了一下,還滿好上手的, 不過沒有任何的文件, K 起來有點辛苦, 反正先完看看


參考網址:http://heftybyte.com/?p=36

線上Demo請點我
轉載請註明出處
/**
 * @author milkmidi
 * @see http://milkmidi.blogspot.com
 * @version 1.0.1
 * @date created 2010/12/14/
 */
package  {  
 import flash.display.DisplayObject;
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.geom.ColorTransform;
 import flash.geom.Point;
 import PffLib.*;
 import swc.Builder_mc;
 import swc.Circle_mc;
 public class CrashDemo extends Sprite {  
  private var _world:World;
  
  public function CrashDemo()  {   
   var _physm:PhysicsManager = new PhysicsManager(this);

   _world = _physm.createWorld();
   _world.enableCollisions(true);
   _world.enableFriction(true);
   _world.setGravity(new Point(0, 500));
   //_world.setDamping(2);
  
   createPhysicsElements();
   createConstraint();   
   createBuilder();   
   
   trace(PhysObj.kCollisionTypeRectangle)
   trace(PhysObj.kCollisionTypeCircle)
   
   addEventListener(Event.ENTER_FRAME , onTickHandler);
  }  
  
 
  
  private function createConstraint():void {
   // top   
   createBox(0, 0, stage.stageWidth , 20);
   // down
   createBox(0, stage.stageHeight - 20, stage.stageWidth , 20);
   
   //left
   createBox(0, 0, 20 , stage.stageHeight);
   //right
   createBox(stage.stageWidth - 20, 0, 20 , stage.stageHeight);
  }
  private function createBox(pX:int , pY:int ,pWidth:int , pHeight:int):void {   
   var _box:Sprite = ElementsUtil.create(ElementsUtil.BOX, pX , pY , pWidth , pHeight );
   addChild(_box);
   
   var _obj:PhysObj = _world.addPhysObj( _box, new Point(0, 0), PhysObj.kCollisionTypeRectangle, false );
   _obj.setNonMoving(true);   
   //_obj.setCoefficientOfFriction(1);   
  }
  
  
  private function createPhysicsElements():void{  
   var _physObj:PhysObj;
   var _c:Sprite = new Circle_mc;
   _c.x = 100;
   _c.addEventListener(MouseEvent.CLICK , function (e:MouseEvent):void {
    
    //var _vx:int = _c.mouseX * -1;
    var _vx:Number = Math.random() * 500 - 200;
    var _vy:Number = Math.random() * 500 + 200;
    //var _vy:int = _c.mouseY ;
    //trace(_c.mouseY , _c.height, _vy);
    _physObj.setLinearVelocity(new Point(_vx * 2, -_vy*2));    
   });
   _c.buttonMode = true;
   
   addChild(_c);   
   _physObj = _world.addPhysObj(  _c , new Point( 1, 1 ) , PhysObj.kCollisionTypeCircle, false );
   _physObj.setAngularVelocity(Math.PI / 2);
   //_physObj.setCoefficientOfFriction(1);
   //_c.physObj = _physObj;
   
   var _mc1:Sprite = ElementsUtil.create(ElementsUtil.BOX, 10, 10, 50, 50);
   addChild(_mc1);
   var _obj1:PhysObj = _world.addPhysObj( 
    _mc1,
    new Point(0, 0), PhysObj.kCollisionTypeRectangle, false
   );  
   _world.addJoint( 0 ,_physObj, new Point(0, 30) , _obj1, new Point(50, 50));
   
  }
  private function createBuilder():void{
   var _c:Builder_mc = new Builder_mc();
   addChild( _c );
   for (var i:int = 0; i < _c.numChildren; i++) {
    var _mc:DisplayObject = _c.getChildAt(i);
    _world.addPhysObj( _mc, new Point(0, 0), PhysObj.kCollisionTypeRectangle, false );
   }
   
   
  }
  
  private function onTickHandler(e:Event):void {
   _world.advanceFrames();
   _world.updateAllObjects();
  }  
 }//__________________________________________________________________________________ End Class
}//__________________________________________________________________________________ End Package
import flash.display.Sprite;

class ElementsUtil {
 public static const BOX  :String = "box";
 public static const CIRCLE :String = "circle";
 public static function create(pType:String , pX:int , pY:int , pWidth:int,pHeight:int):Sprite {
  var sprite:Sprite = new Sprite();
  sprite.graphics.beginFill(0x0);
  switch (pType) {
   case BOX:
    sprite.graphics.drawRect(0, 0, pWidth , pHeight);
    break;
   case CIRCLE:
    sprite.graphics.drawCircle(0, 0, pWidth);
    break;   
  } 
  sprite.graphics.endFill();
  sprite.x = pX;
  sprite.y = pY;
  return sprite;
 }
}

2010年12月1日 星期三

Adobe 2011 Flash新技術整理

大家好,我是奶綠茶
整理了一下 Adobe Flash Player 之後的幾項新功能

1.全新 3D API, 代號:Molehill

有影片有真相

以上看到的效果, 將來都可以直接在 Web 上直接看到效果
和我們在用的 FlashPlayer10 3D , PV3D 不同的是
支援 GPU 硬體加速了 (備註1)
目前該技術會先使用在 Adobe AIR (備註2)
Adobe 也明確指出, 會把該 3D 功能加入來未來的 Flash Player,
其中包含手機版的 FlashPlayer

目前只有影片, 沒有任何的技術文件可以看, 所以將來code怎麼寫
設計師怎麼做, 都還不知道

資料來源:

2. Flash Player10.2
一樣支援了硬體加速的影片播放
可以在Web上播放大畫面, 高畫質的影片, 不在向之前的版本一樣會 Lag(備註3)
支援客製化的Mouse Cursors,(這個不是那麼重要, 現在技術也可以做到類似的效果)
支援Multiple Monitors影片播放, 目前的 Flash Player 在滿版播放影片時, 只能有一個畫面播放
現在司樣有多個。
資源來源:

3.以上的技術, 小弟覺得要用在商業網站上, 要等 Player 版本普及, 大概需要等到後年初左右
如果有案子是單機版的話, 就無所謂

備註1:目前 Flash 只能靠燒 CPU 來運算, 如果加了硬體功能, 能夠分擔運算, 效能就能更好。
備註2Adobe AIR 指的是單機版應用程式, 使用者要下載安裝後才能看。
備註3:只有效能好, K 數還是要注意

轉載請註明出處