Actionscript 3 震动效果-Flash CS6 ActionScript3.0
这个问题与ActionScript 3.0和Flash CS6有关 我试着让一个物体在一定的时间内抖动几秒钟。我制作了一个“movieclip”,并制作了以下代码:Actionscript 3 震动效果-Flash CS6 ActionScript3.0,actionscript-3,flash-cs6,Actionscript 3,Flash Cs6,这个问题与ActionScript 3.0和Flash CS6有关 我试着让一个物体在一定的时间内抖动几秒钟。我制作了一个“movieclip”,并制作了以下代码: import flash.events.TimerEvent; var Machine_mc:Array = new Array(); var fl_machineshaking:Timer = new Timer(1000, 10); fl_machineshaking.addEventListener (TimerEvent
import flash.events.TimerEvent;
var Machine_mc:Array = new Array();
var fl_machineshaking:Timer = new Timer(1000, 10);
fl_machineshaking.addEventListener (TimerEvent.TIMER, fl_shakemachine);
fl_machineshaking.start ();
function fl_shakemachine (event:TimerEvent):void {
for (var i = 0; i < 20; i++) {
Machine.x += Math.random() * 6 - 4;
Machine.y += Math.random() * 6 - 4;
}
}
此外,物体不会抖动,但它会在每一个滴答声中稳定地向左移动一点
切中要害:
我想知道,当对象不再出现在舞台/场景中后,我如何停止脚本,以及如何使其抖动,因为我看不出我的脚本有什么问题,请帮助,谢谢你^ ^ ^ ^-4你必须记住原始的开始位置,并从该点计算抖动效果。这是我对电影嘴唇的震动效果。它动态地向其中添加3个变量(startPosition、shakeTime、maxShakeAmount)。如果使用类,则会将它们添加到剪辑中
import flash.display.MovieClip;
import flash.geom.Point;
function shake(mc:MovieClip, frames:int = 10, maxShakeAmount:int = 30) : void
{
if (!mc._shakeTime || mc._shakeTime <= 0)
{
mc.startPosition = new Point(mc.x, mc.y);
mc._shakeTime = frames;
mc._maxShakeAmount = maxShakeAmount;
mc.addEventListener(Event.ENTER_FRAME, handleShakeEnterFrame);
}
else
{
mc.startPosition = new Point(mc.x, mc.y);
mc._shakeTime += frames;
mc._maxShakeAmount = maxShakeAmount;
}
}
function handleShakeEnterFrame(event:Event):void
{
var mc:MovieClip = MovieClip(event.currentTarget);
var shakeAmount:Number = Math.min(mc._maxShakeAmount, mc._shakeTime);
mc.x = mc.startPosition.x + (-shakeAmount / 2 + Math.random() * shakeAmount);
mc.y = mc.startPosition.y + (-shakeAmount / 2 + Math.random() * shakeAmount);
mc._shakeTime--;
if (mc._shakeTime <= 0)
{
mc._shakeTime = 0;
mc.removeEventListener(Event.ENTER_FRAME, handleShakeEnterFrame);
}
}
顺便说一句:在Flash中,您应该在“发布设置”中启用“允许调试”,以获得更详细的错误。这还会返回代码中断的行号
更新:
现在编码,时间/最大距离分开。AStupidNube提出了一个关于原始位置的重要观点。所以,加上摇晃,应该是一个来回的运动,所以不要依赖于随机值,可能会或可能不会得到你想要的。随着时间的推移,震动也会产生减震效果,因此请尝试以下方法:
for each (var currentMachine:MovieClip in Machine_mc)
{
currentMachine.x += Math.random() * 6 - 3;
currentMachine.y += Math.random() * 6 - 3;
}
// shake for 100 frames, with max distance of 15px
this.shake(myMc, 100, 15);
链接到工作代码
•-事件。基于帧输入
•-基于定时器
•-事件。以额外的随机性输入_帧
**1至20项基于定时器的代码-请参见上面的链接以获取输入帧代码
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.text.TextField;
import flash.utils.Timer;
public class testing extends Sprite {
private var shakeButton:Sprite;
private var graphic:Sprite;
private var shakerPos:Array;
private var shakers:Array;
private var numShakers:int = 20;
private var dir:int = 1;
private var displacement:Number = 10;
private var shakeTimer:Timer;
public function testing() {
this.shakers = new Array();
this.shakerPos = new Array();
this.addEventListener(Event.ADDED_TO_STAGE, this.init);
}
private function init(e:Event):void {
this.stage.frameRate = 30;
this.shakeTimer = new Timer(33, 20);
this.shakeTimer.addEventListener(TimerEvent.TIMER, this.shake);
this.graphics.beginFill(0x333333);
this.graphics.drawRect(0,0,this.stage.stageWidth, this.stage.stageHeight);
this.graphics.endFill();
this.createShakers();
this.shakeButton = this.createSpriteButton("Shake ");
this.addChild(this.shakeButton);
this.shakeButton.x = 10;
this.shakeButton.y = 10;
this.shakeButton.addEventListener(MouseEvent.CLICK, this.shakeCallback);
}
private function createSpriteButton(btnName:String):Sprite {
var sBtn:Sprite = new Sprite();
sBtn.name = btnName;
sBtn.graphics.beginFill(0xFFFFFF);
sBtn.graphics.drawRoundRect(0,0,80,20,5);
var sBtnTF:TextField = new TextField();
sBtn.addChild(sBtnTF);
sBtnTF.text = btnName;
sBtnTF.x = 5;
sBtnTF.y = 3;
sBtnTF.selectable = false;
sBtn.alpha = .5;
sBtn.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void { sBtn.alpha = 1 });
sBtn.addEventListener(MouseEvent.MOUSE_OUT, function(e:Event):void { sBtn.alpha = .5 });
return sBtn;
}
private function createShakers():void {
var graphic:Sprite;
for(var i:int = 0;i < this.numShakers;i++) {
graphic = new Sprite();
this.addChild(graphic);
graphic.graphics.beginFill(0xFFFFFF);
graphic.graphics.drawRect(0,0,10,10);
graphic.graphics.endFill();
// add a 30 pixel margin for the graphic
graphic.x = (this.stage.stageWidth-60)*Math.random()+30;
graphic.y = (this.stage.stageWidth-60)*Math.random()+30;
this.shakers[i] = graphic;
this.shakerPos[i] = new Point(graphic.x, graphic.y);
}
}
private function shakeCallback(e:Event):void {
this.shakeTimer.reset();
this.shakeTimer.start();
}
private function shake(e:TimerEvent):void {
this.dir *= -1;
var dampening:Number = (20 - e.target.currentCount)/20;
for(var i:int = 0;i < this.numShakers;i++) {
this.shakers[i].x = this.shakerPos[i].x + Math.random()*10*dir*dampening;
this.shakers[i].y = this.shakerPos[i].y + Math.random()*10*dir*dampening;
}
}
}
包{
导入flash.display.Sprite;
导入flash.events.Event;
导入flash.events.MouseEvent;
导入flash.events.TimerEvent;
导入flash.geom.Point;
导入flash.text.TextField;
导入flash.utils.Timer;
公共类测试扩展了Sprite{
私人按钮:雪碧;
私人var图形:精灵;
专用RPO:阵列;
专用变量发生器:数组;
私有变量numShakers:int=20;
私有变量dir:int=1;
私人var位移:数字=10;
专用定时器:定时器;
公共功能测试(){
this.shakers=新数组();
this.shakerPos=新数组();
this.addEventListener(Event.ADDED_到_阶段,this.init);
}
私有函数init(e:事件):void{
this.stage.frameRate=30;
this.shakeTimer=新定时器(33,20);
this.shakeTimer.addEventListener(TimerEvent.TIMER,this.shake);
this.graphics.beginll(0x333333);
this.graphics.drawRect(0,0,this.stage.stageWidth,this.stage.stageHeight);
this.graphics.endFill();
这个.createShakers();
this.shakeButton=this.createSpriteButton(“Shake”);
this.addChild(this.shakeButton);
这个.shakeButton.x=10;
这个.shakeButton.y=10;
this.shakeButton.addEventListener(MouseEvent.CLICK,this.shakeCallback);
}
私有函数createSpriteButton(btnName:String):Sprite{
var sBtn:Sprite=新Sprite();
sBtn.name=btnName;
sBtn.graphics.beginll(0xFFFFFF);
sBtn.图形drawRoundRect(0,0,80,20,5);
var sBtnTF:TextField=new TextField();
sBtn.addChild(sBtnTF);
sBtnTF.text=btnName;
sBtnTF.x=5;
sBtnTF.y=3;
sBtnTF.selective=false;
sBtn.alpha=.5;
sBtn.addEventListener(MouseEvent.MOUSE_OVER,函数(e:Event):void{sBtn.alpha=1});
addEventListener(MouseEvent.MOUSE_OUT,函数(e:Event):void{sBtn.alpha=.5});
返回sBtn;
}
私有函数createShakers():void{
变量图形:雪碧;
for(var i:int=0;i
}
现在这是一个线性阻尼,您可以通过对值进行平方或立方调整来调整 这里是所选答案的分叉版本,但更灵活一点,它允许您设置频率。它还基于时间而不是帧,因此在设置持续时间和间隔时,您可以考虑时间(ms)而不是帧 用法与所选答案类似: 震动(clipToShake,持续时间毫秒,频率毫秒,最大震动范围) 这只是我使用TimerEvent而不是ENTER_框架的一个示例。它也不需要向正在抖动的MovieClips添加动态变量来跟踪时间、抖动量和开始位置
public function shake(shakeClip:MovieClip, duration:Number = 3000, frequency:Number = 30, distance:Number = 30):void
{
var shakes:int = duration / frequency;
var shakeTimer:Timer = new Timer(frequency, shakes);
var startX:Number = shakeClip.x;
var startY:Number = shakeClip.y;
var shakeUpdate:Function = function(e:TimerEvent):void
{
shakeClip.x = startX + ( -distance / 2 + Math.random() * distance);
shakeClip.y = startY + ( -distance / 2 + Math.random() * distance);
}
var shakeComplete:Function = function(e:TimerEvent):void
{
shakeClip.x = startX;
shakeClip.y = startY;
e.target.removeEventListener(TimerEvent.TIMER, shakeUpdate);
e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, shakeComplete);
}
shakeTimer.addEventListener(TimerEvent.TIMER, shakeUpdate);
shakeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, shakeComplete);
shakeTimer.start();
}
啊!!你发现了“布朗运动”。查一下:D你真正想要的是Machine.x=ORIGINALX+Math.random()*6-4代码>因此它每帧生成一个新点。还请注意,random会生成一个0-1之间的数字。因此,该函数从[0-1]*6-4=[0-6]-4=[-4,2]生成数字。因此,平均值为-2。这就是它平均向上和向左移动的原因。尽量保持平衡
public function shake(shakeClip:MovieClip, duration:Number = 3000, frequency:Number = 30, distance:Number = 30):void
{
var shakes:int = duration / frequency;
var shakeTimer:Timer = new Timer(frequency, shakes);
var startX:Number = shakeClip.x;
var startY:Number = shakeClip.y;
var shakeUpdate:Function = function(e:TimerEvent):void
{
shakeClip.x = startX + ( -distance / 2 + Math.random() * distance);
shakeClip.y = startY + ( -distance / 2 + Math.random() * distance);
}
var shakeComplete:Function = function(e:TimerEvent):void
{
shakeClip.x = startX;
shakeClip.y = startY;
e.target.removeEventListener(TimerEvent.TIMER, shakeUpdate);
e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, shakeComplete);
}
shakeTimer.addEventListener(TimerEvent.TIMER, shakeUpdate);
shakeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, shakeComplete);
shakeTimer.start();
}