AS3:每次显示多个(无限制)成就,持续2秒

时间:2014-03-17 18:32:03

标签: actionscript-3 flash actionscript flash-cs4

我正在开展一个非常简单的(第一个项目)“游戏”,取得了各种成就。事实上,这就是游戏的全部内容。

假设我们有3个可能的成就:

  • 游戏开始
  • 你玩了5秒
  • 你打了6秒钟。

(我知道,我知道,我能听到你:哇,看起来像一个超级有趣的游戏概念!呵呵)

我正在尝试构建一个通用功能,负责在屏幕上显示成就消息,并在显示后2秒将其删除。这意味着可以同时显示多个成就。但是每个人都应该在他们自己的2秒后消失。

我尝试为每个成就完成成功实例化一个新的计时器。问题是每次都需要一个名称和一个回调函数,我无法将计时器链接到一个成就消息,因为我必须使用回调函数。 我确定我做错了,因为这是我的第一个项目,所以我要求一些帮助。

以下是我必须展示成就的代码:

var genericTimer:Array = new Array();
function displayAchievement(msg){
    var myTextBox:TextField = new TextField();    
    myTextBox.text = msg;
    myTextBox.x = 50;    
    myTextBox.y = 20; 
    addChild(myTextBox);

    genericTimer[] = new Timer(2000, 1);
    //Make myTextBox (of this instance only) disapear after 2 seconds
}

2 个答案:

答案 0 :(得分:2)

我个人会使用Event.ENTER_FRAME处理程序。

const TIME_TO_DISPLAY_ACHIEVEMENTS:uint = 2000; //ms
var achievements:Vector.<Object> = new Vector.<Object>();
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function displayAchievement(msg){
    var myTextBox:TextField = new TextField();    
    myTextBox.text = msg;
    myTextBox.x = 50;    
    myTextBox.y = 20; 
    addChild(myTextBox);

    achievements.push({tf:myTextBox, time:getTimer()});
}

function enterFrameHandler(e:Event):void {
    var i:uint, l:uint, t:uint;
    t = getTimer();
    l = achievements.length;
    for (i = l - 1; i >= 0; i--) {
        if (achievements[i].time + TIME_TO_DISPLAY_ACHIEVEMENTS <= t) {
            removeChild(achievements[i].tf);
            achievements.splice(i, 1);
        }
    }
}

这是未经测试的,我写的很快,所以你可能需要改变它以使其编译和/或运行。

基本上,您将具有成就和时间戳的对象添加到Vector或数组。然后在每个帧上,您快速向后循环(以考虑删除对象),并检查是否有任何已过期。如果有,则将它们从舞台和矢量/数组中删除。

这肯定可以优化,你可以用每100ms运行一次的Timer替换ENTER_FRAME,以节省CPU时间,但是它应该可以工作

答案 1 :(得分:1)

您可以通过匿名功能来实现此目的。就个人而言,我不喜欢他们,但这种方法会给你最少的代码:

function displayAchievement(msg:String):void {
    var myTextBox:TextField = new TextField();
    myTextBox.text = msg;
    myTextBox.x = 50;
    myTextBox.y = 20;
    addChild(myTextBox);

    var timer:Timer = new Timer(2000, 1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE, function (e:TimerEvent):void {
        removeChild(myTextBox);
    });
    timer.start();
}