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

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

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

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

 相关类:

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 / 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号