2012-11-29 60 views
3

我想通過HTTP向我的web服務器發佈並獲取我的UDKGame的Highscores,在線Mysql數據庫,Scaleform 4(AS3)和PHP。不幸的是,考慮到這個文件,我認爲這可能是不可能的:http://gameware.autodesk.com/documents/gfx_4.0_flash_support.pdfUDK Scaleform 4 AS3跨域URLRequest可能嗎?

我試過從我的GFx電影播放器​​發送一個URLRequest,但它似乎不起作用。我的繼承人AS3代碼,我在第1幀,使用我的GFx的電影播放器​​:

getScore(); 

function getScore():void { 
//var url:String = "http://myserver.com/getScore.php"; 
    var request:URLRequest = new URLRequest(url); 
    var requestVars:URLVariables = new URLVariables(); 
    requestVars.foo = "bar"; 
    request.data = requestVars; 
    //request.method = URLRequestMethod.POST; 
    //Security.allowDomain("myserver.com"); 
    //var context:LoaderContext = new LoaderContext(); 
    //context.securityDomain = SecurityDomain.currentDomain 

    var urlLoader:URLLoader = new URLLoader(); 
    urlLoader = new URLLoader(); 
    urlLoader.dataFormat = URLLoaderDataFormat.TEXT; 
    urlLoader.addEventListener(Event.COMPLETE, loaderCompleteHandler, false, 0, true); 
    urlLoader.load(request); 

    } 

function loaderCompleteHandler(e:Event):void { 
    trace(e.target.data); 
    Object(this).response.text= "response:"+e.target.data; 

} 

有沒有什麼辦法來實現我的目標,而無需編寫一個.dll或使用手動TCP連接到我的網絡服務器?

回答

2

不幸的是,UDK附帶的Scaleform(4.0.16)沒有內置任何網絡支持。您必須讓UDK通過dll綁定或其他方法來解決問題。 Scaleform 4.2增加了網絡支持,但該版本的Scaleform尚未完全集成到UDK中。它正處於整合過程中,所以我們很快就會看到它。

0

確實SF4.0不支持。 SF4.2 也許這樣做,它只能通過Epic的Perforce軟件倉庫向UE3許可證持有者提供。

你可以在非信息中做到這一點。然而,使用dll或TCP連接有點矯枉過正。使用HttpRequestInterface。以下是UDK提供的源代碼示例的示例。這非常簡單,你可以將它縮減爲只需幾行即可調用web服務的嚴格必要條件。

/** 
* Simple function to illustrate the use of the HttpRequest system. 
*/ 
exec function TestHttp(string Verb, string Payload, string URL, optional bool bSendParallelRequest) 
{ 
    local HttpRequestInterface R; 

    // create the request instance using the factory (which handles 
    // determining the proper type to create based on config). 
    R = class'HttpFactory'.static.CreateRequest(); 
    // always set a delegate instance to handle the response. 
    R.OnProcessRequestComplete = OnRequestComplete; 
    `log("Created request"); 
    // you can make many requests from one request object. 
    R.SetURL(URL); 
    // Default verb is GET 
    if (Len(Verb) > 0) 
    { 
     R.SetVerb(Verb); 
    } 
    else 
    { 
     `log("No Verb given, using the defaults."); 
    } 
    // Default Payload is empty 
    if (Len(Payload) > 0) 
    { 
     R.SetContentAsString(Payload); 
    } 
    else 
    { 
     `log("No payload given."); 
    } 
    `log("Creating request for URL:"@URL); 

    // there is currently no way to distinguish keys that are empty from keys that aren't there. 
    `log("Key1 ="@R.GetURLParameter("Key1")); 
    `log("Key2 ="@R.GetURLParameter("Key2")); 
    `log("Key3NoValue ="@R.GetURLParameter("Key3NoValue")); 
    `log("NonexistentKey ="@R.GetURLParameter("NonexistentKey")); 
    // A header will not necessarily be present if you don't set one. Platform implementations 
    // may add things like Content-Length when you send the request, but won't necessarily 
    // be available in the Header. 
    `log("NonExistentHeader ="@R.GetHeader("NonExistentHeader")); 
    `log("CustomHeaderName ="@R.GetHeader("CustomHeaderName")); 
    `log("ContentType ="@R.GetContentType()); 
    `log("ContentLength ="@R.GetContentLength()); 
    `log("URL ="@R.GetURL()); 
    `log("Verb ="@R.GetVerb()); 

    // multiple ProcessRequest calls can be made from the same instance if desired. 
    if (!R.ProcessRequest()) 
    { 
     `log("ProcessRequest failed. Unsuppress DevHttpRequest to see more details."); 
    } 
    else 
    { 
     `log("Request sent"); 
    } 
    // send off a parallel request for testing. 
    if (bSendParallelRequest) 
    { 
     if (!class'HttpFactory'.static.CreateRequest() 
      .SetURL("http://www.epicgames.com") 
      .SetVerb("GET") 
      .SetHeader("Test", "Value") 
      .SetProcessRequestCompleteDelegate(OnRequestComplete) 
      .ProcessRequest()) 
     { 
      `log("ProcessRequest for parallel request failed. Unsuppress DevHttpRequest to see more details."); 
     } 
     else 
     { 
      `log("Parallel Request sent"); 
     } 
    } 
} 


/** Delegate to use for HttpResponses. */ 
function OnRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface Response, bool bDidSucceed) 
{ 
    local array<String> Headers; 
    local String Header; 
    local String Payload; 
    local int PayloadIndex; 

    `log("Got response!!!!!!! Succeeded="@bDidSucceed); 
    `log("URL="@OriginalRequest.GetURL()); 
    // if we didn't succeed, we can't really trust the payload, so you should always really check this. 
    if (Response != None) 
    { 
     `log("ResponseURL="@Response.GetURL()); 
     `log("Response Code="@Response.GetResponseCode()); 
     Headers = Response.GetHeaders(); 
     foreach Headers(Header) 
     { 
      `log("Header:"@Header); 
     } 
     // GetContentAsString will make a copy of the payload to add the NULL terminator, 
     // then copy it again to convert it to TCHAR, so this could be fairly inefficient. 
     // This call also assumes the payload is UTF8 right now, as truly determining the encoding 
     // is content-type dependent. 
     // You also can't trust the content-length as you don't always get one. You should instead 
     // always trust the length of the content payload you receive. 
     Payload = Response.GetContentAsString(); 
     if (Len(Payload) > 1024) 
     { 
      PayloadIndex = 0; 
      `log("Payload:"); 
      while (PayloadIndex < Len(Payload)) 
      { 
       `log(" "@Mid(Payload, PayloadIndex, 1024)); 
       PayloadIndex = PayloadIndex + 1024; 
      } 
     } 
     else 
     { 
      `log("Payload:"@Payload); 
     } 
    } 
}