【问题标题】:Moving text across screen smoothly平滑地在屏幕上移动文本
【发布时间】:2014-07-03 15:21:13
【问题描述】:

很长一段时间以来,我一直在寻找解决这个问题的方法,所以当搜索没有澄清任何问题时,我决定发布一个胎面。

我有一个应该在屏幕上移动的文本字段。我已经通过“输入帧函数”动态地为其 x 值添加速度来解决这个问题。然而,该运动非常“滞后”,并且由运动中的突然“跳跃”组成。我已经尝试了几种可能的解决方案,但都没有运气。

  • 嵌入字体
  • 更改文本字段的 antiAliasType
  • 像这样使用 BitmapData:

    bmd = new BitmapData (myTextField.width, myTextField.height, true, 0);
    bmd.draw (myTextField);
    
    bm = new Bitmap (bmd);
    bm.x = myTextField.x;
    bm.y = myTextField.y;
    bm.cacheAsBitmap = true;
    bm.smoothing = true;
    this.addChild(bm);`
    

    然后移动“bm”实例

这些方法都不起作用。

编辑:根据要求,我正在为文本的实际移动添加相关代码。

stage.addEventListener(Event.ENTER_FRAME, time);

private function time(evt:Event):void
{
    bm.x-= textSpeed;
}

变量textSpeed 定义为public static var。它的值为 2。

*EDIT2:我准备了一个干净的 fla 文件,其中只有移动文本。同样的滞后也发生在这里。代码位于操作面板中。 Download link

【问题讨论】:

  • 向我们展示您是如何移动它的。 (而且您不需要“缓存AsBitmap”位图...;))
  • 在转换为位图时,您是否删除了原始文本字段?你的帧率是多少?您还同时制作了哪些其他动画?
  • @Fygo:我已经添加了移动代码。我还删除了“cacheAsBitmap”行,但是这并没有什么区别。
  • @LDMediaServices:不,我不会随时删除它。它被定义为从一开始就看不见,而且不动。我的帧率为 30,00。是的,它确实会在程序中出现其他动画,但不会在任何时候出现。我注意到我的帖子中描述的滞后的“严重性”不会根据程序中其他动画的数量而发生显着变化。
  • 我真的不知道为什么会发生这种情况。您可以准备一个“干净”的 fla 作为示例并将其上传到某个地方吗? (无其他代码,仅用于绘制和移动)

标签: actionscript-3 actionscript textfield bitmapdata


【解决方案1】:

Flash IDE 的工作方式是设置帧率实际上是“最大”帧率。也就是说,它不会强制动画以该速率运行 - 它可能会因机器和可用资源而异。

据我所知,没有办法强制 Flash 以特定帧速率运行 - 使动画“流畅”的最佳方法是使用 Tween 类,例如 TweenLite。

如果您需要通过增加位置值来制作动画,那么我建议改为基于时间,例如:

var fps = 24;

var moveTimer:Timer = new Timer(1000/fps);


moveTimer.addEventListener(TimerEvent.TIMER, onMoveTimer);
moveTimer.start();
function onMoveTimer(e:TimerEvent){
    bm.x -= 1;
}

同样,这并不能解决动画的流畅度问题,但它在不同机器上的可靠性要比使用输入帧可靠得多。

【讨论】:

    【解决方案2】:

    尝试提高帧率。因为您自然会尝试在动画时阅读文本,所以您通常会注意到 24fps 帧之间的间隙。尝试将stage.frameRate 设置为 30、48 或 60(最大值为 60),看看是否能解决您的问题。我过去在动画文本方面遇到过类似的问题,提高帧速率已经解决了这些问题。

    我还建议仅根据需要增加它。您更有可能丢掉帧速率较高的帧(合乎逻辑;随着帧速率的增加,每个帧的计算时间减少),因此您可能想要执行以下操作:

    stage.frameRate = 48;
    // run animations here
    stage.frameRate = 24; // in an Event.COMPLETE handler
    

    这将确保您的动画流畅,同时让您的应用程序的其余部分在较小的设备上运行良好。如果您正在运行大量动画,则可以考虑将其永久提升。

    您还应该考虑使用 Greensock 动画库 (TweenLite/TweenMax) 而不是 Flash 的内置补间。 Greensock 在功能和性能方面都有非常出色的 API,尤其是在移动设备上。

    【讨论】:

    • 我试过提高帧率,但这似乎只会让滞后更加明显。不过,我想测试一下你提到的这个动画库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2013-07-11
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多