從這個範例中學會使用ShiVa Flash傳送XML資料給PHP的程式,並請將你的高分紀錄存在伺服器中。
簡介
這個範例是由官方原廠網站所提供,想看原文的朋友請到官方網站唷!ShiVa Flash: XML and crossdomain.xml tutorial。 現在,我們開始寫一個經常會碰到的真實案例吧:那就是利用XML當作介面,把遊戲得高分的資料處存在一台遠端的伺服器中。
File Structure
為了使以下的工作內夠順利完成,我們需要把這個檔案crossdomain.xml放在伺服器的跟目錄中。另外,有一個PHP程式highscore.php和高分資料檔highscore.xml 也要要指定在等一下所撰寫的ShiVa程式唷:我們需要完整的URL路徑, SWF讀目錄放在哪裡就不適那麼重要。

想要了解crossdomain.xml這個XML檔案的結構嗎? 您可以連線到 ShiVa Flash: XML and crossdomain.xml tutorial來觀看。
紀錄遊戲得高分的XML檔案結構
所有德高方的紀錄將會存在一個XML檔案中,他有如下的資料結構:
<HighScore> <entry name="Player 1" score="0815" date="2012-01-02"/> <entry name="Player 2" score="0814" date="2012-01-03"/> <entry name="Player 3" score="0813" date="2012-01-04"/> <entry name="Player 4" score="0812" date="2012-01-05"/> <entry name="Player 5" score="0811" date="2012-01-06"/> </HighScore>
加上一筆個人的得分紀錄,我們必須加上一筆以<entry /> 為標記的元素到清單中。name指的是玩家的姓名,score是指分數,data則是指該紀錄的時間。
利用ShiVa 傳送和接收
整個範例只使用一個很單純的AI,傳送和接收則是使用 states, closely resembling,詳細作法可以參考這篇:
the ShiVa XML manipulation tutorial.
XML_PHP and XML_URL 這兩個變數是公開的,而且需要能夠在所架設的伺服器被設定成可以被讀寫,點選HUD按鈕將會傳送 “onHUDButtonLoadXML” 或是一個 “onHUDButtonSendXML” 的事件給主要的 AI Model, 並且將會呼叫 傳送Send() 和 Receive() 兩個狀態函數
利用PHP網頁程式當作界接橋梁
整個實作程式的核心就是後端的PHP程式碼了,PHP程式碼當作接收、排序、並且將資料寫道XML檔案,為了使整個程序和範例簡單化,也比較容易讓讀者理解,這段PHP範例程式碼幾乎部會處理錯誤的檢查,而且並部會使用 as-is.
<?php //globals ----------------------------------------- $filename = "./highscore.xml"; $linenum = 0; $newxmlarray=array(); //read POST ----------------------------------------- if ( isset($_POST['STContent'] ) ) { //new XML content sent from SHiVa $xml_add = stripslashes($_POST['STContent']); //get the score for sorting later on $grep = strpos( $xml_add, "score=\"" ); $newscore = substr( $xml_add, $grep+7, 4 );
在設定完了全域變數後,範例PHP程式碼接收來自於網路的POST內容,以一個真實的遊戲案例來說,需要確認輸入的正確性。接下來我們將會讀取XML檔案highscore.xml到快取記憶體中,並分析這個檔案裡的所有紀錄,並比較現在最新的一筆紀錄和原有紀錄是否有比原先的玩家們所創下的紀錄還要高。取代和排序的計算方法蠻簡單的,讀者不用擔心。
//read xml to array ----------------------------------------- $lines = file($filename); $countlines = count($lines); foreach($lines as $line) { //search for score, match only 4-figure numbers $moregrep = preg_match ( '/"[0-9]{4}"/', $line ) ; if ($moregrep > 0) { $grep = strpos( $line, "score=\"" ); $oldscore = substr ( $line, $grep+7, 4 ); if ( intval($oldscore) <= intval($newscore) ) { //found lesser score break; } } $linenum += 1; }
接下來,我們將會插入新的一行到XML檔案中,讓我們重組一下新的XML檔案,並把紀錄寫到磁碟中吧。
//compose new XML order----------------------------------- for ( $k=0; $k<$linenum; $k++ ) { $newxmlarray[] = $lines[$k]; } $newxmlarray[] = $xml_add." "; //add our new highscore, including a line break - important! for ( $j=$linenum; $j<=$countlines-1; $j++ ) { $newxmlarray[] = $lines[$j]; } //write xml to disk----------------------------------------- if (is_writable($filename)) { $handle = fopen($filename, 'w'); for ($j=0; $j<count($newxmlarray); $j++) { fwrite( $handle, $newxmlarray[$j] ) ; } fclose($handle); } //----------------------------------------- } else { echo "Error."; } ?>
Flash範例
點選畫面中的圖像,將會開一個新視窗而且將會使用ShiVa Flash的範例。
請注意,目前Flash exporter 還暫時是BETA版,有時候,高分紀錄不會即時地更新,但是傳送的工作將會每次都送出。如果讀者再傳送之後沒有看到任何改變,不要一直點傳送的按鈕,大約經過三十秒後,就可以看到重新整理之後的結果嚕!