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

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

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

订阅: 订阅 [原]动态注册点显示对象 AS3实现---Proxy方法 的评论
引用: 点这里获取引用地址 (UTF-8)
上一篇 < [原]动态注册点显示对象 AS3实现---Proxy方法 > 下一篇

由于之前的

动态注册点显示对象 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.     }  

 

1 / 0 / 0 | « 1 » |
1 / 0 / 0 | « 1 » |
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)

Theme by Yofox, Powered by Roclog v3.2.0

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

滇ICP备05000389号