| 订阅 XIntend |
| 访问此论坛 |
网络上都早有了此方法的描述,但是描述的并不太在正确
网络的描述是这样的:
- addFrameScript(frame:unit,notify:Function):void;
相信很多人都尝试过以下输出公共方法的函数
- describeType();
所以通过解析可以明显的看出来是类似:
- addFrameScript(...args):void;
可以理解成为:
- addFrameScript(frame:Object, notify:Function):void;
实际上我的猜测是
- //伪码
- function addFrameScript(..args):void{
- var i:int=0;
- var frame:Object
- var notify::Function
- for(;i<args.length;i+=2){
- frame=args[i];
- notify=args[i+1];
- //TODO:
- }
- }
用法:
- addFrameScript("frameLabel",func);
- //或
- addFrameScript(1,func);
由于之前的
源码:
- package com.xintend.util {
- import flash.display.DisplayObject;
- import flash.display.Sprite;
- import flash.geom.Point;
- import flash.utils.Proxy;
- import flash.utils.flash_proxy;
- /**
- * [AS3]DynamicRegistrationProxy
- * 动态注册点代理 引用请保留此处信息及参考信息
- * @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 dynamic class DynamicRegistrationProxy extends Proxy {
- public function DynamicRegistrationProxy(source:DisplayObject=null):void {
- _displayObject = source || new Sprite();
- }
- override flash_proxy function callProperty(methodName:*, ... args):* {
- var res:*;
- var a:Point;
- var b:Point;
- var method:String = methodName.toString();
- var property:String;
- switch (method) {
- case 'setRegistrationByStage':
- a = _displayObject.globalToLocal(new Point(args[0], args[1]));
- _stageRegX = args[0];
- _stageRegY = args[1];
- _regX = a.x;
- _regY = a.y;
- break;
- case 'setRegistrationBySelf':
- a = _displayObject.localToGlobal(new Point(args[0], args[1]));
- _regX = args[0];
- _regY = args[1];
- _stageRegX = a.x;
- _stageRegY = a.y;
- break;
- case 'setPropRel':
- a = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- property = args[0].toString();
- _displayObject[property] = args[1];
- b = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- _displayObject.x -= b.x - a.x;
- _displayObject.y -= b.y - a.y;
- break;
- default:
- res = _displayObject[method].apply(_displayObject, args);
- break;
- }
- return res;
- }
- override flash_proxy function getProperty(name:*):* {
- var res:*;
- var property:String = name.toString();
- switch (property) {
- case 'regX':
- res = _regX;
- break;
- case 'regY':
- res = _regY;
- break;
- case 'stageRegX':
- res = _stageRegX;
- break;
- case 'stageRegY':
- res = _stageRegY;
- break;
- case 'x2':
- res = _x2;
- break;
- case 'y2':
- res = _y2;
- break;
- case 'scaleX2':
- res = _displayObject.scaleX;
- break;
- case 'scaleY2':
- res = _displayObject.scaleY;
- break;
- case 'rotation2':
- res = _displayObject.rotation
- break;
- case 'source':
- res = _displayObject;
- break;
- default:
- res = _displayObject[property];
- break;
- }
- return res;
- }
- override flash_proxy function setProperty(name:*, value:*):void {
- var property:String = name.toString();
- switch (property) {
- case 'regX':
- _regX = value;
- break;
- case 'regY':
- _regY = value;
- break;
- case 'stageRegX':
- _stageRegX = value;
- break;
- case 'stageRegY':
- _stageRegY = value;
- break;
- case 'x2':
- _x2 += value - _displayObject.x;
- break;
- case 'y2':
- _y2 += value - _displayObject.y;
- break;
- case 'scaleX2':
- flash_proxy::callProperty('setPropRel',"scaleX", value);
- break;
- case 'scaleY2':
- flash_proxy::callProperty('setPropRel',"scaleY", value);
- break;
- case 'rotation2':
- flash_proxy::callProperty('setPropRel',"rotation", value);
- break;
- default:
- _displayObject[property] = value;
- break;
- }
- }
- private var _displayObject:DisplayObject;
- private var _regX:Number = 0;
- private var _regY:Number = 0;
- private var _stageRegX:Number = 0;
- private var _stageRegY:Number = 0;
- private var _x2:Number = 0;
- private var _y2:Number = 0;
- }
- }
示例源码:
- package {
- import com.xintend.util.DynamicRegistrationProxy;
- import flash.display.Bitmap;
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- import flash.geom.Point;
- public class Main extends Sprite {
- private var a:DynamicRegistrationProxy;
- private var t:Sprite = new Sprite();
- private var c:CrossHairs = new CrossHairs();
- [Embed(source = '../bin/123.jpg')]private var imge:Class;
- private var b:Bitmap
- public function Main():void {
- b=new imge() as Bitmap
- //t.graphics.beginFill(0xFF0000);
- //t.graphics.drawRect(0, 0, 80, 40);
- //t.graphics.endFill();
- //t.buttonMode = true;
- //t.useHandCursor = true;
- t.addChild(b);
- c.x = t.x = stage.stageWidth / 2- t.width/2;
- c.y = t.y = stage.stageHeight / 2 - t.height/2;
- t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);
- t.addEventListener(MouseEvent.MOUSE_WHEEL, handleMOUSE);
- a = new DynamicRegistrationProxy(t);
- addChild(t);
- addChild(c);
- }
- private function handleMOUSE(event:MouseEvent):void {
- switch(event.type) {
- case MouseEvent.MOUSE_DOWN:
- a.setRegistrationByStage(mouseX, mouseY);
- //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.rotation2 += 5;
- //a.scaleXByRefer += 5;
- break;
- case MouseEvent.MOUSE_UP:
- addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- break;
- case MouseEvent.MOUSE_WHEEL:
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- c.x = mouseX;
- c.y = mouseY
- a.setRegistrationByStage(mouseX, mouseY);
- a.scaleX2 += event.delta * 0.1;
- a.scaleY2 += event.delta * 0.1;
- 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(2,0xFF0000);
- graphics.moveTo( -10, 0);
- graphics.lineTo( 10, 0);
- graphics.moveTo( 0, -10);
- graphics.lineTo( 0, 10);
- }
- }
相关类:
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:
点击下载此文件
Theme by Dark Wish, Powered by Roclog v3.1.4 Final SP1
Copyright © 2007 X-Intend[超级打算]. All rights reserved.