我正在开展一个非常简单的(第一个项目)“游戏”,取得了各种成就。事实上,这就是游戏的全部内容。
假设我们有3个可能的成就:
(我知道,我知道,我能听到你:哇,看起来像一个超级有趣的游戏概念!呵呵)
我正在尝试构建一个通用功能,负责在屏幕上显示成就消息,并在显示后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
}
答案 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();
}