Movieclip吸引力/排斥鼠标

时间:2012-11-18 17:28:32

标签: actionscript-3

我对flash和as3真的很陌生...... 我试图在闪光灯中创建2个场景 - 一个是我的影片剪辑在靠近它时移动远离鼠标的场景,另一个是影片剪辑被鼠标吸引的地方。我在动作脚本2上找到了答案,但我不能在我的as3文件中使用它... 任何帮助或想法? 干杯!

1 个答案:

答案 0 :(得分:2)

以下是我对显示对象相对于鼠标位置进行“推”和“拉”的示例。

Main.as(文档类):

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    public class Main extends Sprite  
    {

        public static var PULL:String = "pull";
        public static var PUSH:String = "push";

        private var _circle:Circle;
        private var _force:String;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _circle = new Circle();
            addChild(_circle);

            _force = PULL;

            stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);

        }// end function

        private function onStageMouseDown(e:MouseEvent):void 
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
            stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame);

        }// end function

        private function onStageMouseUp(e:MouseEvent):void 
        {
            stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
            stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame);

            _force = (_force == PULL) ? PUSH : PULL;

        }// end function

        private function onStageEnterFrame(e:Event):void 
        {
            var point1:Point = new Point(_circle.x, _circle.y);
            var point2:Point = new Point(stage.mouseX, stage.mouseY);
            var point3:Point = point2.subtract(point1);
            point3.normalize(10);

            if (_force == PULL) {

                _circle.x += point3.x;
                _circle.y += point3.y;

            } else if (_force == PUSH) {

                _circle.x -= point3.x;
                _circle.y -= point3.y;

            }// end else if

        }// end function

    }// end class

}// end package

import flash.display.Sprite;
import flash.events.Event;

class Circle extends Sprite {

    public function Circle() {

        draw();

    }// end function

    private function draw():void {

        this.graphics.lineStyle(1);
        this.graphics.beginFill(0xFFFFFF);
        this.graphics.drawCircle( 0, 0, 20);
        this.graphics.endFill();

    }// end function

}// end class

init()方法中,我们向舞台添加了一个新的显示对象,这是我们将相对于鼠标位置“拉”和“推”的显示对象。

_circle = new Circle();
addChild(_circle);

然后我们将_force属性设置为PULL常量。 _force属性将确定显示对象是“拉”还是“推”。

_force = PULL;

接下来,我们将鼠标事件监听器添加到舞台上。在MouseEvent.MOUSE_DOWN我们调用onStageMouseDown()事件处理程序。调用处理程序时,我们会向舞台添加Event.ENTER_FRAMEMouseEvent.MOUSE_UP事件侦听器。

private function onStageMouseDown(e:MouseEvent):void 
{
    stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
    stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame);

}// end function

调用MouseEvent.MOUSE_UP事件处理程序时,将从舞台中删除以前的Event.ENTER_FRAMEMouseEvent.MOUSE_UP事件侦听器。然后,根据_force属性的值,其值在PUSHPULL之间交替显示。

private function onStageMouseUp(e:MouseEvent):void 
{
    stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
    stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame);

    _force = (_force == PULL) ? PUSH : PULL;

}// end function

最后,onStageEnterFrame事件处理程序。这是我们计算显示对象相对于鼠标的新位置的地方。

有不同的方法可以解决这个问题,但我决定使用Point类来简化操作。首先,我们必须获得显示对象位置的Point对象和鼠标位置的另一个Point对象。

var point1:Point = new Point(_circle.x, _circle.y);
var point2:Point = new Point(stage.mouseX, stage.mouseY);

接下来,我们必须使用Point对象的subtract()方法获得点之间的差异。

var point3:Point = point2.subtract(point1);

有了这个新观点,我们可以使用Point对象的normalize()方法将显示对象位置和鼠标位置之间的线段缩放到设定长度。

point3.normalize(10);

最后,根据_force属性的值,我们会从显示对象的xy属性中减去或添加点的xy属性。

相关问题