0

我真的是 flash 和 as3 的新手...我正在尝试在 flash 中创建 2 个场景 - 一个是我的影片剪辑在靠近鼠标时从鼠标移开,另一个是影片剪辑被鼠标吸引. 我在 actionscript 2 上找到了答案,但我不能在我的 as3 文件中使用它……有什么帮助或想法吗?干杯!

4

1 回答 1

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 属性的值,我们可以从显示对象的和属性中减去或添加点的和x属性。yxy

于 2012-11-18T22:55:47.760 回答