相关类:
P.S:这个应用类我就改了下,现实中我是将这个类给做成了Proxy来代替现有的Display以及子类。
- package com.xintend.util {
- import flash.display.DisplayObject;
- import flash.display.Sprite;
- import flash.geom.Point;
- /**
- * [AS3]DynamicRegistrationDisplayObject
- * 动态注册点
- * @author telds[kingfo] www.xintend.com
- *
- * 一级参考:
- * 作者: Darronschall [ActionScript 2]
- * 站点: http://www.darronschall.com/weblog/archives/000054.cfm
- *
- * 二级参考:
- * 作者: Robert Penner [ActionScript 1]
- * 站点: www.robertpenner.com
- */
- public class DynamicRegistrationDisplayObject{
- public function get displayObject():DisplayObject { return _displayObject; }
- public function get depth():Number { return _depth; }
- public function set depth(value:Number):void {
- _depth = value;
- }
- public function get label():String { return _label; }
- public function set label(value:String):void {
- _label = value;
- }
- public function get stageRegX():Number { return _stageRegX; }
- public function get stageRegY():Number { return _stageRegY; }
- public function get centerX():Number { return _displayObject.x + _displayObject.width / 2; }
- public function set centerX(value:Number):void {
- _displayObject.x = value - _displayObject.width / 2;
- }
- public function get centerY():Number { return _displayObject.y + _displayObject.height / 2; }
- public function set centerY(value:Number):void {
- _displayObject.y = value - _displayObject.height / 2;
- }
- public function get regX():Number { return _regX; }
- public function get regY():Number { return _regY; }
- public function DynamicRegistrationDisplayObject():void {
- initializtion();
- }
- public function setRegistrationByStage(stageX:Number, stageY:Number):void {
- _stageRegX = stageX;
- _stageRegY = stageY;
- var p:Point = _displayObject.globalToLocal(new Point(stageX,stageY));
- _regX = p.x;
- _regY = p.y;
- }
- public function setRegistrationBySelf(selfX:Number, selfY:Number):void {
- var p:Point = _displayObject.localToGlobal(new Point(selfX,selfY));
- _stageRegX = p.x;
- _stageRegY = p.y;
- _regX = selfX;
- _regY = selfY;
- }
- public function get rotationByRefer():Number { return _displayObject.rotation }
- public function set rotationByRefer(value:Number):void {
- setPropRel("rotation", value);
- }
- public function get scaleXByRefer():Number { return _displayObject.scaleX }
- public function set scaleXByRefer(value:Number):void {
- setPropRel("scaleX", value);
- }
- public function get scaleYByRefer():Number { return _displayObject.scaleY }
- public function set scaleYByRefer(value:Number):void {
- setPropRel("scaleY", value);
- }
- public function initializtion(displayObject:DisplayObject=null):void {
- //throw new Error("AbstractTile is an Abstract Class");
- _displayObject = displayObject || new Sprite();
- }
- protected function setPropRel(property:String, value:Number):void {
- var p:Point = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- _displayObject[property] = value;
- var pp:Point = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- _displayObject.x -= pp.x - p.x;
- _displayObject.y -= pp.y - p.y;
- }
- private var _depth:Number;
- private var _label:String;
- private var _regX:Number = 0;
- private var _regY:Number = 0;
- private var _stageRegX:Number = 0;
- private var _stageRegY:Number = 0;
- private var _displayObject:DisplayObject;
- }
- }
应用代码:
- package {
- import com.xintend.util.DynamicRegistrationDisplayObject;
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- import flash.geom.Point;
- /**
- * [AS3]DynamicRegistrationDisplayObjectTest
- * 动态注册点测试
- * @author telds[kingfo] www.xintend.com
- */
- public class DynamicRegistrationDisplayObjectTest extends Sprite {
- private var a:DynamicRegistrationDisplayObject= new DynamicRegistrationDisplayObject();
- private var t:Sprite = new Sprite();
- private var c:CrossHairs = new CrossHairs();
- public function DynamicRegistrationDisplayObjectTest():void {
- t.graphics.beginFill(0xFF0000);
- t.graphics.drawRect(0, 0, 80, 40);
- t.graphics.endFill();
- c.x = t.x = stage.stageWidth / 2- t.width/2;
- c.y = t.y = stage.stageHeight / 2 - t.height/2;
- t.buttonMode = true;
- t.useHandCursor = true;
- t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);
- a.initializtion(t);
- addChild(t);
- addChild(c);
- }
- private function handleMOUSE(event:MouseEvent):void {
- switch(event.type) {
- case MouseEvent.MOUSE_DOWN:
- a.setRegistrationByStage(mouseX, mouseY);
- trace(a.regX,a.regY);
- trace(a.stageRegX, a.stageRegY);
- trace(t.globalToLocal(new Point(mouseX,0)).x,t.globalToLocal(new Point(0,mouseY)).y);
- c.x = mouseX;
- c.y = mouseY
- removeEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- addEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- addEventListener(MouseEvent.MOUSE_UP, handleMOUSE);
- break;
- case MouseEvent.MOUSE_MOVE:
- trace(t.mouseX - a.regX, t.mouseY - a.regY);
- a.rotationByRefer += 5;
- //a.scaleXByRefer += 5;
- break;
- case MouseEvent.MOUSE_UP:
- addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- break;
- default:
- addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- }
- }
- }
- }
- import flash.display.Shape;
- class CrossHairs extends Shape {
- public function CrossHairs() {
- graphics.lineStyle(1,0);
- graphics.moveTo( -10, 0);
- graphics.lineTo( 10, 0);
- graphics.moveTo( 0, -10);
- graphics.lineTo( 0, 10);
- }
- }
SWF:
点击下载此文件