Google 网上论坛
订阅 XIntend
电子邮件:
访问此论坛

[原]关于AS3的MovieClip的addFrameScript()方法个人理解

KingFo 于 2008-09-04 23:23:57 发表开发者

网络上都早有了此方法的描述,但是描述的并不太在正确
网络的描述是这样的:
 

  1. addFrameScript(frame:unit,notify:Function):void


相信很多人都尝试过以下输出公共方法的函数
 

  1. describeType(); 

所以通过解析可以明显的看出来是类似:
 

  1. addFrameScript(...args):void

可以理解成为:
 

  1. addFrameScript(frame:Object, notify:Function):void

实际上我的猜测是

 

  1. //伪码  
  2. function addFrameScript(..args):void{  
  3.     var i:int=0;  
  4.     var frame:Object  
  5.     var notify::Function  
  6.     for(;i<args.length;i+=2){  
  7.        frame=args[i];  
  8.        notify=args[i+1];
  9.  //TODO:  
  10.  }  
  11.  

 用法:
 

  1. addFrameScript("frameLabel",func);  
  2. //或  
  3. addFrameScript(1,func); 

[原]动态注册点显示对象 AS3实现---Proxy方法

KingFo 于 2008-08-26 23:59:33 发表开发者

由于之前的

动态注册点显示对象 AS3实现

不太适合多类型的显示对象DisplayObject复合应用,因此实际应用过程中采用了Proxy模式,这样
只要注册时使用对应的显示对象即可。
 
PS: 由于Blog限制,示例不能再摘要中显示,故请点击文章内部看玩具吧.....
 
示例:
操作:单击确定旋转/缩放点,按下并拖动鼠标则实现以旋转,鼠标滚轮则缩放对应的点。
 

源码:
 

  1. package  com.xintend.util {  
  2.     import flash.display.DisplayObject;  
  3.     import flash.display.Sprite;  
  4.     import flash.geom.Point;  
  5.     import flash.utils.Proxy;  
  6.     import flash.utils.flash_proxy;  
  7.  
  8.       
  9.     /**  
  10.     * [AS3]DynamicRegistrationProxy  
  11.     * 动态注册点代理   引用请保留此处信息及参考信息  
  12.     * @author telds[kingfo] www.xintend.com   
  13.     *   
  14.     *   
  15.     * 一级参考:  
  16.     *   作者: Darronschall        [ActionScript 2]  
  17.     *   站点: http://www.darronschall.com/weblog/archives/000054.cfm  
  18.     *   
  19.     * 二级参考:  
  20.     *   作者:     Robert Penner       [ActionScript 1]  
  21.     *   站点: www.robertpenner.com      
  22.     *   
  23.     */ 
  24.     public dynamic class DynamicRegistrationProxy extends Proxy {         
  25.           
  26.         public function DynamicRegistrationProxy(source:DisplayObject=null):void {  
  27.             _displayObject = source || new Sprite();  
  28.         }  
  29.           
  30.         override flash_proxy function callProperty(methodName:*, ... args):*  {  
  31.             var res:*;  
  32.             var a:Point;  
  33.             var b:Point;  
  34.             var method:String = methodName.toString();  
  35.             var property:String;  
  36.             switch (method) {  
  37.                 case 'setRegistrationByStage':  
  38.                     a = _displayObject.globalToLocal(new Point(args[0], args[1]));                    
  39.                     _stageRegX = args[0];  
  40.                     _stageRegY = args[1];         
  41.                     _regX = a.x;  
  42.                     _regY = a.y;  
  43.                 break;  
  44.                 case 'setRegistrationBySelf':  
  45.                     a = _displayObject.localToGlobal(new Point(args[0], args[1]));                    
  46.                     _regX = args[0];  
  47.                     _regY = args[1];          
  48.                     _stageRegX = a.x;  
  49.                     _stageRegY = a.y;  
  50.                 break;  
  51.                 case 'setPropRel':  
  52.                     a = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));  
  53.                     property = args[0].toString();  
  54.                     _displayObject[property] = args[1];           
  55.                     b = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));       
  56.                     _displayObject.x -= b.x - a.x;  
  57.                     _displayObject.y -= b.y - a.y;  
  58.                 break;                
  59.                 default:  
  60.                     res = _displayObject[method].apply(_displayObject, args);  
  61.                 break;  
  62.             }  
  63.             return res;  
  64.         }  
  65.           
  66.         override flash_proxy function getProperty(name:*):* {  
  67.             var res:*;  
  68.             var property:String = name.toString();  
  69.             switch (property) {  
  70.                 case 'regX':  
  71.                     res = _regX;  
  72.                 break;  
  73.                 case 'regY':  
  74.                     res = _regY;  
  75.                 break;  
  76.                 case 'stageRegX':  
  77.                     res = _stageRegX;  
  78.                 break;  
  79.                 case 'stageRegY':  
  80.                     res = _stageRegY;  
  81.                 break;  
  82.                 case 'x2':  
  83.                     res = _x2;  
  84.                 break;  
  85.                 case 'y2':  
  86.                     res = _y2;  
  87.                 break;  
  88.                 case 'scaleX2':  
  89.                     res = _displayObject.scaleX;  
  90.                 break;  
  91.                 case 'scaleY2':  
  92.                     res = _displayObject.scaleY;  
  93.                 break;  
  94.                 case 'rotation2':  
  95.                     res = _displayObject.rotation  
  96.                 break;  
  97.                 case 'source':  
  98.                     res = _displayObject;  
  99.                 break;  
  100.                 default:  
  101.                     res = _displayObject[property];  
  102.                 break;  
  103.             }  
  104.             return res;  
  105.         }  
  106.  
  107.         override flash_proxy function setProperty(name:*, value:*):void {  
  108.             var property:String = name.toString();            
  109.             switch (property) {  
  110.                 case 'regX':  
  111.                     _regX = value;  
  112.                 break;  
  113.                 case 'regY':  
  114.                     _regY = value;  
  115.                 break;  
  116.                 case 'stageRegX':  
  117.                     _stageRegX = value;  
  118.                 break;  
  119.                 case 'stageRegY':  
  120.                     _stageRegY = value;  
  121.                 break;  
  122.                 case 'x2':  
  123.                     _x2 += value - _displayObject.x;  
  124.                 break;  
  125.                 case 'y2':  
  126.                     _y2 += value - _displayObject.y;  
  127.                 break;  
  128.                 case 'scaleX2':  
  129.                     flash_proxy::callProperty('setPropRel',"scaleX", value);  
  130.                 break;  
  131.                 case 'scaleY2':  
  132.                     flash_proxy::callProperty('setPropRel',"scaleY", value);  
  133.                 break;  
  134.                 case 'rotation2':  
  135.                     flash_proxy::callProperty('setPropRel',"rotation", value);  
  136.                 break;  
  137.                 default:  
  138.                     _displayObject[property] = value;  
  139.                     break;  
  140.             }  
  141.         }  
  142.  
  143.           
  144.           
  145.         private var  _displayObject:DisplayObject;  
  146.         private var _regX:Number = 0;  
  147.         private var _regY:Number = 0;  
  148.         private var _stageRegX:Number = 0;  
  149.         private var _stageRegY:Number = 0;  
  150.         private var _x2:Number = 0;  
  151.         private var _y2:Number = 0;  
  152.     }  
  153.       

示例源码:
 

  1. package {  
  2.       
  3.     import com.xintend.util.DynamicRegistrationProxy;  
  4.     import flash.display.Bitmap;  
  5.     import flash.display.Sprite;  
  6.     import flash.events.MouseEvent;  
  7.     import flash.geom.Point;  
  8.       
  9.     public class Main extends Sprite    {  
  10.           
  11.         private var a:DynamicRegistrationProxy;  
  12.         private var t:Sprite = new Sprite();  
  13.         private var c:CrossHairs = new CrossHairs();  
  14.         [Embed(source = '../bin/123.jpg')]private var imge:Class;  
  15.         private var b:Bitmap  
  16.         public function Main():void {  
  17.               
  18.             b=new imge() as Bitmap  
  19.               
  20.             //t.graphics.beginFill(0xFF0000);  
  21.             //t.graphics.drawRect(0, 0, 80, 40);  
  22.             //t.graphics.endFill();  
  23.               
  24.             //t.buttonMode = true;  
  25.             //t.useHandCursor = true;  
  26.               
  27.             t.addChild(b);  
  28.             c.x = t.x = stage.stageWidth / 2- t.width/2;  
  29.             c.y = t.y = stage.stageHeight / 2 - t.height/2;  
  30.               
  31.               
  32.             t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  33.             t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);  
  34.             t.addEventListener(MouseEvent.MOUSE_WHEEL, handleMOUSE);  
  35.               
  36.             a = new DynamicRegistrationProxy(t);  
  37.               
  38.             addChild(t);  
  39.             addChild(c);  
  40.         }  
  41.           
  42.         private  function handleMOUSE(event:MouseEvent):void {  
  43.             switch(event.type) {  
  44.                 case MouseEvent.MOUSE_DOWN:  
  45.                     a.setRegistrationByStage(mouseX, mouseY);  
  46.                     //trace(t.globalToLocal(new Point(mouseX,0)).x,t.globalToLocal(new Point(0,mouseY)).y);  
  47.                     c.x = mouseX;  
  48.                     c.y = mouseY;  
  49.                     removeEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  50.                     addEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  51.                     addEventListener(MouseEvent.MOUSE_UP, handleMOUSE);  
  52.                 break;  
  53.                 case MouseEvent.MOUSE_MOVE:  
  54.                     //trace(t.mouseX - a.regX, t.mouseY - a.regY);  
  55.                     a.rotation2 += 5;  
  56.                     //a.scaleXByRefer += 5;  
  57.                 break;  
  58.                 case MouseEvent.MOUSE_UP:     
  59.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  60.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  61.                 break;  
  62.                 case MouseEvent.MOUSE_WHEEL:      
  63.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  64.                     c.x = mouseX;  
  65.                     c.y = mouseY  
  66.                     a.setRegistrationByStage(mouseX, mouseY);  
  67.                     a.scaleX2 += event.delta * 0.1;  
  68.                     a.scaleY2 += event.delta * 0.1;  
  69.                 break;  
  70.                 default:  
  71.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  72.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  73.             }  
  74.         }  
  75.     }  
  76. }  
  77. import flash.display.Shape;  
  78.  
  79. class CrossHairs extends Shape {  
  80.     public function CrossHairs() {  
  81.         graphics.lineStyle(2,0xFF0000);  
  82.         graphics.moveTo( -10, 0);  
  83.         graphics.lineTo( 10, 0);  
  84.         graphics.moveTo( 0, -10);  
  85.         graphics.lineTo( 0, 10);  
  86.     }  

 

[原]动态注册点显示对象 AS3实现

KingFo 于 2008-08-25 14:16:23 发表算法

 相关类:

P.S:这个应用类我就改了下,现实中我是将这个类给做成了Proxy来代替现有的Display以及子类。

  1. package com.xintend.util {  
  2.     import flash.display.DisplayObject;  
  3.     import flash.display.Sprite;  
  4.     import flash.geom.Point;  
  5.       
  6.     /**  
  7.     * [AS3]DynamicRegistrationDisplayObject  
  8.     * 动态注册点   
  9.     * @author telds[kingfo] www.xintend.com    
  10.     *   
  11.     * 一级参考:  
  12.     *   作者: Darronschall        [ActionScript 2]  
  13.     *   站点: http://www.darronschall.com/weblog/archives/000054.cfm  
  14.     *   
  15.     * 二级参考:  
  16.     *   作者:     Robert Penner       [ActionScript 1]  
  17.     *   站点: www.robertpenner.com      
  18.       
  19.     */ 
  20.     public class DynamicRegistrationDisplayObject{  
  21.         public function get displayObject():DisplayObject { return _displayObject; }  
  22.           
  23.         public function get depth():Number { return _depth; }  
  24.         public function set depth(value:Number):void {  
  25.             _depth = value;  
  26.         }  
  27.           
  28.         public function get label():String { return _label; }         
  29.         public function set label(value:String):void {  
  30.             _label = value;  
  31.         }  
  32.           
  33.           
  34.         public function get stageRegX():Number { return _stageRegX; }         
  35.         public function get stageRegY():Number { return _stageRegY; }         
  36.           
  37.           
  38.         public function get centerX():Number { return _displayObject.x + _displayObject.width / 2; }          
  39.         public function set centerX(value:Number):void {  
  40.             _displayObject.x = value - _displayObject.width / 2;  
  41.         }  
  42.           
  43.           
  44.         public function get centerY():Number { return _displayObject.y + _displayObject.height / 2; }         
  45.         public function set centerY(value:Number):void {  
  46.             _displayObject.y = value - _displayObject.height / 2;  
  47.         }             
  48.           
  49.         public function get regX():Number { return _regX; }   
  50.         public function get regY():Number { return _regY; }       
  51.           
  52.           
  53.           
  54.         public function DynamicRegistrationDisplayObject():void {  
  55.             initializtion();  
  56.         }  
  57.           
  58.         public function setRegistrationByStage(stageX:Number, stageY:Number):void {  
  59.             _stageRegX = stageX;  
  60.             _stageRegY = stageY;  
  61.             var p:Point = _displayObject.globalToLocal(new Point(stageX,stageY));  
  62.             _regX = p.x;  
  63.             _regY = p.y;  
  64.         }  
  65.           
  66.         public function setRegistrationBySelf(selfX:Number, selfY:Number):void {  
  67.             var p:Point = _displayObject.localToGlobal(new Point(selfX,selfY));  
  68.             _stageRegX = p.x;  
  69.             _stageRegY = p.y;             
  70.             _regX = selfX;  
  71.             _regY = selfY;  
  72.         }  
  73.           
  74.         public function get rotationByRefer():Number { return _displayObject.rotation   }  
  75.         public function set rotationByRefer(value:Number):void {                                      
  76.             setPropRel("rotation", value);  
  77.         }  
  78.           
  79.         public function get scaleXByRefer():Number { return _displayObject.scaleX   }  
  80.         public function set scaleXByRefer(value:Number):void {                                    
  81.             setPropRel("scaleX", value);  
  82.         }  
  83.           
  84.         public function get scaleYByRefer():Number { return _displayObject.scaleY   }  
  85.         public function set scaleYByRefer(value:Number):void {                                    
  86.             setPropRel("scaleY", value);  
  87.         }  
  88.           
  89.           
  90.           
  91.           
  92.         public function initializtion(displayObject:DisplayObject=null):void {  
  93.             //throw new Error("AbstractTile is an Abstract Class");  
  94.             _displayObject = displayObject || new Sprite();  
  95.         }  
  96.           
  97.         protected function setPropRel(property:String, value:Number):void {  
  98.             var p:Point = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));  
  99.             _displayObject[property] = value;             
  100.             var pp:Point = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));        
  101.             _displayObject.x -= pp.x - p.x;  
  102.             _displayObject.y -= pp.y - p.y;  
  103.         }  
  104.           
  105.         private var _depth:Number;  
  106.         private var _label:String;  
  107.         private var _regX:Number = 0;  
  108.         private var _regY:Number = 0;  
  109.         private var _stageRegX:Number = 0;  
  110.         private var _stageRegY:Number = 0;  
  111.         private var  _displayObject:DisplayObject;  
  112.     }  
  113.       

 

应用代码:

 

  1. package {  
  2.     import com.xintend.util.DynamicRegistrationDisplayObject;  
  3.     import flash.display.Sprite;  
  4.     import flash.events.MouseEvent;  
  5.     import flash.geom.Point;  
  6.     /**  
  7.     * [AS3]DynamicRegistrationDisplayObjectTest  
  8.     * 动态注册点测试  
  9.     * @author telds[kingfo] www.xintend.com   
  10.     */ 
  11.     public class DynamicRegistrationDisplayObjectTest extends Sprite    {  
  12.           
  13.         private var a:DynamicRegistrationDisplayObject= new DynamicRegistrationDisplayObject();  
  14.         private var t:Sprite = new Sprite();  
  15.         private var c:CrossHairs = new CrossHairs();  
  16.           
  17.         public function DynamicRegistrationDisplayObjectTest():void {             
  18.             t.graphics.beginFill(0xFF0000);  
  19.             t.graphics.drawRect(0, 0, 80, 40);  
  20.             t.graphics.endFill();  
  21.             c.x = t.x = stage.stageWidth / 2- t.width/2;  
  22.             c.y = t.y = stage.stageHeight / 2 - t.height/2;  
  23.             t.buttonMode = true;  
  24.             t.useHandCursor = true;  
  25.               
  26.             t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  27.             t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);  
  28.               
  29.             a.initializtion(t);  
  30.               
  31.             addChild(t);  
  32.             addChild(c);  
  33.         }  
  34.           
  35.         private  function handleMOUSE(event:MouseEvent):void {  
  36.             switch(event.type) {  
  37.                 case MouseEvent.MOUSE_DOWN:  
  38.                     a.setRegistrationByStage(mouseX, mouseY);  
  39.                     trace(a.regX,a.regY);  
  40.                     trace(a.stageRegX, a.stageRegY);  
  41.                     trace(t.globalToLocal(new Point(mouseX,0)).x,t.globalToLocal(new Point(0,mouseY)).y);  
  42.                     c.x = mouseX;  
  43.                     c.y = mouseY  
  44.                     removeEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  45.                     addEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  46.                     addEventListener(MouseEvent.MOUSE_UP, handleMOUSE);  
  47.                 break;  
  48.                 case MouseEvent.MOUSE_MOVE:  
  49.                     trace(t.mouseX - a.regX, t.mouseY - a.regY);  
  50.                     a.rotationByRefer += 5;  
  51.                     //a.scaleXByRefer += 5;  
  52.                 break;  
  53.                 case MouseEvent.MOUSE_UP:     
  54.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  55.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  56.                 break;  
  57.                 default:  
  58.                     addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);  
  59.                     removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);  
  60.             }  
  61.         }  
  62.     }  
  63. }  
  64. import flash.display.Shape;  
  65.  
  66. class CrossHairs extends Shape {  
  67.     public function CrossHairs() {  
  68.         graphics.lineStyle(1,0);  
  69.         graphics.moveTo( -10, 0);  
  70.         graphics.lineTo( 10, 0);  
  71.         graphics.moveTo( 0, -10);  
  72.         graphics.lineTo( 0, 10);  
  73.     }  

SWF: 

点击下载此文件

1 / 11 / 44 | « 1 2 3 4 » |

Theme by Dark Wish, Powered by Roclog v3.1.4 Final SP1

Copyright © 2007 X-Intend[超级打算]. All rights reserved.

滇ICP备05000389号