zoukankan      html  css  js  c++  java
  • TransformTool 的使用

    import flash.display.Shape;
    import com.senocular.display.TransformTool;

    // default tool
    var defaultTool:TransformTool 
    = new TransformTool();
    addChild(defaultTool);

    // custom tool with some custom options
    var customTool:TransformTool 
    = new TransformTool();
    addChild(customTool);

    customTool.raiseNewTargets 
    = false;
    customTool.moveNewTargets 
    = true;
    customTool.moveUnderObjects 
    = false;

    customTool.registrationEnabled 
    = false;
    customTool.rememberRegistration 
    = false;

    customTool.rotationEnabled 
    = false;
    customTool.constrainRotation 
    = true;
    customTool.constrainRotationAngle 
    = 90/4;

    customTool.constrainScale 
    = true;
    customTool.maxScaleX 
    = 2;
    customTool.maxScaleY 
    = 2;

    customTool.skewEnabled 
    = false;

    customTool.setSkin(TransformTool.SCALE_TOP_LEFT, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_TOP_RIGHT, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_BOTTOM_RIGHT, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_BOTTOM_LEFT, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_TOP, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_RIGHT, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_BOTTOM, 
    new ScaleCircle());
    customTool.setSkin(TransformTool.SCALE_LEFT, 
    new ScaleCircle());

    customTool.addControl(
    new CustomRotationControl());
    customTool.addControl(
    new CustomResetControl());

    // keep track of the current tool being used
    var currTool:TransformTool 
    = defaultTool;

    // selecting objects on the screen
    function select(event){
        
    if (event.target is Stage) {
            currTool.target 
    = null;
        }
    else if (event.target is Sprite) {
            currTool.target 
    = event.target as Sprite;
            toolInit();
        }
    }

    // changing tools using the toolChange button
    function setTool(event:MouseEvent):void {
        
        
    // get other tool
        var newTool:TransformTool 
    = (currTool == defaultTool) ? customTool : defaultTool;
        
        
    // make sure moveNewTargets is not set when setting tool this way
        var moveTargets:
    Boolean = newTool.moveNewTargets;
        newTool.moveNewTargets 
    = false;
        newTool.target 
    = currTool.target;
        newTool.moveNewTargets 
    = moveTargets;
        
        
    // unset currTool
        currTool.target 
    = null;
        currTool 
    = newTool;
        
        toolInit();
    }

    // for setting a new tool
    function toolInit():void {
        
    // raise
        currTool.parent.setChildIndex(currTool, currTool.parent.numChildren 
    - 1);
        
        
    // center registration for customTool
        
    if (currTool == customTool) {
            currTool.registration 
    = currTool.boundsCenter;
        }
    }

    // event handlers for selecting objects and changing tools
    stage.addEventListener(MouseEvent.MOUSE_DOWN, 
    select);
    toolChange.addEventListener(MouseEvent.CLICK, setTool);

    fla上代码

    下面是两个同目录下类:

    package {
        
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        
        import com.senocular.display.TransformTool;
        import com.senocular.display.TransformToolControl;
        import com.senocular.display.TransformToolCursor;
        
        
    public class CustomResetControl extends TransformToolControl {
            
            
    public function CustomResetControl() {
                addEventListener(TransformTool.CONTROL_INIT, init, 
    false0true);
            }
            
            
    private function init(event:Event):void {
                
                
    // add event listeners 
                transformTool.addEventListener(TransformTool.NEW_TARGET, update, 
    false0true);
                transformTool.addEventListener(TransformTool.TRANSFORM_TOOL, update, 
    false0true);
                transformTool.addEventListener(TransformTool.CONTROL_TRANSFORM_TOOL, update, 
    false0true);
                addEventListener(MouseEvent.CLICK, resetClick);
                
                
    // initial positioning
                update();
            }
            
            
    private function update(event:Event = null):void {
                
    if (transformTool.target) {
                    
    // find to bottom right of selection
                    var maxX:Number 
    = Math.max(transformTool.boundsTopLeft.x, transformTool.boundsTopRight.x);
                    maxX 
    = Math.max(maxX, transformTool.boundsBottomRight.x);
                    maxX 
    = Math.max(maxX, transformTool.boundsBottomLeft.x);
                    
                    var maxY:Number 
    = Math.max(transformTool.boundsTopLeft.y, transformTool.boundsTopRight.y);
                    maxY 
    = Math.max(maxY, transformTool.boundsBottomRight.y);
                    maxY 
    = Math.max(maxY, transformTool.boundsBottomLeft.y);
                    
                    
    // set location to found values
                    x 
    = maxX;
                    y 
    = maxY;
                }
            }
            
            
    private function resetClick(event:MouseEvent):void {
                
                
    // reset the matrix but keep the current location by 
                
    // noting the change in the registration point
                var origReg:Point 
    = transformTool.registration;
                
                
    // global matrix as a default matrix (identity)
                transformTool.globalMatrix 
    = new Matrix();
                
                
    // find change in positioning based on registration
                
    // Note: registration location is based within
                
    // the coordinate space of the tool (not global)
                var regDiff 
    = origReg.subtract(transformTool.registration);
                
                
    // update the tool matrix with the change in position
                
    // offsetting movement from the new matrix to have
                
    // the old and new registration points match
                var toolMatrix:Matrix 
    = transformTool.toolMatrix;
                toolMatrix.tx 
    += regDiff.x;
                toolMatrix.ty 
    += regDiff.y;
                transformTool.toolMatrix 
    = toolMatrix;
                
                
    // apply the new matrix to the target
                transformTool.apply();
            }
        }
    }

    package {
        
        import flash.events.Event;
        import flash.geom.Matrix;
        import flash.geom.Point;
        
        import com.senocular.display.TransformTool;
        import com.senocular.display.TransformToolControl;
        import com.senocular.display.TransformToolCursor;
        
        
    public class CustomRotationControl extends TransformToolControl {
            
            
    private var length:Number = 20;
            
    private var circle:ScaleCircle;
            
            
    public function CustomRotationControl() {
                addEventListener(TransformTool.CONTROL_INIT, init, 
    false0true);
                circle 
    = new ScaleCircle();
                addChild(circle);
            }
            
            
    private function init(event:Event):void {
                
                
    // add event listeners 
                transformTool.addEventListener(TransformTool.NEW_TARGET, update, 
    false0true);
                transformTool.addEventListener(TransformTool.TRANSFORM_TOOL, update, 
    false0true);
                transformTool.addEventListener(TransformTool.CONTROL_TRANSFORM_TOOL, update, 
    false0true);
                transformTool.addEventListener(TransformTool.CONTROL_DOWN, controlMouseDown, 
    false0true);
                transformTool.addEventListener(TransformTool.CONTROL_MOVE, controlMove, 
    false0true);
                
                
    // set this as a reference for the rotation cursor
                var cursor:TransformToolCursor 
    = transformTool.rotationCursor;
                cursor.addReference(this);
                
                
    // initial positioning
                update();
            }
            
            
    private function update(event:Event = null):void {
                
    if (transformTool.target) {
                    
                    
    // move circle to point
                    var top:Point 
    = transformTool.boundsTop;
                    var bottom:Point 
    = transformTool.boundsBottom;
                    var diff 
    = top.subtract(bottom);
                    var angle 
    = Math.atan2(diff.y, diff.x);
                    circle.x 
    = top.x + length * Math.cos(angle);
                    circle.y 
    = top.y + length * Math.sin(angle);
                    
                    
    // draw connecting line
                    graphics.clear();
                    graphics.lineStyle(
    0,0);
                    
    // draw from top of top ScaleCircle
                    var offset:Number 
    = circle.height/2;
                    graphics.moveTo(top.x 
    + offset * Math.cos(angle), top.y + offset * Math.sin(angle));
                    graphics.lineTo(circle.x, circle.y);
                }
            }
            
            
    private function controlMouseDown(event:Event):void {
                
    if (transformTool.currentControl == this) {
                    
    // if this tool is being clicked, set
                    
    // the reference point to be the mouse location
                    _referencePoint 
    = transformTool.mouse;
                }
            }
            
            
    private function controlMove(event:Event):void {
                
    if (transformTool.currentControl == this) {
                    
    // use default tool rotation if this tool is being used
                    transformTool.rotationInteraction();
                }
            }
        }
    }

    效果:

    另外有一个test
    fla如下:

    import com.senocular.display.TransformTool;
    var currTool:TransformTool 
    = new TransformTool();
    addChild(currTool);
    currTool.target 
    = a;
    stage.addEventListener(MouseEvent.MOUSE_DOWN, 
    select);
    function select(event) {
        
    if (event.target is Stage) {
            currTool.target 
    = null;
        } 
    else if (event.target is Sprite) {
            currTool.target 
    = event.target as Sprite;
    //        toolInit();
        }
    }

  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/ddw1997/p/1579933.html
Copyright © 2011-2022 走看看