今回のシステムは、データベースを中心軸として構成しています。
携帯電話でエントリーが成功すると、その情報がFlash LiteコンテンツからPHPを経由してデータベースへ渡されます。データベース側では、その情報を元にカウントを増やしたり、Flash Liteコンテンツに現在のカウント数と当選結果などを返します。その結果をもとにFlash Liteコンテンツでは、ハズレや当選、受付終了などの状況を表示します。

図5 Flash Liteコンテンツとデータベースとのやりとり
Flashコンテンツは定期的にデータベースの情報を取得し、その状態をコンテンツに表示していきます。Flashコンテンツは、完全にデータベース内の情報によってコンテンツの表示が切り替わるようになっているため、異なるPCで閲覧してもほぼ同期の取れた内容を表示することが可能です(ただし、コンテンツ内のアニメーションは同期しません。カウントアップの状況などが同期します)。

図6 Flashコンテンツとデータベースとのやりとり
データベースの情報をそのままFlashコンテンツへ表示させることは、当初、それほど難しくはないと思っていたのですが、意外と苦労した部分でもあります。参考までに、以下に簡単な Flash コンテンツ側の処理の流れを説明します。
【STEP1】
データベースから定期的に情報を取得するため、下記のような感じでタイマー処理を行っています。一定時間経過するとデータベースにアクセスし情報を取得します。
private function setTimer():void {
//タイマー処理
waitTimer = new Timer(3000, 1);
waitTimer.addEventListener(TimerEvent.TIMER, compTimer);
waitTimer.start();
}
private function compTimer(e:Event):void {
//DB接続
joinDB();
}
【STEP2】
データベースから情報を取得した後、フラグの状況によってコンテンツ表示を振り分けます。抽選会の進行状況も把握するため、「beforeModeState」の変数名を見て分かるように、1つ前の状況を常に記憶させています。
if (startFlag && lotFlag || endFlag && beforeModeState != 0 && beforeModeState != 1) {
//抽選状況表示
showNumberMode();
} else if (startFlag) {
//カウントダウン
showCountDownMode();
beforeModeState = 2;
} else {
//スタート画面
showStandbyMode();
beforeModeState = 1;
}
【STEP3】
まず、スタート画面表示の場合、スタートボタンを表示させる処理を行います。そしてスタートボタン処理も設定し、クリックされた場合、データベース内のスタートフラグをONに変更する処理を行っています。
また、この時、同時にSTEP1のタイマーを再び始動させています。スタート画面時もデータベース監視のタイマーを動作させることで、異なるPC環境でも同期が取れるようになります。
private function showStandbyMode():void {
//スタートボタンの表示処理
:
//タイマー始動
setTimer();
}
//スタートボタン処理
private function standbyClickListener (e:MouseEvent):void {
//スタートフラグをONにする
startFlagOnDB();
}
【STEP4】
スタート画面でボタンが押された場合、データベース内のフラグが変動され、なおかつ一定時間ごとにデータベース接続を行っているので、STEP2の条件分岐がカウントダウンの処理に変更されます。カウントダウンもタイマーを使って表示させていきます。カウントダウンが終了したら、今度はデータベース内の抽選フラグをONに変更する処理を行います。
//カウントダウン開始処理
private function countDownStart():void {
countDownTimeCount = 4;
countDownTimer = new Timer(1000, countDownTimeCount);
countDownTimer.addEventListener(TimerEvent.TIMER, countDownTimerEnd);
countDownTimer.start();
}
//カウントダウン完了処理
private function countDownTimerEnd(e:Event):void {
countDownTimeCount--;
if (countDownTimeCount > 0) {
CountDown.timeTxt.text = countDownTimeCount.toString();
} else {
lotFlagOnDB();
}
}
【STEP5】
カウントダウン後、またデータベース内のフラグが変動されるため、STEP2の条件分岐が抽選状況表示の処理へ変更されます。抽選状況表示の処理では、携帯電話からエントリーされたカウントに合わせ、数値テキストを生成していきます。また、この時に、あまりにも大量のテキストを生成するとFlashコンテンツの表示で処理落ちが発生してしまうため、一定数を超えた場合は個数を制限してテキストが生成するようにしています。つまり、数秒間にエントリー数が何百もあった場合は、数字を飛ばしてテキストを生成することとなります。また、当選数字に関しては、必ず生成されるように処理を行っています。
private function showNumberMode():void {
//生成するテキストの個数の確認
:
//規定以上の個数の場合は制限内に変更
:
//当選数字のチェックと当選数字の生成
:
//通常数値テキスト生成
:
//終了フラグの確認
if (endFlag) {
//抽選終了処理
:
} else {
//抽選継続処理
:
//タイマー始動
setTimer();
}
}
所々の細かい処理は割愛していますが、基本処理としては、常にタイマーを始動させ、データベースの情報を取得、そしてフラグなどの状況によって各表示処理を行うことになります。http://labs180.com/lot/でも概略説明を掲載しているので、参考にしてみてください。