【问题标题】:Flash AS3 timer questionFlash AS3 定时器问题
【发布时间】:2009-03-02 10:54:48
【问题描述】:

我有一个 timerEvent,它可以向舞台添加 25 个电影剪辑,并从 x:0,y:0 为它们设置动画,这一切都很好!我想做的是为每个影片剪辑分配一个比添加到舞台的最后一个影片剪辑多 25px 的 y 值。我做了一个小测试,每次定时器循环时尝试增加一个数值,但它没有增加。我也应该使用 for 循环/数组吗?

提前致谢。 城野

import flash.events.*;
import caurina.transitions.*;

bringItemsOn();

var itemTimer:Timer;
function bringItemsOn():void {
    itemTimer=new Timer(300);
    itemTimer.addEventListener(TimerEvent.TIMER,itemTimer_tick);
    itemTimer.start();
}

function itemTimer_tick(e:TimerEvent):void {    
    itemTimer.currentCount-1;
    var mc:MovieClip = new MovieClip();
    mc.graphics.beginFill(Math.random() * 0x000000);
    mc.graphics.drawRect(0,0,stage.stageWidth,25);
    mc.x=0;
    mc.y=0;
    addChild(mc);
    Tweener.addTween(mc,{y:Math.random()*1000 - 500,
                             x:0,
                             time:.9,
                             transition:"easeOutExpo"});

    if (itemTimer.currentCount>=25) {
        itemTimer.removeEventListener(TimerEvent.TIMER,itemTimer_tick);
    }
}

【问题讨论】:

  • Tweener.addTween(mc,{y:mc.y + 50,x:0,time:.9,transition:"easeOutExpo"});如果我添加/使用了一个 for 循环,我可以引用每个对象并分配 mc[i] + 50 所以只是想知道我是否可以集成到

标签: flash actionscript-3 animation loops timer


【解决方案1】:

老实说,我最初会使用 for 循环来设置这一切。完成 for 循环后,相应地放置每个项目,然后使用 TweenLite 或您最喜欢的 Tweening 包。

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    import gs.TweenLite;
    import gs.easing.*;

    public class ExampleDocumentClass extends Sprite
    {
        if(stage) _init();
        else addEventListener(Event.ADDED_TO_STAGE, _init(), false, 0, true);
    }
    private function _init(e:Event =null):void
    {
        for(var i:int = 0; i < 25; i++)
        {
            var mc:MovieClip = new MovieClip();
            mc.graphics.beginFill(Math.random() * 0x000000);
            mc.graphics.drawRect(0,0,stage.stageWidth,25);
            //Seperates them by 25, their width, so they will touch.
            mc.x= i * 25; //i * 25 + 1 leaves a space in between.
            mc.y=0;
            addChild(mc);
            TweenLite.to(mc, 0.9, {y:math.random()*1000-500, x: 0, ease: Expo.easeOut});

        if(i == 24) //Total length - 1
        {
            //The loop ended.
        }
    }
}

请务必注意,屏幕更新不会发生在 for 和 while 循环等代码块中。您不能以我展示的方式将这些基于彼此隔开,因为即使先前的项目 x 可能刚刚设置,它还没有被绘制到屏幕上;为了构建一个系统,假设所有图像的宽度不同,但必须一个接一个地开始,我们必须等待 Event.COMPLETE 事件为给定的加载器触发,以便我们可以访问它的宽度和其他属性。由于您只想将它​​们间隔 25 像素,并且它们的大小相同,因此我们仅使用“i”来分隔它们

发生了什么: 我 * 25 = 0; 我++; 我 * 25 = 25; 我++; 我 * 25 = 50;

如您所见,我们已经达到了我们正在寻找的间距。

布莱恩·霍奇
hodgedev.com blog.hodgedev.com

【讨论】:

  • 这是一个不错的方法!还使所有对象都易于访问,引用点击事件等...谢谢!
【解决方案2】:

使用这个:

 import flash.events.*;
 import caurina.transitions.*;

bringItemsOn();

var extra:int = 0;
var itemTimer:Timer;
function bringItemsOn():void {
    itemTimer=new Timer(300);
    itemTimer.addEventListener(TimerEvent.TIMER,itemTimer_tick);
    itemTimer.start();
}

function itemTimer_tick(e:TimerEvent):void {    
    itemTimer.currentCount-1;
    var mc:MovieClip = new MovieClip();
    mc.graphics.beginFill(Math.random() * 0x000000);
    mc.graphics.drawRect(0,0,stage.stageWidth,25);
    mc.x += extra;
    mc.y=0;
    extra = mc.width;
 /*u can use mc's width for different x value's or

make ur own like extra += 10; each mc.x will be different */
    addChild(mc);
    Tweener.addTween(mc,{y:Math.random()*1000 - 500,
                             x:0,
                             time:.9,
                             transition:"easeOutExpo"});

    if (itemTimer.currentCount>=25) {
        itemTimer.removeEventListener(TimerEvent.TIMER,itemTimer_tick);
    }
}

【讨论】:

    【解决方案3】:

    并没有真正找到您尝试增加变量或将 25px 添加到 y 的部分,但试试这个:

    function itemTimer_tick(e:TimerEvent):void {
    
        ...
    
        mc.y = itemTimer.currentCount * 25;
        addChild(mc);
    
        ...
    
    }
    

    【讨论】:

    • 谢谢老兄!那就是我使用 currentCount * jobbie 作为 var var mcFinal:Number = (itemTimer.currentCount * 50); Tweener.addTween(mc,{y:mcFinal,x:0,time:.9,transition:"easeOutExpo"});这样就解决了!非常感谢!
    • 您知道,如果可以接受,您也应该接受答案:)
    • 哎呀,这个游戏的新手很抱歉!
    【解决方案4】:

    我真正不同的方法可能是使用Tweener.addTween 方法的delay 属性。启动所有的movieclip并稍微增加每个movieclip的延迟?

    【讨论】:

    • 当然,在使用 for 循环的情况下,我只需将延迟设置为 i * delayDifference。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多