2010-05-13 67 views
0

我有一個用Visual Basic編寫的簡單的獨立應用程序,我正在使用PHP/javascript移植到基於瀏覽器的應用程序。將Flash變量傳遞給PHP

原始的VB應用程序有一些簡單的帶有令牌和點計數器的嵌入式Flash遊戲。令牌和積分值作爲應用程序和遊戲之間的變量傳遞。

我想在不修改動作代碼(使用已存在的動作中的變量)的情況下在我的PHP端口中實現相同的效果。

下面是Visual Basic代碼與加載從數據庫中的值,併發布該值閃爍使用Flash變數:

Private Sub loadPlayer() 

    Try 

     If CtblPoints.CheckPointsByID(mCard) Then 

      objPoints = CtblPoints.GettblPointsByID(mCard) 
      objPlayerAc = CtblPlayerAccount.GettblPlayerAccountByPlayerID(objPoints.AccountId) 
      objPlayer = CtblPlayer.GettblPlayerByID(objPlayerAc.PlayerID) 
      objPlayerBal = CtblPlayerBalance.GettblPlayerBalanceByID(objPlayerAc.PlayerID) 


      objPlayerAcDetail = CtblPlayerAccountDetail.GettblPlayerAccountDetailByAmount(objPoints.AccountId) 
      strTotalPoints = Convert.ToString(objPlayerAc.Points) 
      strTotalWin = Convert.ToString(objPlayerBal.TokenAmount) 

      'Dim intTokenAmount As Decimal = Convert.ToDecimal(objPlayerBal.TokenAmount) 
      'strTotalWin = Convert.ToString(Convert.ToInt64(intTokenAmount * 100)) 

      flashPlayer.Size = panelGame.Size 
      flashPlayer.FlashVars = "totalEntries=" & strTotalPoints & "&credit=" & strTotalWin 
      flashPlayer.LoadMovie(0, strGameFile) 
      flashPlayer.Play() 

     Else 
      Me.Close() 
      Dim frmInvCrd As New frmInvalidCard 
      frmInvCrd.ShowDialog() 
     End If 


    Catch ex As Exception 

    End Try 

我試圖在PHP重建這一點,但我在一個損失以及如何開始實施它。

閃光燈的變量公開宣佈,並使用全球進口:

import com.atticmedia.console.*; 
import flash.display.*; 
import flash.events.*; 
import flash.geom.*; 
import flash.media.*; 
import flash.net.*; 
import flash.system.*; 
import flash.utils.*; 

變量「爲totalEntries」首先聲明:

public var totalEntries:int = 0; 

,這是被用來爲totalEntries的SNIP動作

public function notifyServerOfUnwonCredits(param1) 
    { 
     var remainder:* = param1; 
     if (this.useServer) 
     { 
      this.targetWinAmount = 0; 
      this.cancelUpdateOverTime = F9.setEnterFrame(this.updateOverTime); 
      fscommand("OverTime", "" + remainder); 
      this.flashVarsUpdatedAction = function() 
     { 
      originalTotalWin = totalWin; 
      return; 
     }// end function 
     ; 
     } 
     else 
     { 
      this.setTotalEntries(100000); 
      this.setTotalWin(0); 
     } 
     return; 
    }// end function 

最終我會將這些值傳回給myS QL數據庫。

任何洞察到這將是非常有益的, 謝謝!

回答

0

PHP不能這樣工作;它不會坐在一起,處於持續的狀態,您可以隨時聯繫和交談。您需要一種機制來向無狀態後端發送和接收數據。幸運的是,Flash可以很好地處理cookies,因此使用PHP會話不會產生問題。所以,問題是您是要通過Flash將數據傳遞給PHP,還是通過Flash將這些變量傳遞給Javascript,然後將它們發送給PHP。

直接通過閃存路線(多多包涵,這是AS 2.0,但應工作):

的ActionScript:

function getData (path:String, req:Object, fn:Function) { 
    var q:Object = new LoadVars(); 
    for (var prop in req) { 
     q[prop] = req[prop]; 
    } 
    q.action = path; 
    q.onLoad = fn; 
    q.sendAndLoad("/hooks/integrate.php",q,"POST"); 
} 

在這個例子中,我傳遞給一個單獨的文件,並指定一個POST參數「action」,告訴處理文件我想做什麼。

<?php 
if (!isset($_POST['action'])) { die; } 
switch($_POST['action']) { 
    case 'something': 
// snip... 
} 

,然後調用函數是一個單元:

getData('saveVar',{varname: 'foo', varvalue: foo},mySuccessFunction); 

或者,你可以通過使用flash.external.ExternalInterface.call()方法,但建立這樣使用XHR/AJAX一些設置,並通過變量爲Javascript一個解決方案超出了這個答案的範圍。由於PHP本質上是一種無狀態的基於請求的Web服務,所以沒有像VB中那樣快速簡單的方法來做到這一點;你將不得不採用另一種機制。

+0

感謝您的迴應,這爲我清除了一些東西。 雖然如果你不介意,還有更多的問題。 如果我使用JavaScript作爲中間人將一個變量傳遞給PHP,我是否還需要對現有的動作進行更改?我知道你是關於PHP是一個無狀態的基於請求的Web服務的觀點,但JavaScript的方式是一樣的嗎? 我想這個問題有種解決方法:有什麼我可以做,以避免修改現有的actionscript代碼庫? – Vorathe 2010-05-14 13:26:44

+0

這可能是可能的,因爲只要頁面沒有刷新,JavaScript就會保持活動和持久性,認爲如果您將變量傳遞給PHP,它應該沒關係。我假設你的Flash應用程序會自動將你想要的任何變量作爲自己的屬性使用,所以你可以爲它們進行輪詢,但說實話,我通常使用'flash.external.ExternalInterface.call'來與JavaScript進行通信,所以我不完全確定。 – Dereleased 2010-05-14 22:35:32