ActionScript3 で、簡単な電子掲示板ぽい文字列横スクロールのプログラムを書いてみる。
グローバル変数を使って、Timer クラスのイベントで編集するのが簡単じゃろう。
どうしても生理的にグローバル変数が使いたくないという偏屈者は、ActionScript2 との互換性のために用意されている setInterval や setTimeout などのパブリック関数を使って引数渡しなどすることになるんだろうが、どう考えてもすっきりしたコードにはならんじゃろう。
素直にグローバル変数を使ったら、↓ほら、そこそこすっきり。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="initProc();" width="367" height="109"><mx:Script>
<![CDATA[// グローバル変数
public var TextData:String = "わたしは宇宙からきたゴリ星人だ。多分、そうだ。"; // 表示文字列
// 定数
public static const MAX_TEXT_SIZE:int = 40; // text1 に表示できる最大文字数private function initProc():void {
// text1 の端まで文字列を1秒毎にスクロールさせ、10秒そのまま
var timeCheck:Timer = new Timer(1000, MAX_TEXT_SIZE + 10);
timeCheck.addEventListener(TimerEvent.TIMER, onTick);
timeCheck.start();}
// ラベルにセットする文字列の編集
private function onTick(event:TimerEvent):void {// 時間が経過する毎に、表示文字列の前に挿入する全角スペースの数を減らしていく
var blankCnt:int = MAX_TEXT_SIZE - event.target.currentCount;
if (blankCnt <= 0) {
label1.text = TextData;
}
else {
label1.text = (new Array(blankCnt).join(" ")) + TextData;
}}
]]>
</mx:Script>
<mx:Label x="41" y="24" text="この下に文字が流れながら表示されます"/>
<mx:Label x="41" y="50" width="279" id="label1"/></mx:WindowedApplication>
これで、「わたしは宇宙からきたゴリ星人だ。多分、そうだ。」という文字が右手から左手に流れていき、ラベルの一番左まできたら、そこで 10秒間停止・・・という動きをする。(文字列の先頭にスペースをセットし、その数を段々と減らしていくことでスクロールしているように見せている)
こういうのを、setInterval や setTimeout などを使って書くと、もっとごちゃごちゃになる予感。
素直にグローバル変数を使うのが吉。(そもそも、今時、グローバル変数を嫌う理由がない)