我有一个结果屏幕,显示奖励积分等。我希望每个文本字段一个接一个地递增,并且每帧增加一定量。
弹出结果屏幕。
首先是球员得分 检查玩家得分,是否超过我们想要显示的分数
如果玩家得分大于玩家显示得分100 将玩家显示分数提高100
如果玩家得分大于玩家显示得分10 将玩家显示得分提高10点
否则将玩家显示分数提高1
完成后移动到下一个分数......依此类推。
我曾想过使用计时器从一个分数移动到下一个分数,但不是在一个Event.ENTER_FRAME中它只有一个,如果然后移动到下一个。用于递增分数的if语句看起来很荒谬,我认为必须有更好的方法来做到这一点。我想把它作为一个单独的功能,但后来我不知道该返回什么,或者如何返回它所以它看起来像它的增加而不仅仅是立即显示总数。
如果您有任何疑问,请发表评论。我会尝试进一步扩展它。
答案 0 :(得分:0)
您可以创建一个继承自TextField的新ScoreText类,并将其用于每个得分文本字段。在该类上,您可以创建一个取得分数的setTargetScore方法,并处理显示数量的增量。然后它可以在完成时发送一个事件。您可以监听当时的事件,并根据需要在每个ScoreText上调用setTargetScore方法。
另一种可能更好/更容易的方法是使用TweenLite补间您的分数,并使用其事件更新分数文本字段,并在完成时移动到下一个。
修改* 强>
以下是使用Tweenlite补间得分变量的示例: How to Tween A Variable with Flash and TweenLite
<强> EDIT2 * 强>
以下是我的第一个方法示例:
首先是ScoreText类:
package {
import flash.events.Event;
import flash.text.TextField;
public class ScoreText extends TextField {
public static const EVENT_SCORE_COMPLETE:String = 'scoreCompleteEvent';
private var targetScore:Number = 0;
private var currentScore:Number = 0;
private const speed:Number = 0.11;
public function ScoreText(initialScore:Number = 0) {
currentScore = initialScore;
updateScore();
}
public function setTargetScore(targetScore:Number):void {
this.targetScore = targetScore;
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void {
currentScore += (targetScore - currentScore) * speed;
if (currentScore >= targetScore -1) {
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
dispatchEvent(new Event(EVENT_SCORE_COMPLETE));
}
updateScore();
}
private function updateScore():void {
this.text = Math.round(currentScore).toString();
}
}
}
这是Main class:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
private var st1:ScoreText;
private var st2:ScoreText;
private var st3:ScoreText;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
st1 = new ScoreText(0);
st1.y = 10;
st1.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score1Complete);
addChild(st1);
st2 = new ScoreText(0);
st2.y = 60;
st2.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score2Complete);
addChild(st2);
st3 = new ScoreText(0);
st3.y = 110;
st3.addEventListener(ScoreText.EVENT_SCORE_COMPLETE, score3Complete);
addChild(st3);
st1.setTargetScore(1234);
}
private function score1Complete(e:Event):void
{
trace('score 1 finishes, start the next one!');
st2.setTargetScore(234553);
}
private function score2Complete(e:Event):void
{
trace('score 2 finishes, start the next one!');
st3.setTargetScore(745);
}
private function score3Complete(e:Event):void
{
trace('score 3 finishes, start the next one!');
}
}
}