2013-01-08 37 views
1

我正在嘗試爲我工作的公司開發數字標牌應用程序,使用flash cs6。它實際上由兩個應用程序組成,一個是服務器端,另一個安裝在具有運行Windows XP的集成計算機的電視顯示器上。服務器應用程序不過是一種管理員通過某些php輸入存儲在mysql數據庫中的數據的表單。這工作正常。數字標牌應用程序(as3)

我的問題是在顯示器中運行的客戶端。該應用程序實際上非常簡單:應該從mysql表中加載不同類型信息的「部分」,因此加載全部存儲在服務器中的文本,圖像和視頻。事情是與定時器並行運行的裝載機。定時器負責調用影片剪輯和框架,這樣我就不需要在時間軸中設置動畫的所有內容,並且應用程序一直在循環中從一個節到另一個節運行。還有我發現問題的地方。我無法找到一種合適的方式來編程這樣的裝載機,並且與定時器一致。所以最終的結果是圖像和視頻部分或從未加載,使得客戶端應用以奇怪的方式運行。這裏的應用程序的部分之一的例子:

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

任何建議將不勝感激!

回答

1

退後一步看大圖...

我已經建立了使用Flash從服務器傳送的內容,目前開始更新的第四個年頭應用的數字標牌類型。在我看來一些一般想法:

  1. 不要使用傳統的Flash時間軸的主流程序。相反,使用Actionscript 3編程式地完成所有的事情。這應該可以消除一些問題,但不能正確顯示,但更重要的是可以實現更大的擴展能力。這也可以讓你更好地控制動態插入內容。

  2. 擁有頂級「經理」級別來管理您將循環播放的內容的「播放列表」。內容播放完畢後,應通知已完成(或失敗)的「管理器」,以便管理器可以立即播放下一個內容項目。這將需要在適用的情況下添加事件監聽器和處理程序,這在某些情況下可能會取代定時器。

  3. 將所有代碼保存在類文件(ClassName.as)中並將它們組織到文件夾(名稱空間)中。沒有任何內聯Actionscript,只是隨機關鍵幀。您可以使用「導出到腳本」選項將庫項目鏈接到類。

  4. 保持您的主類儘可能小,儘可能多地將代碼推出以分離類文件。

  5. 大多數動畫和補間可以使用來自​​和TimelineMax家族的包來完成。

  6. 任何類似於您擁有徽標的動畫應該包含在其自己的MovieClip/Library Object/Class中,以便您可以輕鬆地將其插入任何位置。對於您的徽標動畫,如果使用傳統時間線進行動畫製作,則不會有任何問題。

  7. 在機器上本地下載所有服務器內容,然後讓Flash在本地讀取所有內容。這應該消除長時間等待內容,特別是如果互聯網陷入困境。

  8. 爲每種內容類型(視頻,圖像幻燈片,介紹動畫等)提供一個類。這將允許您插入自定義內容。

  9. 儘可能使用XML或JSON。

我希望有幫助。

+0

謝謝,我去了loadermax,它對整體性能有很大的幫助,我幾乎沒有任何問題,因爲定時器和下載時間都沒有問題。但我仍然在使用一種方法,我不斷地從服務器上下載內容。我明白一個更好的解決方案是下載內容並加載本地文件,同時跟蹤服務器的變化。你有什麼建議可以實現這個目標嗎? –

+0

您想在可以從服務器下載文件並將其寫入磁盤的環境中開發幫助程序。所有的客戶都是基於Windows的嗎?你的服務器運行的是什麼? – ToddBFisher

+0

客戶端在Windows上運行。該服務器是基於Linux的。 –