1

私が働いている会社のデジタル サイネージ アプリケーションをフラッシュ cs6 で開発しようとしています。これは実際には 2 つのアプリケーションで構成されています。1 つはサーバー側で、もう 1 つは Windows XP を実行する統合コンピュータを備えた TV ディスプレイにインストールされます。サーバー アプリケーションは、管理者が php を介して mysql データベースに保存されているデータを入力するために使用するフォームに他なりません。それはうまくいっています。

私の問題は、ディスプレイで実行されるクライアントにあります。アプリは実際には非常に単純です。mysql テーブルからロードする必要があるさまざまな種類の情報の「セクション」があるため、サーバーにすべて保存されているテキスト、画像、およびビデオをロードします。ローダーはタイマーと並行して実行されます。タイマーはムービークリップとフレームの呼び出しを担当するため、タイムライン内のすべてをアニメーション化する必要はなく、アプリはループ内のセクションからセクションへと実行され続けます。そして、私が問題を見つけているところがあります。そのようなローダーをタイマーとうまく調和するようにプログラムする適切な方法を見つけることができません。そのため、最終的な結果として、画像とビデオが部分的に読み込まれるかまったく読み込まれず、クライアント アプリが奇妙な方法で実行されます。アプリのセクションの 1 つの例を次に示します。

import flash.utils.Timer;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import fl.transitions.*;
import fl.transitions.easing.*;


var randomNumber:Number = Math.random();
var xAnivItemRef:Number = 75;
var yAnivItemRef:Number = 140;
var anivArray:Array = new Array  ;
var endingTimer:Timer = new Timer(10000);
var loopTimer:Timer = new Timer(500);
var counter:uint = 0;
var fotosURL:String = "http://www.maxionline.com.br/maxi_sds/server/img/aniversariantes/";
var current_time = new Date();
var i:uint = 0;
var alphaTween:Tween;
var aniversariante_mc:MovieClip;
var numAniversariantes:uint;


endingTimer.addEventListener(TimerEvent.TIMER, leaveEvents);
loopTimer.addEventListener(TimerEvent.TIMER, loadAniv);


function setTitleMonth(event:Event = null)
{
          var month:String = current_time.getMonth();
          switch (month)
          {
                    case "0" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "janeiro!";
                              break;


                    case "1" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "fevereiro!";
                              break;


                    case "2" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "março!";
                              break;


                    case "3" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "abril!";
                              break;


                    case "4" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "maio!";
                              break;


                    case "5" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "junho!";
                              break;


                    case "6" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "julho!";
                              break;


                    case "7" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "agosto!";
                              break;


                    case "8" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "setembro!";
                              break;


                    case "9" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "outubro!";
                              break;


                    case "10" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "novembro!";
                              break;


                    case "11" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "dezembro!";
                              break;


                    default :
                              break;
          }
}


function anivSetup(event:Event = null):void
{
          var anivLoader:URLLoader = new URLLoader();
          anivLoader.dataFormat = URLLoaderDataFormat.TEXT;
          anivLoader.load(new URLRequest("http://www.maxionline.com.br/maxi_sds/client/dataRecoverAniv.php?_rand =" + randomNumber));
          anivLoader.addEventListener(Event.COMPLETE, getAnivData);
}


function getAnivData(evt:Event = null):void
{
          var anivDataStr:String = evt.target.data;
          var anivDataArray:Array = anivDataStr.split("&");
          var numItemsStr:String = anivDataArray[anivDataArray.length - 1].substr(5);
          var numItems:Number = Number(numItemsStr) * 4;
          numAniversariantes = numItems/4;
          anivDataArray.splice(anivDataArray.length - 1, 1);


          for (var i:uint=0; i<numItems; i++)
          {
                    anivArray.push(anivDataArray[i]);
          }
          loadAniv();
          anivMask_mc.gotoAndPlay("on");
          endingTimer.start();
          loopTimer.start();
}


function loadAniv(event:Event = null):void
{
          var aniversariante:anivItem_mc = new anivItem_mc();
          aniversariante.name = "aniversariante" + counter;

          if (numAniversariantes > 12)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1355;
                    }
                    if (counter >= 8 && counter < 12)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 8));
                              aniversariante.x = xAnivItemRef + 250;
                    }
                    if (counter >= 12 && counter < 16)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 12));
                              aniversariante.x = xAnivItemRef + 895;
                    }
          }
          if (numAniversariantes > 8 && numAniversariantes <= 12)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1355;
                    }
                    if (counter >= 8 && counter < 12)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 8));
                              aniversariante.x = xAnivItemRef + 250;
                    }
          }
          if (numAniversariantes > 0 && numAniversariantes <= 8)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef + 200;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1150;
                    }
          }
          anivLoader_mc.addChild(aniversariante);
          aniversariante_mc = MovieClip(root).aniv_mc.anivLoader_mc.getChildByName("aniversariante" + counter);
          aniversariante_mc.anivName_txt.text = anivArray[i];
          aniversariante_mc.day_mc.anivDay_txt.text = anivArray[i + 1];


          var imgLoader:Loader = new Loader();
          imgLoader.load(new URLRequest(fotosURL + anivArray[i + 3]));
          imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGR ESS,imageLoading);
          imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,imag eLoaded);


          var fadein:TransitionManager = new TransitionManager(aniversariante_mc);
          fadein.startTransition({type:Fade, direction:Transition.IN, duration:1, easing:Strong.easeOut});


          counter++;
          i = i + 4;


          if (i >= anivArray.length)
          {
                    loopTimer.stop();
                    loopTimer.removeEventListener(TimerEvent.TIMER, loadAniv);
          }
}


function leaveEvents(event:TimerEvent):void
{
          endingTimer.removeEventListener(TimerEvent.TIMER, leaveEvents);
          endingTimer.stop();
          anivMask_mc.gotoAndPlay("off");
          play();
}


function imageLoading(evt:ProgressEvent):void
{
          var loaded:Number = evt.bytesLoaded / evt.bytesTotal;
          updateProgress(loaded);
}


function updateProgress(vl:Number)
{
          aniversariante_mc.photo_mc.preloader_mc.loadingBar_mc.width = vl * aniversariante_mc.photo_mc.preloader_mc.loadingBar_mc.width;
}


function imageLoaded(event:Event):void
{
          var loadInfo:LoaderInfo = (event.target as LoaderInfo);
          aniversariante_mc.photo_mc.photoLoader_mc.addChild(loadInfo.cont ent);
}


anivSetup();
setTitleMonth();


stop();

.fla は次の場所からダウンロードできます。

http://www.maxionline.com.br/maxi_sds/sds_client.fla

アドバイスをいただければ幸いです。

4

2 に答える 2

1

一歩下がって全体像を見る...

サーバーから配信されるコンテンツで Flash を使用してデジタル サイネージ タイプのアプリケーションを構築し、現在 4 年目の更新を開始しています。私の意見では、いくつかの一般的な考え:

  1. プログラムのメイン フローに従来の Flash タイムラインを使用しないでください。代わりに、Actionscript 3 を使用してプログラムですべてを実行します。これにより、正しく表示されない問題が解消されますが、さらに重要なことに、拡張性が向上します。これにより、コンテンツを動的にプラグインするときにもより細かく制御できます。

  2. ループするコンテンツの「プレイリスト」を管理するための最上位の「マネージャー」クラスを用意します。コンテンツの再生が終了したら、マネージャーが次のコンテンツ アイテムをすぐに再生できるように、完了した (または失敗した) ことを "マネージャー" に通知する必要があります。これには、必要に応じてイベント リスナーとハンドラーを追加する必要があり、場合によってはタイマーを置き換えることがあります。

  3. すべてのコードをクラス ファイル (ClassName.as) に保持し、フォルダー (名前空間) に整理します。ランダムなキーフレーム上にあるだけのインライン Actionscript は使用しないでください。[Actionscript にエクスポート] オプションを使用して、ライブラリ アイテムをクラスにリンクできます。

  4. メインクラスをできるだけ小さく保ち、できるだけ多くのコードを個別のクラス ファイルにプッシュします。

  5. ほとんどのアニメーションとトゥイーンは、TweenLiteおよびTimelineMaxファミリーのパッケージを使用して実現できます。

  6. ロゴのようなアニメーションは、独自の MovieClip / ライブラリ オブジェクト / クラスに含まれている必要があるため、どこにでも簡単にプラグインできます。ロゴのアニメーションについては、従来のタイムラインを使用してアニメーション化しても問題ありません (含まれている場合)。

  7. すべてのサーバー コンテンツをマシンにローカルにダウンロードしてから、Flash ですべてローカルに読み取ります。これにより、特にインターネットが行き詰まった場合に、コンテンツを長時間待つ必要がなくなります。

  8. 各コンテンツ タイプ (ビデオ、画像スライド ショー、イントロ アニメーションなど) ごとにクラスを用意します。これにより、カスタム コンテンツをプラグインできます。

  9. できるだけ XML または JSON を使用してください。

それが役立つことを願っています。

于 2013-01-08T20:09:08.683 に答える
-1

「Xibo」と呼ばれるオンラインのオープンソース ソフトウェアを使用することもできます。これは非常に便利で、ニーズに合う可能性があります。https://springsignage.com/xibo-for-android/

于 2014-11-10T23:13:35.433 に答える