Flash處理外部XML文檔數據_Flash教程
推薦:FLASH網游通過XMLSocket與VB后臺通信前段時間用Flash做了個網游的Demo,通訊用的是Socket。曾承諾寫個教程,現在有空就把它寫寫吧。先從FLASH說起。我要達到的效果是點擊地面,人物就走到點擊的地
預備:
首先你得有臺電腦.其次是要裝上Windows系統和Flash8.
XML基礎:
既然是處理XML文檔.就要先來了解下XML文檔.下面是我所了解的,有些是在Flash中用不到的.
XML擴展標記語言(Extensible Markup Language)是SGML(Structured Generalized Markup Language)的子集.
XML是由World Wide Web Consortium(W3C)的XML工作組定義的.
下面開始了解XML的結構:
XML是由序言和文檔元素組成的.
序言包括:
- 聲明(declaration),文檔的第一行,它說明這是一個XML文檔. [可選]
- 注釋,增強文檔的可讀性. [可選]
- 文檔類型聲明(document type declaration),XML文檔類型定義必須在XML聲明之后,文檔元素之前,中間可以插入XML處理指令,它說明文檔的類型和結構. [可選]
- 處理指令(processing instruction),在XML聲明之后,處理XML信息的指令. [可選]
注:文檔類型聲明(document type declaration)需要用到xml詞匯表.假如想了解具體信息請訪問http://www.w3c.org.
文檔元素:
元素說明了文檔的邏輯結構,元素包函起始標簽,元素內容,元素屬性和結束標簽.一個xml文檔必須有一個頂層元素,所有的元素都嵌套在這個頂層元素中.文檔元素名,屬性名全部都是自定義的.
說明:
先看代碼:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<!--xml注釋-->
<!DOCTYPE ChooseFlash>
<!--<!DOCTYPE 類型 SYSTEM "一個dtd文件的地址" >沒有地址或地址錯誤都會出錯,SYSTEM 一個要害字-->
<?xml-stylesheet type="text/css" href="處理xml文檔信息的css.css"?>
<元素>
<子元素 屬性="子元素">信息</子元素>
</元素>
上面是一個加了文檔類型聲明,處理指令的簡單xml文檔.下面一一解釋.
<?xml version="1.0" encoding="gb2312"?>
這句是xml的聲明信息.version是版本號,encoding是字符編碼,假如有中文就需要用gb2312編碼,standalone屬性可以取yes和no,屬性值yes,說明文檔沒有外部聲明.屬性值no,說明文檔有外部聲明.
<!--xml注釋-->
這句是xml的注釋.
<!DOCTYPE ChooseFlash>
這句是文檔類型聲明,DOCTYPE標記是聲明類型用的.ChooseFlash是類型.這里的類型是指xml中的詞匯表.
<?xml-stylesheet type="text/css" href="處理xml文檔信息的css.css"?>
這句是處理指令,xml-stylesheet是一個處理指令,type是類型,href是地址.這個處理指令把CSS鏈接到XML文檔.跟html中應用css差不多一樣.
<元素>
<子元素 屬性="子元素">信息</子元素>
</元素>
這個是文檔元素(Flash用節點表示).<元素>是頂層元素,<子元素>是嵌套在頂層元素中的元素,"屬性"是一個屬性,"信息"是字符串.
也可以這樣寫: <子元素 屬性="子元素" 信息="信息" />
假如用了文檔類型聲明,頂層元素命名最好跟聲明的類型一至.否則會出錯(要有詞匯表時,像這個ChooseFlash這不會出錯,因為沒有這個詞匯表.)
下面是一個完整xml文檔:
<?xml version="1.0" encoding="gb2312"?>
<!--firstNode是一個頂層元素-->
<firstNode>
<!--childNode是一個嵌套在頂層元素firstNode中的子級元素,有一個nodeName的屬性-->
<childNode nodeName="childNode">childNode</childNode>
</firstNode>
好,xml方面就到這里.--假如有錯,請指教.假如想了解具體信息的請訪問:http://www.w3c.org.
下面就是怎么在Flash中調用XML文檔和處理XML中的數據.
Flash方面:
在Flash中調用xml文檔需要用到XML類和XMLNode類中的一些方法和屬性.這里我們就不需要用到那么多.把用到的方法和屬性列出來:
XML類:
- XML.ignoreWhite;//處理xml文檔中的空白,設為true時,忽略空白,默認值為false.
- XML.load("xml文檔的地址");//加載指定的xml文檔.
- XML.onLoad=function(success:Boolean){};//成功加載了xml文檔時調用.
- XML構造函數.
XMLNode類:
- XMLNode.attributes;//用來指定xml文檔對象節點的屬性.
- XMLNode.childNodes;//返回指定xml文檔對象的子級的數組.
- XMLNode.firstChild;//引用父級節點的子級列表中的第一個子級.
- XMLNode.nodeValue;//返回XML對象的節點值.
- XMLNode.nodeName;//XML 對象的節點名稱
開始實驗:
首先說明:
在xml聲明處加上encoding="gb2312".使用gb2312編碼.;
Flash中假如有中文需要在加載代碼前面加上System.useCodepage = true;
使用系統編碼.防止亂碼.
實驗1:
一個簡單的實驗.把xml文檔中的節點在Flash輸出來.
新建一個xml文檔.在記事本輸入下面的代碼.保存為 xml-001.xml ;
<?xml version="1.0"?>
<!--xml-001.xml-->
<firstNode name="1">
<childNode name="1.1" />
<childNode name="1.2" />
<childNode name="1.3" />
</firstNode>
上面是一個簡單的xml文檔.結構是一個頂層節點中嵌套三個子級節點.現在在Flash中如何讀出來呢?
來看操作:
打開Flash,新建一個Flash文檔,保存到剛才的xml文檔中的目錄中,命名 xml-001.fla ;
在第一幀輸入下面代碼:
//xml-001.fla.
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-001.xml文檔.
myxml.load("xml-001.xml");
//調用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//輸出頂層節點的節點名和頂層節點中屬性name的值.
trace(myxml.firstChild.nodeName ":" myxml.firstChild.attributes.name);
//用一個數組來引用頂層節點中子級節點的數組.
var child_arr:Array = myxml.firstChild.childNodes;
//用嵌套for語句遍歷出xml文檔中的所有數據.
//這個for遍歷的是頂層節點下的子級節點.
for (var i = 0; i<child_arr.length; i ) {
//輸出頂層節點下的子級節點的節點名和頂層節點下的子級節點中屬性name的值.
trace(child_arr[i].nodeName ":" child_arr[i].attributes.name);
}
} else {
trace("加載失敗!");
}
};
實驗2:
現在做的是把一個多層嵌套節點的xml文檔在Flash中輸出來.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-002.xml
<?xml version="1.0"?>
<!--xml-002.xml-->
<firstNode name="1">
<childNode name="1.1">
<Node name="1.1.1" />
<Node name="1.1.2" />
<Node name="1.1.3" />
</childNode>
<childNode name="1.2">
<Node name="1.2.1" />
<Node name="1.2.2" />
<Node name="1.2.3" />
</childNode>
<childNode name="1.3">
<Node name="1.3.1" />
<Node name="1.3.2" />
<Node name="1.3.3" />
</childNode>
</firstNode>
上面是一個多層嵌套節點的xml文檔.結構是一個頂層節點中,嵌套3個子級節點,3個子級節點分別嵌套3個子級節點.現在又應該怎樣在Flash中讀出來呢?其實原理跟上面一樣.在for中嵌套一個for就可以了.
打開Flash新建一個Flash文檔,保存到剛才的xml文檔的目錄中,命名為 xml-02.fla
在第一幀中輸入以下代碼:
//xml-002.fla.
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-002.xml文檔.
myxml.load("xml-002.xml");
//調用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//輸出頂層節點的節點名和頂層節點中屬性name的值.
trace(myxml.firstChild.nodeName ":" myxml.firstChild.attributes.name);
//用一個數組來引用頂層節點中子級節點的數組.
var child_arr:Array = myxml.firstChild.childNodes;
//用嵌套for語句遍歷出xml文檔中的所有數據.
//這個for遍歷的是頂層節點下的子級節點.
for (var i = 0; i<child_arr.length; i ) {
//輸出頂層節點下的子級節點的節點名和頂層節點下的子級節點中屬性name的值.
trace(child_arr[i].nodeName ":" child_arr[i].attributes.name);
//這個for遍歷的是頂層節點下的子級節點下的子級節點.
for (var j = 0; j<child_arr[i].childNodes.length; j ) {
//輸出頂層節點下的子級節點下的子級節點的節點名 和 頂層節點下的子級節點下的子級節點中屬性name的值.不要暈.看看輸出面板就會明白它們之間的關系了哦.
trace(child_arr[i].childNodes[j].nodeName ":" child_arr[i].childNodes[j].attributes.name);
}
}
} else {
trace("加載失敗!");
}
};
實驗3:
利用xml文檔數據做用戶登錄.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-003.xml
<?xml version="1.0" encoding="gb2312"?>
<!--xml-003.xml-->
<UserDataList>
<manager Post="經理">
<UserData username="MChooseFlash01" password="MChooseHappiness" />
<UserData username="MChooseFlash02" password="MChooseHappiness" />
</manager>
<Employee Post="職員">
<UserData username="EChooseFlash01" password="EChooseHappiness" />
<UserData username="EChooseFlash02" password="EChooseHappiness" />
</Employee>
</UserDataList>
首先分析下結構:
<UserDataList>是頂層節點.
<manager Post="經理">是頂層節點下的子級節點.Post是manager節點的屬性.
<Employee Post="職員">是頂層節點下的子級節點.Post是Employee節點的屬性.
<UserData username="MChooseFlash01" password="MChooseHappiness" /> 是頂層節點下的子級節點下的子級節點.username和password是UserData節點的屬性.
這次也需要用到嵌套for.
- 打開Flash新建一個Flash文檔,大小為300*100,保存到剛才的xml文檔的目錄中,命名為 xml-03.fla
- 新建3個圖層分別命名Actions , cont , bg .
- bg層在第一幀畫三個文本框大小的虛線框.
- cont層在第一幀拉二個輸入文本框,實例名分別為username_txt和password_txt,再拉一個動態文本框,實例名為status_txt.將這三個文本框對齊須虛線框.再點窗口->公用庫->按鈕.拉一個按鈕出來.實例名為login_btn.
如圖:
Actions層在第一幀中輸入以下代碼:
//xml-003.fla.
//使用系統編碼.防止亂碼.
System.useCodepage = true;
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-002.xml文檔.
myxml.load("xml-003.xml");
//調用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
login_btn.onRelease = function()
{
//用一個數組來引用頂層節點中子級節點的數組.
var child_arr:Array = myxml.firstChild.childNodes;
//用UserData指定xml文檔節點的attributes對象.
var UserData:Object;
//這個for遍歷的是頂層節點下的子級節點.
for (var i = 0; i<child_arr.length; i ) {
//這個for遍歷的是頂層節點下的子級節點下的子級節點.
for (var j = 0; j<child_arr[i].childNodes.length; j ) {
//用UserData指定child_arr[i].childNodes[j].attributes對象
UserData = child_arr[i].childNodes[j].attributes;
//判定用戶名和密碼.
//這里的UserData.username其實就是child_arr[i].childNodes[j].attributes.username的簡寫.UserData.password同理.
//username和password是xml文檔節點中的屬性.因為xml和Flash區分大小寫.所以在輸入時要注重大小寫.
if ((username_txt.text == UserData.username) && (password_txt.text == UserData.password)) {
//Post這個是頂層節點下子級節點的Post屬性.
status_txt.text = child_arr[i].attributes.Post ":" UserData.username "登錄成功";
//假如用戶名和密碼正確就退出for.這個重要.假如不用這個,就會一直重復判定用戶名和密碼.直到將xml文檔節點遍歷完.那樣就不是我們想要的.所以一有正確的就退出for;
return;
} else {
status_txt.text = "用戶名或密碼錯誤";
}
}
}
};
} else {
trace("加載失敗!");
}
};
實例4:
利用List組件做個mp3播放列表.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-004.xml
<?xml version="1.0" encoding="gb2312"?>
<mp3List>
<mp3 path="jmzcg.mp3">啊桑-寂寞在唱歌</mp3>
<mp3 path="jmjywsls.mp3">寂寞是因為思念誰</mp3>
<mp3 path="szwspdxd.mp3">老狼-睡在我上鋪的兄弟</mp3>
<mp3 path="qf.mp3">誓言-求佛</mp3>
<mp3 path="xyzth.mp3">下一站天后</mp3>
<mp3 path="nswdxfm.mp3">伊能靜-你是我的幸福嗎</mp3>
<mp3 path="aqfx.mp3">愛情復興(容祖兒)</mp3>
<mp3 path="qrlg.mp3">水木年華-秋日戀歌</mp3>
<mp3 path="qnyh.mp3">張國榮-倩女幽魂</mp3>
<mp3 path="a.mp3">皇綴馨艫撓⑽母?酒吧里常放)</mp3>
</mp3List>
xml結構:
<mp3List>xml文檔中的頂層節點.
<mp3 path="jmzcg.mp3">啊桑-寂寞在唱歌</mp3>頂層節點下的子級節點.path是mp3節點下的屬性."啊桑-寂寞在唱歌"是mp3的節點值.
- 打開Flash新建一個Flash文檔,大小為200*150,保存到剛才的xml文檔的目錄中,命名為 xml-04.fla
- 新建2個圖層分別命名Actions , cont .
- cont層中拉一個List組件到第一幀.大小為200*150,實例名為mp3_list.
- Actions層第一幀輸入下面代碼:
//xml-004.fla.
//使用系統編碼.防止亂碼.
System.useCodepage = true;
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-004.xml文檔.
myxml.load("xml-004.xml");
//調用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//用一個數組來引用頂層節點中子級節點的數組.
var child_arr:Array = myxml.firstChild.childNodes;
//這個for遍歷的是頂層節點下的子級節點.
for (var i = 0; i<child_arr.length; i ) {
//將歌曲添加到List組件中.
//child_arr[i].firstChild.nodeValue這個是xml節點的節點值.
//child_arr[i].attributes.path這個是xml節點下的path屬性.
mp3_list.addItem({label:(i 1) "." child_arr[i].firstChild.nodeValue, data:child_arr[i].attributes.path});
}
} else {
trace("加載失敗!");
}
};
//listEvent函數是執行List組件中change事件
function listEvent():Void
{
//這個就是歌曲地址.用Sound類的loadSound方法就可以播放歌曲了.例:mysound.loadSound(mp3_list.selectedItem.data);具體請看幫助文檔.
trace(mp3_list.selectedItem.data);
}
//添加幀聽器.
mp3_list.addEventListener("change", listEvent);
ASP
ASP生成XML文檔.常用的是利用ASP將數據庫中的數據用XML文檔格式顯示.方便Flash調用或應用在其它方面.
ASP基礎這里就不做說明了,不過會盡量讓大家都明白(不明白的請提問).
說明:
因為是訪問ASP,需要通過IIS,Flash默認是訪問本地文件的.不能訪問網絡.所以要將訪問本地改成訪問網絡.
在 文件-->發布設置-->Flash 選項卡的最下面的"本地回放安全性"選項中的"只訪問本地文件"改成 "只訪問網絡",
下面發布的Flash,如沒非凡說明,都按此設置.
實驗5:
先做一個簡單的實驗.用ASP生成XML文檔.
打開記事本,輸入下面的代碼,然后保存為 xml-005.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
'xml-005.asp
'設置文檔類型
Response.ContentType="text/xml"
'輸出XML文檔,用一個Response.Write()就可以做到的.這樣寫便于大家理解.
Response.Write("<?xml version='1.0'?>")
Response.Write("<!--xml-005.asp-->")
Response.Write("<firstNode name='1'>")
Response.Write("<childNode name='1.1' />")
Response.Write("<childNode name='1.2' />")
Response.Write("<childNode name='1.3' />")
Response.Write("</firstNode>")
%>
打開IIS新建一個網站,別名xml,路徑為剛才的asp文件的目錄.
然后在IIS中瀏覽剛才的asp文件,看到的就是一個xml文檔,不同的就是后綴名,寫法.
那現在怎樣在Flash中調用呢?
很簡單.打開之前的 xml-001.fla 文件,
將加載xml的地址改成 xml-005.asp 文件的地址就行了.
例:
myxml.load("http://localhost/xml/xml-005.asp");
但這樣還不行.還要加上個隨機數,防止調用緩存.改成下面這樣.
myxml.load("http://localhost/xml/xml-005.asp?ran=" Math.random(9999));
這個效果跟之前做的xml-001.fla效果是一樣的.只是xml文檔換成asp生成的了.
實驗6:
這個實驗跟上面的差不多.但數據是從數據庫中調出來的.這樣做就能很方便的更新數據了.
數據庫:
打開Access數據庫,新建一個空白數據庫,命名為 Data.mdb,保存到之前asp文件的目錄中.
再點 使用設計器創建表,新建二個表,表名分別為:
--------------------------------------------------
first
child
--------------------------------------------------
first表中:
輸入二個字段,分別為:
--------------------------------------------------
firstID 自動編號
name 文本
--------------------------------------------------
在 firstID 字段點右鍵-->主鍵,保存,
打開first表.在name字段輸入一條數據,數據為:
--------------------------------------------------
1
--------------------------------------------------
保存.
child表中:
輸入二個字段,分別為:
--------------------------------------------------
childID 自動編號
name 文本
--------------------------------------------------
在 childID 字段點右鍵-->主鍵,保存.
打開child表.在name字段輸入三條數據,數據分別為:
--------------------------------------------------
1.1
1.2
1.3
--------------------------------------------------
保存.關閉數據庫.
數據庫到這可以了.下面是ASP:
打開記事本,輸入下面的代碼,然后保存為 xml-006.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
'xml-006.asp
dim conn,rs,sqlcom
'設置文檔類型
Response.ContentType="text/xml"
Response.Write("<?xml version='1.0'?>")
Response.Write("<!--xml-006.asp-->")
'創建連接對象
Set conn=Server.CreateObject("Adodb.Connection")
'這里用字符串方法連接數據庫.
'"Provider=Microsoft.Jet.OLEDB.4.0; 這個是數據庫驅動.
'Data Source="Server.MapPath("Data.mdb") 數據庫文件的相對路徑.
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("Data.mdb")
'創建記錄集對象.
Set rs=Server.CreateObject("Adodb.RecordSet")
'查詢數據庫的sql語句.因為 first 是SQL中的要害字,所以要用中括號括起來.
sqlcom="select * from [first]"
'執行sql語句.
'1,1 只讀.
'1,3 可讀可寫.
rs.Open sqlcom,conn,1,1
'假如記錄集中有數據.
if not rs.eof then
'輸出XML節點,rs("name")是first表中字段name的數據.
Response.Write("<firstNode name='"&rs("name")&"'>")
end if
'關閉記錄集
rs.Close
'查詢數據庫的sql語句.
sqlcom="select * from child"
'執行sql語句.
rs.Open sqlcom,conn,1,1
'用for語句將數據庫中的數據循環出來.
for k=1 to rs.RecordCount
'輸出XML節點,rs("name")是child表中字段name的數據.
Response.Write("<childNode name='"&rs("name")&"' />")
'移到下一條數據
rs.MoveNext
Next
'結束firstNode節點
Response.Write("</firstNode>")
'關閉記錄集
rs.Close
'釋放記錄信對象
Set rs=nothing
'關閉連接
conn.Close
'釋放連接對象
Set conn=nothing
%>
然后在IIS中瀏覽xml-006.asp文件,會跟實驗5的asp輸出xml文檔一樣的.
在Flash中還是跟實驗5一樣調用.
實驗7:
重新做實驗3,不過XML文檔數據從數據庫中調用.
用戶登錄不推薦使用XML.推薦在ASP或其它語言中,做隱式判定.
了解:
ASP請點:
JSP請點:
這個還是要講的.便于理解下一個實驗.
數據庫:
打開Data.mdb數據庫.新建二個表.
表名分別為:
--------------------------------------------------
post
user
--------------------------------------------------
post表中:
輸入二個字段:分別為:
--------------------------------------------------
postID 自動編號
postName 文本
--------------------------------------------------
在 postID 字段點右鍵-->主鍵,保存.
打開post表,在postName字段輸入二條數據,數據分別為:
--------------------------------------------------
經理
職員
--------------------------------------------------
保存.
user表中:
輸入四個字段,分別為:
--------------------------------------------------
userID 自動編號
username 文本
password 文本
postName 文本
--------------------------------------------------
在 userID 字段點右鍵-->主鍵,保存.
打開user表,分別在username,password,postName字段輸入四條數據,數據分別為:
--------------------------------------------------
username password postName
MChooseFlash01 MChooseHappiness 經理
MChooseFlash02 MChooseHappiness 經理
EChooseFlash01 EChooseHappiness 職員
EChooseFlash02 EChooseHappiness 職員
--------------------------------------------------
保存.關閉數據庫.
數據庫到這可以了.下面是ASP:
打開記事本,輸入下面的代碼,然后保存為 xml-007.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
'xml-007.asp
dim conn,rs,sqlcom,post_arr
'設置文檔類型.
Response.ContentType="text/xml"
'輸出XML文檔.
Response.Write("<?xml version='1.0' encoding='gb2312'?>")
Response.Write("<!--xml-007.asp-->")
Response.Write("<UserDataList>")
'創建連接對象.
Set conn=Server.CreateObject("Adodb.Connection")
'這里用字符串方法連接數據庫.
'"Provider=Microsoft.Jet.OLEDB.4.0; 這個是數據庫驅動.
'Data Source="Server.MapPath("Data.mdb") 數據庫文件的相對路徑.
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("Data.mdb")
'創建記錄集對象.
Set rs=Server.CreateObject("Adodb.RecordSet")
'查詢數據庫的sql語句.
sqlcom="select * from post"
'執行sql語句.
'1,1 只讀.
'1,3 可讀可寫.
rs.Open sqlcom,conn,1,1
'重定義數組.
'rs.RecordCount 記錄集中總的記錄數.
Redim post_arr(rs.RecordCount)
'用for語句將post表中的數據循環出來.
'Ubound數組的最大上標.
for i=1 to Ubound(post_arr)
'將post表中的postName字段中的值存入數組post_arr.
post_arr(i)=rs("postName")
'移到下一條數據.
rs.MoveNext
Next
'這里用了嵌套for語句,
'第一個for j是將post_arr數組中的數據讀出來.也就是post表中的數據.
'第二個for k是將user表中的數據讀出來.
'用for語句將post_arr數組中的數據循環出來.
for j=1 to Ubound(post_arr)
'關閉記錄集.
rs.Close
'查詢數據庫的sql語句.
'根據post_arr(j)數組中的值為條件來重復執行sql語句.
'user是SQL中的要害字.要用中括號括起來.
sqlcom="select * from [user] where post='"&post_arr(j)&"'"
'執行sql語句.
rs.Open sqlcom,conn,1,1
'輸出XML節點.
Response.Write("<Post post='"&post_arr(j)&"'>")
'用for語句將user表中的數據循環出來.
for k=1 to rs.RecordCount
'輸出XML節點.
Response.Write("<UserData username='"&rs("username")&"' password='"&rs("password")&"' />")
'移到下一條數據.
rs.MoveNext
Next
'結束Post節點.
Response.Write("</Post>")
Next
'結束UserDataList節點.
Response.Write("</UserDataList>")
'釋放記錄信對象.
Set rs=nothing
'關閉連接.
conn.Close
'釋放連接對象.
Set conn=nothing
%>
在IIS中瀏覽xml-007.asp文件.跟實驗3中的xml文檔大致一樣.
打開實驗3中的Flash文件,把Flash中的加載xml地址換成:
myxml.load("http://localhost/xml/xml-007.asp?ran=" Math.random(9999));
然后測試影片.效果跟實驗3一樣.
實驗8:
怎么都講些不實用的東西啊?別急.下面就開始講實用的.
這個實驗比較有實用價值.就如藍色網站的側邊菜單來說.
如圖:
放置的內容是有限的.這個實驗就可以用來擴展側邊菜單.
利用Accordion組件做容納多內容的網站側邊菜單.
效果圖:
下面開始:
數據庫:
打開Data.mdb數據庫.新建二個表.
表名分別為:
--------------------------------------------------
column
columnData
--------------------------------------------------
column表中:
輸入三個字段:分別為:
--------------------------------------------------
columnID 自動編號
columnName 文本
columnIndex 數字
--------------------------------------------------
在 columnID 字段點右鍵-->主鍵,保存.
打開column表,分別在columnName,columnIndex字段輸入五條數據,數據分別為:
--------------------------------------------------
columnName columnIndex
專題欄目-01 0
專題欄目-02 1
專題欄目-03 2
專題欄目-04 3
專題欄目-05 4
--------------------------------------------------
保存.
columnData表中:
輸入四個字段,分別為:
--------------------------------------------------
cdID 自動編號
cdName 文本
cdURL 文本
columnIndex 數字
--------------------------------------------------
在 cdID 字段點右鍵-->主鍵,保存.
打開columnData表,分別在cdName,cdURL,columnIndex字段輸入下面的數據:
--------------------------------------------------
cdName cdURL columnIndex
ChooseFlash-01.1 http://www.happiness01.com 0
ChooseFlash-01.2 http://www.happiness02.com 0
ChooseFlash-01.3 http://www.happiness03.com 0
ChooseFlash-01.4 http://www.happiness04.com 0
ChooseFlash-01.5 http://www.happiness05.com 0
ChooseFlash-02.1 http://www.happiness01.com 1
ChooseFlash-02.2 http://www.happiness02.com 1
ChooseFlash-02.3 http://www.happiness03.com 1
ChooseFlash-02.4 http://www.happiness04.com 1
ChooseFlash-02.5 http://www.happiness05.com 1
ChooseFlash-03.1 http://www.happiness01.com 2
ChooseFlash-03.2 http://www.happiness02.com 2
ChooseFlash-03.3 http://www.happiness03.com 2
ChooseFlash-03.4 http://www.happiness04.com 2
ChooseFlash-03.5 http://www.happiness05.com 2
ChooseFlash-04.1 http://www.happiness01.com 3
ChooseFlash-04.2 http://www.happiness02.com 3
ChooseFlash-04.3 http://www.happiness03.com 3
ChooseFlash-04.4 http://www.happiness04.com 3
ChooseFlash-04.5 http://www.happiness05.com 3
ChooseFlash-05.1 http://www.happiness01.com 4
ChooseFlash-05.2 http://www.happiness02.com 4
ChooseFlash-05.3 http://www.happiness03.com 4
ChooseFlash-05.4 http://www.happiness04.com 4
ChooseFlash-05.5 http://www.happiness05.com 4
ChooseFlash-05.6 http://www.happiness06.com 4
ChooseFlash-05.7 http://www.happiness07.com 4
--------------------------------------------------
保存.關閉數據庫.
數據庫到這可以了.下面是ASP:
打開記事本,輸入下面的代碼,然后保存為 xml-008.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
'xml-008.asp
dim conn,rs,sqlcom,name_arr,index_arr
'設置文檔類型.
Response.ContentType="text/xml"
'輸出XML文檔.
Response.Write("<?xml version='1.0' encoding='gb2312'?>")
Response.Write("<!--xml-008.asp-->")
Response.Write("<ColumnList>")
'創建連接對象.
Set conn=Server.CreateObject("Adodb.Connection")
'這里用字符串方法連接數據庫.
'"Provider=Microsoft.Jet.OLEDB.4.0; 這個是數據庫驅動.
'Data Source="Server.MapPath("Data.mdb") 數據庫文件的相對路徑.
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("Data.mdb")
'創建記錄集對象.
Set rs=Server.CreateObject("Adodb.RecordSet")
'查詢數據庫的sql語句.column是SQL中的要害字.要用中括號括起來.
sqlcom="select * from [column]"
'執行sql語句.
'1,1 只讀.
'1,3 可讀可寫.
rs.Open sqlcom,conn,1,1
'重定義數組.
'rs.RecordCount 記錄集中總的記錄數.
Redim name_arr(rs.RecordCount)
Redim index_arr(rs.RecordCount)
'用for語句將column表中的數據循環出來.
'Ubound數組的最大上標.
for i=1 to Ubound(name_arr)
'將column表中的columnName字段中的值存入數組name_arr.
name_arr(i)=rs("columnName")
'將column表中的columnIndex字段中的值存入數組index_arr.
index_arr(i)=rs("columnIndex")
'移到下一條數據.
rs.MoveNext
Next
'這里用了嵌套for語句,
'第一個for j是將name_arr和index_arr數組中的數據讀出來.也就是column表中的數據.
'第二個for k是將columnData表中的數據讀出來.
'用for語句將name_arr和index_arr數組中的數據循環出來.
for j=1 to Ubound(name_arr)
'關閉記錄集.
rs.Close
'查詢數據庫的sql語句.
'根據index_arr(j)數組中的值為條件來重復執行sql語句.
sqlcom="select * from columnData where columnIndex="&index_arr(j)&""
'執行sql語句.
rs.Open sqlcom,conn,1,1
'輸出XML節點.
Response.Write("<Column name='"&name_arr(j)&"'>")
'用for語句將column表中的數據循環出來.
for k=1 to rs.RecordCount
'輸出XML節點.
Response.Write("<ColumnData name='"&rs("cdName")&"' url='"&rs("cdURL")&"' />")
'移到下一條數據.
rs.MoveNext
Next
'結束Column節點.
Response.Write("</Column>")
Next
'結束ColumnList節點.
Response.Write("</ColumnList>")
'釋放記錄信對象.
Set rs=nothing
'關閉連接.
conn.Close
'釋放連接對象.
Set conn=nothing
%>
在IIS中瀏覽xml-008.asp文件.可以看到xml文檔的結構跟實驗7中的xml文檔結構一樣.
下面就是Flash了
Flash中:
打開Flash,新建一個Flash文檔,大小200*230,命名 xml-008.fla ;
新建一個圖層,命名為:Actions
--------------------------------------------------
新建一個影片剪輯,命名為:btn_over ;此影片剪輯用來裝飾鼠標滑過時的效果.
新建二個圖層.分別命名為:
--------------------------------------------------
Actions
cont
--------------------------------------------------
在圖層cont的第一幀畫一個200*18,沒有邊框的矩形,填充顏色為#0099FF;透明度為0,x,y值為0,
在第三幀按[F6],選中該幀的矩形,將透明度調為50;再選中第一幀,打開屬性面板,在補間那選外形.
在圖層Actions的第三幀按[F6],在該幀輸入代碼: stop();
完成如圖:
回到主場景,新建一個按鈕.命名為:btn ;
在'指針經過','按下'幀按[F6].
將庫中的 btn_over 影片剪輯拉到'指針經過'幀,x,y值為0,
再在'按下'幀畫一個200*18,沒有邊框的矩形,填充顏色為#FFF3CC; 透明度為50, x,y值為0,
回到主場景,新建一個影片剪輯.命名為:columnItem,
在高級選項那 標識符為:columnItem,在勾選上 '為ActionScript導出','第一幀導出'.
新建三個圖層,分別命名為:
--------------------------------------------------
btn
text
line
--------------------------------------------------
在圖層line的第一幀畫一條100*1的虛線.填充顏色為#660000; 透明度為80 ; x值為0,y值為18;
在圖層text畫一個動態文本框,大小為200*18; 文本顏色為:#660000; x,y值為0, 實例名為: cName ;
在圖層btn中,將btn按鈕元件拉到第一幀.x,y值為0,實例名為: btn ;
完成如圖:
回到主場景.
打開組件面板,拉一個Accordion組件到庫中;
在Actions圖層的第一幀輸入下面的代碼:
//導入類.
import mx.core.View;
import mx.containers.Accordion;
//===========================================
//使用系統編碼.防止亂碼.
System.useCodepage = true;
//隱藏按鈕的鼠標手形.
Button.prototype.useHandCursor = false;
//===========================================
//實例化一個xml對象.
var columnData:XML = new XML();
//分析時忽略xml文檔中的空格.
columnData.ignoreWhite = true;
//加載http://localhost/xml/xml-008.asp.
columnData.load("http://localhost/xml/xml-008.asp?ran=" Math.random(9999));
//調用XML.onLoad事件.
columnData.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
//執行dragColumn函數.
dragColumn(columnData.firstChild.childNodes);
}
};
//==========dragColumn函數用來繪制專欄數據===========
function dragColumn(column_arr:Array):Void
{
//創建Accordion組件的實例.
//createClassObject(類名稱,"實例名",深度,{初始對象});
createClassObject(Accordion, "column", 0, {_x:0, _y:0, _width:200, _height:240});
//執行columnStyle函數.
columnStyle();
//獲取數組的長度.
var columnLen:Number = column_arr.length;
//專欄的子菜單數組.
var columnChild:Array;
//引用專題欄目的對象.
var MainItem:Object;
//循環創建專題欄目.
for (var i = 0; i<columnLen; i ) {
//創建專題欄目.MainItem引用新創建的對象.
//createSegment(類名稱,值或實例名稱,顯示的標題);
MainItem = column.createSegment(View, i, column_arr[i].attributes.name);
//獲取專欄的子菜單數組.
columnChild = column_arr[i].childNodes;
//循環創建專題欄目的子菜單.
for (var j = 0; j<columnChild.length; j ) {
//使用with語句簡寫代碼.
//創建專題欄目的子菜單.
//createChild("庫中的鏈接名","實例名稱",{初始對象});
//18.5是columnItem影片剪輯的高度和行距.
with (MainItem.createChild("columnItem", "columnItem", {_x:0, _y:18.5*j})) {
//顯示子菜單.
cName.text = columnChild[j].attributes.name;
//獲取點擊的URL;
btn.cURL = columnChild[j].attributes.url;
//btn.onRelease事件.
btn.onRelease = btnEvent;
}
}
}
}
//========執行btn.onRelease事件的函數=========
function btnEvent():Void
{
//連接點擊的URL.
getURL(this.cURL, "_blank");
}
//=======columnStyle函數設置專欄的樣式=========
function columnStyle():Void
{
//文本顏色.
column.setStyle("color", 0x660000);
//字體.
column.setStyle("fontFamily", "隸書");
//主題.
column.setStyle("themeColor", "haloOrange");
//點擊專欄的動畫.
column.setStyle("openEasing", mx.transitions.easing.Bounce.easeOut);
}
現在大家就可以測試影片了.
教程源文件:點擊這里下載源文件
分享:Flash游戲中導彈追蹤的算法先看下效果吧:代碼如下:/*請教大家一個關于勢函數用到追蹤和攔截的算法有研究過的能不能指點一下!PoweredBySundayEmail:happyclub@163.com*/varst
- 相關鏈接:
- 教程說明:
Flash教程-Flash處理外部XML文檔數據
。