我真的是 flash 和 as3 的新手...我正在尝试在 flash 中创建 2 个场景 - 一个是我的影片剪辑在靠近鼠标时从鼠标移开,另一个是影片剪辑被鼠标吸引. 我在 actionscript 2 上找到了答案,但我不能在我的 as3 文件中使用它……有什么帮助或想法吗?干杯!
1 回答
这是我制作的一个示例,显示对象相对于鼠标的位置被“推”和“拉”。
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_FRAME
和MouseEvent.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_FRAME
和MouseEvent.MOUSE_UP
事件侦听器将从阶段中删除。然后根据属性的值,它的值在和_force
之间交替。PUSH
PULL
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
属性。y
x
y