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