代码之家  ›  专栏  ›  技术社区  ›  redconservatory

开始拖动-停止对角线移动

  •  1
  • redconservatory  · 技术社区  · 15 年前

    有没有一种方法可以让一部动画片的开头是黑色的,但只能强迫水平和垂直(即不是对角线)的移动?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Boyd    15 年前

    这是我的解决办法。它跟踪mouseX和mouse-on-click并将其与上一个位置进行比较。找出鼠标主要移动的方向,然后将对象移动到那里。您可能需要添加一些额外的逻辑来将对象锁定到最接近的10个单位,或者您希望形成捕捉网格的任何单位大小,以便在游戏或对象的有组织放置中使用。

    更新:我继续添加了一个snapNearest函数来帮助控制移动。

    import flash.events.MouseEvent;
    import flash.events.Event;
    
    dragObj.addEventListener(MouseEvent.MOUSE_DOWN, dragIt);
    
    var curX:Number = 0;
    var curY:Number = 0;
    var oldX:Number = 0;
    var oldY:Number = 0;
    var gridUnit:Number = 25;
    
    function dragIt(e:MouseEvent):void
    {
        // set x,y on down
        oldX = mouseX;
        oldY = mouseY;
    
        // add mouse up listener so you know when it is released
        stage.addEventListener(MouseEvent.MOUSE_UP, dropIt);
        stage.addEventListener(Event.ENTER_FRAME, moveIt);
    
        trace("Start Drag")
    }
    
    function moveIt(e:Event):void
    {
    
        // figure out what the main drag direction is and move the object.
    
        curX = mouseX;
        curY = mouseY;
    
        // figure out which is the larger number and subtract the smaller to get diff
        var xDiff:Number = curX > oldX ? curX - oldX : oldX - curX;
        var yDiff:Number = curY > oldY ? curY - oldY : oldY - curY;
    
        if(xDiff > yDiff) {
            dragObj.x = snapNearest(mouseX, gridUnit);
        }else{
            dragObj.y = snapNearest(mouseY, gridUnit);
        }
    
        oldX = mouseX;
        oldY = mouseY;
    }
    
    function dropIt(e:MouseEvent):void
    {
    
        //remove mouse up event
        stage.removeEventListener(MouseEvent.MOUSE_UP, dropIt);
        stage.removeEventListener(Event.ENTER_FRAME, moveIt);
    
        trace("Stop Drag")
    
    }
    
    
    // snap to grid
    function snapNearest(n:Number, units:Number):Number
    {
    
        var num:Number = n/units ;
        num = Math.round(num);
        num *= units;
    
        return num;
    
    }
    
        2
  •  4
  •   Chunky Chunk    15 年前

    对。有几个选择。

    A。 您可以选择使用startDrag()函数,并为可拖动对象的第二个参数提供一个边界矩形。类似的东西;

    dragSprite.startDrag(false, new Rectangle(0, 0, 20, stage.stageHeight));
    

    乙。 您可以将可拖动对象设置为侦听鼠标事件,并根据鼠标移动来移动它。类似于:

    dragSprite.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
    
    function mouseDownEventHandler(evt:MouseEvent):void
     {
     stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
     stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
     }
    
    function mouseMoveEventHandler(evt:MouseEvent):void
     {
     //only move dragSprite horizontally
     //dragSprite.y = evt.stageY;
     dragSprite.x = evt.stageX;
     }
    
    function mouseUpEventHandler(evt:MouseEvent):void
     {
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
     stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
     }
    
        3
  •  2
  •   PatrickS    15 年前

    可以使用修饰符键,例如,正常行为是水平的,按shift键可以垂直移动。

        function mouseMoveEventHandler(evt:MouseEvent):void
        {
            if(!evt.shiftKey)
               dragSprite.x = evt.stageX;
            else
               dragSprite.y = evt.stageY;           
        }
    
        4
  •  1
  •   ocodo    15 年前

    您只能约束到一个轴或另一个轴(使用约束矩形),但是对角线移动在您提出的方法中是可能的,除非您还定义了其他限制。例如网格。