AS3,如何显示动态文本(及以上)的只是最后一行? [英] AS3, How to show just the last line of dynamic text (and more)?

查看:187
本文介绍了AS3,如何显示动态文本(及以上)的只是最后一行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经加载外部文本文件的ActionScript,并滚动其内容的底部:

  VAR myTextLoader:的URLLoader =新的URLLoader();
myTextLoader.addEventListener(引发Event.COMPLETE,onLoaded);

功能onLoaded(五:事件):无效{
track_info.text = e.target.data;

的addChild(track_info);
  的addEventListener(Event.ENTER_FRAME,scrollField);
}

功能scrollField(五:事件):无效{
 如果(track_info.scrollV< track_info.maxScrollV){
    track_info.scrollV ++;
  }其他{
removeEventListener(Event.ENTER_FRAME,scrollField);
  }
}

myTextLoader.load(新的URLRequest(tracks.txt));
 

该tracks.txt是从提取的MP3歌手和歌曲名称的标签,从一个球员在实时,在这个格式的软件的日志文件(不能更改)。当前歌曲是在列表的底部。每首歌曲开头[日 - 月 - 年时:分:秒] *(25个字符preFIX):

  [14-07-2010 20时21分33秒]登录客户端创建的文件。
[14-07-2010 20时21分33秒]客户端连接。
[14-07-2010 20时26分21秒] *艺术家21  - 宋11
[14-07-2010二十时40分○二秒] *艺术家42  - 宋02
[14-07-2010二十时45分04秒] *艺术家14  - 宋10
[14-07-2010二十时47分19秒] *艺术家46  - 宋04
[14-07-2010二十时51分09秒] *艺术家07  - 宋09
[14-07-2010 20时54分13秒] *艺术家54  - 宋01
[14-07-2010 20点57分32秒] *艺术家19  - 宋12
[14-07-2010 21点00分51秒] *艺术家35  - 宋06
[14-07-2010二十一点04分02秒] *艺术家43  - 宋08
 

该脚本的工作,但我想知道,如果这个问题是可以解决的:

  1. 我想在flash动画,只显示当前歌曲的列表(正在播放的)的最后一道防线,不是所有的tracks.txt文件中的数据。能不能做到?

  2. 有关的是,这部电影一定要下自动更新从.TXT内容几乎实时显示新的歌曲信息到文本框,替换previous之一。有没有办法做到这一点?

  3. 最后,是有可能隐藏[日 - 月 - 年时:分:秒] *25个字符$ P $文本字段内PFIX,只显示了艺术家 - 在歌曲名称节Flash电影?

感谢提前对您有所帮助。

修改

  VAR重装:计时器=新的Timer(5000,0);
reload.addEventListener(TimerEvent.TIMER,计时器触发);
功能的OnTimer(事件:TimerEvent):无效{
    VAR myTextLoader:的URLLoader =新的URLLoader();
    myTextLoader.addEventListener(引发Event.COMPLETE,onLoaded);
    功能onLoaded(五:事件):无效{
        VAR行:阵列= e.target.data.split(\ N);
        VAR lastLine所:字符串=行[lines.length  -  1];
        VAR artistAndSong:字符串= lastLine.substr(24);
        track_info.text = artistAndSong;
        的addChild(track_info);
        myTextLoader.load(新的URLRequest(tracks.txt));
    }
    reload.start();
}
 

修改

也许分裂()与真正的.log文件doesn't工作。所有的文字显示,不仅最后一行。这是.LOG例如:

客户端127.0.0.1,55684

  [30-07-2010 3时21分34秒]日志文件中创建。
[30-07-2010 3时21分34秒]客户端127.0.0.1,55684连接,并且已被确定为拖拉机(或足够接近的东西)。
[30-07-2010 3时22分58秒] *勇敢 - 一个诚实的错误
[30-07-2010三点23分22秒] *的扑水 - 月亮的整体
 

修改

  VAR重装:计时器=新的Timer(5000,1);
reload.addEventListener(TimerEvent.TIMER,计时器触发);

VAR tracksLoader:的URLLoader =新的URLLoader();
tracksLoader.addEventListener(引发Event.COMPLETE,onTracksLoaded);
tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);

loadTracks();

功能onTracksLoaded(五:事件):无效{
    跟踪(onTracksLoaded);
    parseTracks(tracksLoader.data);
    reload.start();
}

功能的OnTimer(事件:TimerEvent):无效{
    loadTracks();
}

功能onTracksError(五:事件):无效{
    跟踪(onTracksError,E);
    reload.start();
}

功能loadTracks():无效{
    tracksLoader.load(新的URLRequest(127.0.0.1,55684.log));
}

功能parseTracks(数据:字符串):无效{
    尝试 {
        debugChars(数据);
        VAR行:阵列= data.split(\ r \ N);
        VAR lastLine所:字符串=行[lines.length  -  1];
        VAR artistAndSong:字符串= lastLine.substr(24).split( - )。加入(\ N);
        跟踪(artistAndSong);
        track_info.text = artistAndSong;
        的addChild(track_info);
    }赶上(五:错误){

    }
}

功能debugChars(STR:字符串):无效{
    VAR缓冲区:ByteArray的=新的ByteArray();
    buffer.writeUTFBytes(STR);
    buffer.position = 0;
    VAR的结果:string =;
    而(buffer.bytesAvailable){
        结果+ =0X+ UINT(buffer.readUnsignedByte())的toString(16)+,。
        如果(buffer.position%16 == 0){
            结果+ =\ N的;
        }

    }
    //打印此字符串...
    跟踪(结果);
}
 

修改

请注意,该行的艺术家和歌曲名称是由于这个code之间爆发:

  .split( - )。加入(\ N);
 

中的.log带有艺术家 - 歌曲名称,实际上

  onTracksLoaded
0x5b,0x33,为0x30,0x2d,为0x30,0x37符号,0x2d,0x32,为0x30,0X31,为0x30,0x20的,为0x30,0x33,0x3A的0x32,
0X31,0x3A的0x33,0x34,0x5d,为0x20,0x4c,0x6f,0x67,0x20的,0x66,0×69,0x6c,0x65,0x20的,0x63,
0x72,0x65,0x61,0x74,0x65,0x64,0x20的,0x66,0x6f,0x72,0x20的,0x63,0x6c,0×69,0x65,0x6e,
0x74,0x20的,输入0x22,0X31,0x32,0x37符号,0x2E之间,为0x30,0x2E之间,为0x30,0x2E之间,0X31,0x2c,0x35,0x35,0x36数据,
0x38,0x34,输入0x22,0x2E之间,为0xA,0x5b,0x33,为0x30,0x2d,为0x30,0x37符号,0x2d,0x32,为0x30,0X31,为0x30,
为0x20,为0x30,0x33,0x3A的0x32,0X31,0x3A的0x33,0x34,0x5d,为0x20,0x43中,0x6c,0×69,0x65,0x6e,
0x74,0x20的,输入0x22,0X31,0x32,0x37符号,0x2E之间,为0x30,0x2E之间,为0x30,0x2E之间,0X31,0x2c,0x35,0x35,0x36数据,
0x38,0x34,输入0x22,0x20的,0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x65,0x64,0x20的,0x61,0x6e,
0x64,0x20的,0x68,0x61(0x73)的,为0x20,0X62,0x65,0x65,0x6e,为0x20,0×69,0x64,0x65,0x6e,0x74,
0×69,0x66,0×69,0x65,0x64,0x20的,0x61(0x73)的,为0x20,0x54,0x72,0x61,0x6b,0x74,0x6f,0x72,
为0x20,0x28,0x6f,0x72,0x20的,0x61,0x20的(0x73)的,0x6f,0x6d,0x65,0x74,0x68,0×69,0x6e,0x67,
为0x20,0x63,0x6c,0x6f(0x73)的,0x65,0x20的,0x65,0x6e,0x6f,0x75,0x67,0x68,0x29,0x2E之间,为0xA,
0x5b,0x33,为0x30,0x2d,为0x30,0x37符号,0x2d,0x32,为0x30,0X31,为0x30,0x20的,为0x30,0x33,0x3A的0x32,
0x32,0x3A的0x35,0x38,0x5d,为0x20,0x2a,为0x20,0x54,0x68,0x65,0x20的,0x42后,0x72,0x61,0x76,
0x65,0x72,x79的,为0x20,0x2d,为0x20,0x41既,0x6e,为0x20,0x48,0x6f,0x6e,0x65(0x73)的,0x74,0x20的,
送出0x4d,0×69(0x73)的,0x74,0x61,0x6b,0x65,为0xA,0x5b,0x33,为0x30,0x2d,为0x30,0x37符号,0x2d,0x32,
为0x30,0X31,为0x30,0x20的,为0x30,0x33,0x3A的0x32,0x33,0x3A的0x32,0x32,0x5d,为0x20,0x2a,0x20的,
0x54,0x68,0x65,0x20的,0×57,0x61,0x74,0x65,0x72,0X62,0x6f,x79的(0x73)的,为0x20,0x2d,0x20的,
0x54,0x68,0x65,0x20的,0×57,0x68,0x6f,0x6c,0x65,0x20的,0x6f,0x66,0x20的,0x74,0x68,0x65,
为0x20,送出0x4d,0x6f,0x6f,0x6e,为0xA,0x5b,0x33,为0x30,0x2d,为0x30,0x37符号,0x2d,0x32,为0x30,0X31,
为0x30,0x20的,为0x30,0x33,0x3A的0x32,0x37符号,0x3A的0x35,0x36数据,0x5d,为0x20,0x2a,为0x20,0x42后,0x61,
0X62,0x61(0x73)的,0x6f,0x6e,0×69,0x63,0x6f(0x73)的,为0x20,0x2d,为0x20,0x59,0x65,0x67,0x75,
0x61,是0xA,
为客户制作的G文件127.0.0.1,55684。
[30-07-2010 3时21分34秒]客户端127.0.0.1,55684连接,并且已被确定为拖拉机(或足够接近的东西)。
[30-07-2010 3时22分58秒] *勇敢
一个诚实的错误
[30-07-2010三点23分22秒] *的扑水
月亮的整体
[30-07-2010 3时27分56秒] * Babasonicos
耶瓜
 

解决方案

有关1)和3)的字符串::分裂会做到这一点。

这将是这样的:

  / *
\ n是换行符结束。根据所创建的程序
文本文件,你可能需要去改变它为\ r \ n或\ r
请注意,我没有做任何错误检查,你可能想添加它...
* /
VAR行:阵列= e.target.data.split(\ N);
VAR lastLine所:字符串=行[lines.length  -  1];
 

如果该格式是固定的,可以拆分最后一行的*,甚至使用的 SUBSTR 让艺术家和歌曲名称。

  / *
同样,我不检查任何错误
* /
变种songAndArtist:字符串= lastLine.split(*)[1];
 

  VAR songAndArtist:字符串= lastLine.substr(25);
 

有关2),只是轮询服务器在一个合理的区间。有几个这样的方式。一个可能是,当你加载的文件,开始一个定时器;当此计时器完成后,停止计时器并重新加载该文件。您也可以使用<一个href="http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#setTimeout%28%29"相对=nofollow>的setTimeout 的代替计时器

修改

不知道你的问题是与code你张贴,但分析日志工作正常,我的一部分。数据的加载期间我重新arrenged有点并加入检查错误。

一个问题,您的code:你等着你当前加载操作完成,然后打电话给你的计时器。这可能导致问题。你并不需要有两个下载在同一时间,所以你是想重装前,等待下载完成(成功地与否)更好的(你可能不希望尝试重新加载错误,或者限制你重试次数为2,3或类似的东西,但是这取决于你)。

此外,请注意,我改变了计时器的重复次数为1,所以您不必停止它。这意味着它将运行一次,然后就会停止,直到你打电话再次启动)。我构建了一下你的code到其各部分分隔成不同的功能,所以它更容易理解。

在parseTracks功能我包所有code在一个try / catch映入几乎所有的错误。这是一种快速和肮脏的,所以我一般不推荐的错误处理的风格,但可能会在这里做的工作。

  VAR重装:计时器=新的Timer(5000,1);
reload.addEventListener(TimerEvent.TIMER,计时器触发);

VAR tracksLoader:的URLLoader =新的URLLoader();
tracksLoader.addEventListener(引发Event.COMPLETE,onTracksLoaded);
tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);

loadTracks();

功能onTracksLoaded(五:事件):无效{
    跟踪(onTracksLoaded);
    parseTracks(tracksLoader.data);
    reload.start();
}

功能的OnTimer(事件:TimerEvent):无效{
    loadTracks();
}

功能onTracksError(五:事件):无效{
    跟踪(onTracksError,E);
    reload.start();
}

功能loadTracks():无效{
    tracksLoader.load(新的URLRequest(tracks.txt));
}

功能parseTracks(数据:字符串):无效{
    尝试 {
        VAR行:阵列= data.split(\ N);
        VAR lastLine所:字符串=行[lines.length  -  1];
        VAR artistAndSong:字符串= lastLine.substr(24);
        跟踪(artistAndSong);
    }赶上(五:错误){

    }
}
 

编辑2

添加此功能,并打印其结果尝试检测,如果有一些问题,所涉及的人物......从这样的parseTracks调用它:

  debugChars(数据);


功能debugChars(STR:字符串):无效{
    VAR缓冲区:ByteArray的=新的ByteArray();
    buffer.writeUTFBytes(STR);
    buffer.position = 0;
    VAR的结果:string =;
    而(buffer.bytesAvailable){
        结果+ =0X+ UINT(buffer.readUnsignedByte())的toString(16)+,。
        如果(buffer.position%16 == 0){
            结果+ =\ N的;
        }

    }
    //打印此字符串...
    跟踪(结果);
}
 

I have made an actionscript that loads an external text file, and scrolls its content to the bottom:

var myTextLoader:URLLoader = new URLLoader();
myTextLoader.addEventListener(Event.COMPLETE, onLoaded);

function onLoaded(e:Event):void {
track_info.text = e.target.data;

addChild(track_info);
  addEventListener(Event.ENTER_FRAME, scrollField);
}

function scrollField(e:Event):void {
 if(track_info.scrollV < track_info.maxScrollV) {
    track_info.scrollV++;
  }else{
removeEventListener(Event.ENTER_FRAME, scrollField);
  }
}

myTextLoader.load(new URLRequest("tracks.txt"));

The tracks.txt is a log file from a software that fetches the mp3 Artist and Song Name tags from a player in real time, in this format (it cannot be changed). The current song is at the bottom of the list. Each song starts with "[Day-Month-Year Hour:Min:Sec] * " (a 25 characters prefix):

[14-07-2010 20:21:33] Log file created for client.
[14-07-2010 20:21:33] Client connected.
[14-07-2010 20:26:21] * Artist 21 - Song 11
[14-07-2010 20:40:02] * Artist 42 - Song 02
[14-07-2010 20:45:04] * Artist 14 - Song 10
[14-07-2010 20:47:19] * Artist 46 - Song 04
[14-07-2010 20:51:09] * Artist 07 - Song 09
[14-07-2010 20:54:13] * Artist 54 - Song 01
[14-07-2010 20:57:32] * Artist 19 - Song 12
[14-07-2010 21:00:51] * Artist 35 - Song 06
[14-07-2010 21:04:02] * Artist 43 - Song 08

The script works, but I would like know if this issues can be solved:

  1. I would like to show in the flash movie only the current song, the last line of the list (the one that is playing), not all the data in the tracks.txt file. Can it be done?

  2. For that, the movie must to autoupdate the content from the .txt almost in real time to show the new song info into the textfield, replacing the previous one. Is there any way to do this?

  3. Finally, is it possible to hide the "[Day-Month-Year Hour:Min:Sec] * " 25 characters prefix within the textfield, to show just the Artist - Song Name section in the flash movie?

Thank in advance for your help.

Edit

var reload:Timer = new Timer(5000, 0); 
reload.addEventListener(TimerEvent.TIMER, onTimer); 
function onTimer(event:TimerEvent):void{ 
    var myTextLoader:URLLoader = new URLLoader(); 
    myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 
    function onLoaded(e:Event):void {
        var lines:Array = e.target.data.split("\n"); 
        var lastLine:String = lines[lines.length - 1]; 
        var artistAndSong:String = lastLine.substr(24); 
        track_info.text = artistAndSong; 
        addChild(track_info); 
        myTextLoader.load(new URLRequest("tracks.txt")); 
    } 
    reload.start(); 
}

Edit

Maybe the split() doesn´t work with the real .log file. All the text is shown, not only the last line. This is the .log example:

[30-07-2010 03:21:34] Log file created for client "127.0.0.1,55684".
[30-07-2010 03:21:34] Client "127.0.0.1,55684" connected and has been identified as Traktor (or a something close enough).
[30-07-2010 03:22:58] * The Bravery - An Honest Mistake
[30-07-2010 03:23:22] * The Waterboys - The Whole of the Moon

Edit

var reload:Timer = new Timer(5000, 1); 
reload.addEventListener(TimerEvent.TIMER, onTimer); 

var tracksLoader:URLLoader = new URLLoader();
tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);

loadTracks();

function onTracksLoaded(e:Event):void {
    trace("onTracksLoaded");
    parseTracks(tracksLoader.data); 
    reload.start(); 
}

function onTimer(event:TimerEvent):void{ 
    loadTracks();
}

function onTracksError(e:Event):void {
    trace("onTracksError", e);
    reload.start();
}

function loadTracks():void {
    tracksLoader.load(new URLRequest("127.0.0.1,55684.log")); 
}

function parseTracks(data:String):void {
    try {
        debugChars(data); 
        var lines:Array = data.split("\r\n"); 
        var lastLine:String = lines[lines.length - 1]; 
        var artistAndSong:String = lastLine.substr(24).split(" - ").join("\n");
        trace(artistAndSong);
        track_info.text = artistAndSong; 
        addChild(track_info);
    } catch(e:Error) {

    }
}

function debugChars(str:String):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeUTFBytes(str);
    buffer.position = 0;
    var result:String = "";
    while(buffer.bytesAvailable) {
        result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
        if(buffer.position % 16 == 0) {
            result += "\n";
        }

    }
    //  print this string...
    trace(result);
}

Edit

Note that the line breaks between the 'Artist' and 'Song Name' are due to this code:

.split(" - ").join("\n");

The .log comes with 'Artist - Song Name', actually.

onTracksLoaded
0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 
0x31, 0x3a, 0x33, 0x34, 0x5d, 0x20, 0x4c, 0x6f, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x63, 
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 
0x74, 0x20, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2c, 0x35, 0x35, 0x36, 
0x38, 0x34, 0x22, 0x2e, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 
0x20, 0x30, 0x33, 0x3a, 0x32, 0x31, 0x3a, 0x33, 0x34, 0x5d, 0x20, 0x43, 0x6c, 0x69, 0x65, 0x6e, 
0x74, 0x20, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x2c, 0x35, 0x35, 0x36, 
0x38, 0x34, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 
0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 
0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x54, 0x72, 0x61, 0x6b, 0x74, 0x6f, 0x72, 
0x20, 0x28, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 
0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x29, 0x2e, 0xa, 
0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 
0x32, 0x3a, 0x35, 0x38, 0x5d, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x42, 0x72, 0x61, 0x76, 
0x65, 0x72, 0x79, 0x20, 0x2d, 0x20, 0x41, 0x6e, 0x20, 0x48, 0x6f, 0x6e, 0x65, 0x73, 0x74, 0x20, 
0x4d, 0x69, 0x73, 0x74, 0x61, 0x6b, 0x65, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 
0x30, 0x31, 0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 0x33, 0x3a, 0x32, 0x32, 0x5d, 0x20, 0x2a, 0x20, 
0x54, 0x68, 0x65, 0x20, 0x57, 0x61, 0x74, 0x65, 0x72, 0x62, 0x6f, 0x79, 0x73, 0x20, 0x2d, 0x20, 
0x54, 0x68, 0x65, 0x20, 0x57, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 
0x20, 0x4d, 0x6f, 0x6f, 0x6e, 0xa, 0x5b, 0x33, 0x30, 0x2d, 0x30, 0x37, 0x2d, 0x32, 0x30, 0x31, 
0x30, 0x20, 0x30, 0x33, 0x3a, 0x32, 0x37, 0x3a, 0x35, 0x36, 0x5d, 0x20, 0x2a, 0x20, 0x42, 0x61, 
0x62, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x2d, 0x20, 0x59, 0x65, 0x67, 0x75, 
0x61, 0xa, 
g file created for client "127.0.0.1,55684".
[30-07-2010 03:21:34] Client "127.0.0.1,55684" connected and has been identified as Traktor (or a something close enough).
[30-07-2010 03:22:58] * The Bravery
An Honest Mistake
[30-07-2010 03:23:22] * The Waterboys
The Whole of the Moon
[30-07-2010 03:27:56] * Babasonicos
Yegua

解决方案

For 1) and 3), String::split will do it.

It would be something like:

/* 
\n is the end of line character. Depending on the program that creates
the text file, you might need to change it to \r\n or \r
Note I'm not doing any error checking, you might want to add it...
*/
var lines:Array = e.target.data.split("\n");
var lastLine:String = lines[lines.length - 1];

If the format is fixed, you can split the last line on "*" or even use substr to get the Artist and song name.

/*
Again, I'm not checking for any errors
*/
var songAndArtist:String = lastLine.split("*")[1];

or

var songAndArtist:String = lastLine.substr(25);

For 2), just poll the server at a reasonable interval. There are a couple of ways of doing this. One could be, whenever you load your file, start a Timer; when the this timer is done, stop the timer and reload the file. You could also use setTimeout instead of the timer.

Edit

Not sure what your problem was with the code you posted, but the part that parses the log works fine for me. I re-arrenged it a bit and added checks for errors during the loading of the data.

One problem with your code: you call your timer before waiting for you current load operation to finish. This could lead to problems. You don't need to have two downloads at the same time, so you are better of waiting for the download to complete (succesfully or not) before trying to reload (You might not want to try to reload on error; or maybe limit your retries to 2, 3 or something like that, but that's up to you).

Also, note I changed the timer's repeat count to 1, so you don't have to stop it. This means it will run once and then it will stop until you call start again). I structured a bit your code to separate its parts into different functions so it's easier to follow.

In the parseTracks function I wrapped all the code in a try/catch that catches almost all errors. This is kind of quick and dirty, so I'd generally not recommed that style of error handling, but might do the job here.

var reload:Timer = new Timer(5000, 1); 
reload.addEventListener(TimerEvent.TIMER, onTimer); 

var tracksLoader:URLLoader = new URLLoader();
tracksLoader.addEventListener(Event.COMPLETE,onTracksLoaded);
tracksLoader.addEventListener(IOErrorEvent.IO_ERROR,onTracksError);
tracksLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onTracksError);

loadTracks();

function onTracksLoaded(e:Event):void {
    trace("onTracksLoaded");
    parseTracks(tracksLoader.data); 
    reload.start(); 
}

function onTimer(event:TimerEvent):void{ 
    loadTracks();
}

function onTracksError(e:Event):void {
    trace("onTracksError", e);
    reload.start();
}

function loadTracks():void {
    tracksLoader.load(new URLRequest("tracks.txt")); 
}

function parseTracks(data:String):void {
    try {
        var lines:Array = data.split("\n"); 
        var lastLine:String = lines[lines.length - 1]; 
        var artistAndSong:String = lastLine.substr(24); 
        trace(artistAndSong);
    } catch(e:Error) {

    }
}

Edit 2

Add this function and print its result to try to detect if there's some problem with the characters involved... Call it from parseTracks like this:

debugChars(data);


function debugChars(str:String):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeUTFBytes(str);
    buffer.position = 0;
    var result:String = "";
    while(buffer.bytesAvailable) {
        result += "0x" + uint(buffer.readUnsignedByte()).toString(16) + ", ";
        if(buffer.position % 16 == 0) {
            result += "\n";
        }

    }
    //  print this string...
    trace(result);
}

这篇关于AS3,如何显示动态文本(及以上)的只是最后一行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆