flash pro 中的动画实例

Posted

技术标签:

【中文标题】flash pro 中的动画实例【英文标题】:Animating instances in flash pro 【发布时间】:2014-02-08 06:53:15 【问题描述】:

所以我有一个游戏,它由 3 帧、开始、规则和实际游戏帧组成。

我想要一张脸的图像从中性表情变成皱眉的脸,同时不断地向下移动。 我知道你可以把它移下来

instancename.y += 10;

但是当它下降的时候,我怎么能让它不时皱起眉头?

我已经画了表情的多张脸,那我需要什么让它皱眉呢?

如果这有很大的不同,我有 Photoshop,

【问题讨论】:

你想让皱眉的脸随机出现吗?或者在一个固定的时间 我更喜欢随机,但如果代码/我需要为设置时间做的事情更短更容易,那么我想我会设置时间。 【参考方案1】:

所以我不确定你希望皱眉的脸多久出现一次。它可以在随机时间,或者在一定距离之后,或者您可以使用Timer 设置它以指定时间间隔运行。所以我将解释所有 3 个。

首先是随机时间。您需要为此解决方案导入 flash.utils.getTimer。我假设你希望你皱着眉头的脸保持皱眉脸超过 1 毫秒。如果是这样的话,那么我会这样做:

设置这个成员变量:

private var beginTime:Number;

然后在你运行你的第一个移动函数之前:

beginTime = getTimer();

在您的循环或移动函数中包含instancename.y += 10;

private function loop():void 
    instancename.y += 10;

    //get our delta time        
    var dt:Number = getTimer() - beginTime; 
    //set random variable 50% chance to change the frame    
    var random:int = Math.random() * 2;

    //dt > 3000 just means 3 seconds have passed, you can lower that number to decrease the delay before we change frames for the "face" animation
    if ( random > 0 && dt > 3000 ) 
        beginTime = getTimer();

        if ( instancename.currentFrameLabel == "neutral" ) 
            instancename.gotoAndPlay("frowning");
         
        else 
            instancename.gotoAndStop("neutral");
        
    

这将随机更改帧,延迟 3000 毫秒或 3 秒(随意更改)。

现在是距离版本。所以这基本上只是说当我们从某个原点到达一定距离时,改变框架。但这取决于设置的几个变量:

//set the variable origin and a maxDistance
private var origin:Point = new Point( instancename.x, instancename.y );
private var maxDistance:int = 50;

//then in your loop or movement function
private function loop():void 
    instancename.y += 10;

    //when our distance is >= to our maxDistance, change the frame
    if ( Point.distance( new Point( spr.x, spr.y ), origin ) >= maxDistance ) 
        if ( instancename.currentFrameLabel == "neutral" ) 
            instancename.gotoAndPlay("frowning");
         
        else 
            instancename.gotoAndStop("neutral");
        
        //set the origin variable again
        origin = new Point( instancename.x, instancename.y );
    

最后是计时器功能。使用TimerEvent.TIMER 的事件侦听器和要调用的函数设置一个计时器变量:

private var timer:Timer = new Timer(3000, 0);

然后在适用的情况下进行设置:

timer.addEventListener(TimerEvent.TIMER, changeFrame);
timer.start(); //to start your timer

然后在定时器函数中:

private function changeFrame( e:TimerEvent ):void 
    if ( instancename.currentFrameLabel == "neutral" ) 
        instancename.gotoAndPlay("frowning");
     
    else 
        instancename.gotoAndStop("neutral");
    

用完别忘了停止它:timer.stop();

这些是解决问题的几种方法。我应该注意,第二种解决方案(距离之一)可以通过多种不同的方式进行优化,这只是其中一种方式。

希望这会有所帮助,祝你好运!

【讨论】:

谢谢,这很好,但我会吃很多吗?有什么方法可以编辑符号/实例本身以使其在多个帧中循环? 你为什么不直接使用 gotoAndPlay? 我从未听说过?你能给我一个简单的解释吗? Livedocs 是你最好的朋友:help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 我也更新了随机版本,做了一点小改动,意识到我复制/粘贴了一个错误,dt = getTimer() 应该是beginTime = getTimer()

以上是关于flash pro 中的动画实例的主要内容,如果未能解决你的问题,请参考以下文章

jQuery动画特效实例教程

flash as3如何获取实例名字中的数字

利用CSS3制作淡入淡出动画效果

Flash 开发环境搭建和文字滚动效果实例

如何在 flash(as3) 中检测实例来自哪个类

关键帧的种类和特点?