Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2656939
  • 博文数量: 79
  • 博客积分: 3046
  • 博客等级: 中校
  • 技术积分: 723
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-18 21:46
文章分类

全部博文(79)

文章存档

2010年(5)

2009年(2)

2008年(6)

2007年(66)

我的朋友

分类:

2007-07-20 16:28:20

ASP+Flash作品的制作技巧
·attachMovie和createEmptyMovieClip技术  
  一般来说,这一类的作品程序规模均较大,你是否觉察到?越是复杂的作品,其flash的场景越是简单!甚至主场景上竟然空无一物!我们想象一下,诸如留言簿、论坛等flash作品不仅其数据瞬间万变,而且用户界面也随时变换,与此同时,还得表演出变得过程中的动画效果,flash动画过去那种相对固定的舞台元素或者用“场景”分隔的做法远远不能适应这种流程,所以,此类作品无一例外地采用动画编程的手段,不同的用户进程用程序“构造”不同的界面元素和位置乃至效果。
  attachMovie可以方便地随时从元件“库”中把任何元素“请”进界面,而创建createEmptyMovieClip“虚拟”对象,用程序语言赋予它你所需要的任何属性,这种灵活的编程手段更好地适应了较复杂的用户界面。另外,这种模式的作品其程序模块特别多,子程序互相调用频繁,逻辑关系特别复杂严密!
  但同时,却为我们阅读理解作品带来了很大的难度!
  探索这样的动画流程确实不易,但是讲究一点技巧,还是能渐渐理清基本脉络的,比如,对于一个留言簿,你可以先搞清楚相关的ASP脚本是如何写的,它从flash中获取了什么数据,返回了什么信息,然后在flash库中找出相应MC,注意其“链接标识名”(上面实例已有简单运用),再打开这MC的编辑界面,往往你能看到一个完整的用户界面,而且在这些MC中,你能读到大量的关键代码。
  在初步理清一个模块的基础上,再努力找出其与其它模块的逻辑关系,顺藤摸瓜、步步为营、渐入佳境......
·脚本文件AS
  我曾看到过一个作品,在flash中根本发现不了任何AS脚本,却拥有近10个外部AS文件,这就是“脚本文件”,它的扩展名就是“as”,比如“hslk.as”。
  然而,在flash中,你却会发现这样的指令:#include "hslk.as",这就是对于脚本文件的运用。
  由于上面第一条所说的技术,作品本身的动画舞台中没有任何实际的对象,动画界面均出于自己胸有成竹的编程过程,所以作者根本无需在flash环境下工作,因而尽可在某个文本编辑软件中尽情书写动画流程,我实在佩服这些作者,除了对动画结构了然于胸,还有那缜密思维、逻辑结构仿佛行云如水,天马行空,豪爽至极!
  碰到这样的情况,你可以不必再在flash中苦苦搜索,从一个MC折腾到另一个MC,点击每一个真有“a”的关键帧,你可以集中精力,解读这一个个相对独立的脚本文件。但这需要你对flash元件库中的MC元件有较充分的了解,因为脚本中无时不刻地在引用这些实例名、变量......
  你完全可以把AS脚本看作为实实在在地存在于flash中,事实上,Flash经过编译产生swf文件时,也确实把所有as脚本包含进播放文件中了!所以,根本用不到把AS文件随同swf一起上传到远端服务器上。
·“工作图层”
  你有没有看到过如右图那样的“图层”?那些有一把小铁锤的层是什么意思呢?
  告诉你,这是一个很有用的编辑界面技巧哩!如果你把一个层属性设置为“引导层”,而且不为它增加“被引导”层,那么会出现这个“小铁锤”标志,我把它称作为“工作层”。
   工作层可以写上编辑日志、编辑注释等内容,更可以放一些供编辑参照的对象,因为,“工作层”只在编辑环境下显示,它仅保留到fla文件中,在编译成swf文件时被忽略!
   而在相当多的ASP+Flash的源文件中,往往利用“工作层”放一些
  ···>>> 当前ASP+Flash作品的制作技巧
·attachMovie和createEmptyMovieClip技术  
  一般来说,这一类的作品程序规模均较大,你是否觉察到?越是复杂的作品,其flash的场景越是简单!甚至主场景上竟然空无一物!我们想象一下,诸如留言簿、论坛等flash作品不仅其数据瞬间万变,而且用户界面也随时变换,与此同时,还得表演出变得过程中的动画效果,flash动画过去那种相对固定的舞台元素或者用“场景”分隔的做法远远不能适应这种流程,所以,此类作品无一例外地采用动画编程的手段,不同的用户进程用程序“构造”不同的界面元素和位置乃至效果。
  attachMovie可以方便地随时从元件“库”中把任何元素“请”进界面,而创建createEmptyMovieClip“虚拟”对象,用程序语言赋予它你所需要的任何属性,这种灵活的编程手段更好地适应了较复杂的用户界面。另外,这种模式的作品其程序模块特别多,子程序互相调用频繁,逻辑关系特别复杂严密!
  但同时,却为我们阅读理解作品带来了很大的难度!
  探索这样的动画流程确实不易,但是讲究一点技巧,还是能渐渐理清基本脉络的,比如,对于一个留言簿,你可以先搞清楚相关的ASP脚本是如何写的,它从flash中获取了什么数据,返回了什么信息,然后在flash库中找出相应MC,注意其“链接标识名”(上面实例已有简单运用),再打开这MC的编辑界面,往往你能看到一个完整的用户界面,而且在这些MC中,你能读到大量的关键代码。
  在初步理清一个模块的基础上,再努力找出其与其它模块的逻辑关系,顺藤摸瓜、步步为营、渐入佳境......
·脚本文件AS
  我曾看到过一个作品,在flash中根本发现不了任何AS脚本,却拥有近10个外部AS文件,这就是“脚本文件”,它的扩展名就是“as”,比如“hslk.as”。
  然而,在flash中,你却会发现这样的指令:#include "hslk.as",这就是对于脚本文件的运用。
  由于上面第一条所说的技术,作品本身的动画舞台中没有任何实际的对象,动画界面均出于自己胸有成竹的编程过程,所以作者根本无需在flash环境下工作,因而尽可在某个文本编辑软件中尽情书写动画流程,我实在佩服这些作者,除了对动画结构了然于胸,还有那缜密思维、逻辑结构仿佛行云如水,天马行空,豪爽至极!
  碰到这样的情况,你可以不必再在flash中苦苦搜索,从一个MC折腾到另一个MC,点击每一个真有“a”的关键帧,你可以集中精力,解读这一个个相对独立的脚本文件。但这需要你对flash元件库中的MC元件有较充分的了解,因为脚本中无时不刻地在引用这些实例名、变量......
  你完全可以把AS脚本看作为实实在在地存在于flash中,事实上,Flash经过编译产生swf文件时,也确实把所有as脚本包含进播放文件中了!所以,根本用不到把AS文件随同swf一起上传到远端服务器上。
·“工作图层”
  你有没有看到过如右图那样的“图层”?那些有一把小铁锤的层是什么意思呢?
  告诉你,这是一个很有用的编辑界面技巧哩!如果你把一个层属性设置为“引导层”,而且不为它增加“被引导”层,那么会出现这个“小铁锤”标志,我把它称作为“工作层”。
   工作层可以写上编辑日志、编辑注释等内容,更可以放一些供编辑参照的对象,因为,“工作层”只在编辑环境下显示,它仅保留到fla文件中,在编译成swf文件时被忽略!
   而在相当多的ASP+Flash的源文件中,往往利用“工作层”放一些

参照MC对象,这些对象本来不在场景中出现,仅用作编辑时参考,如位置等信息。
   从图中可以看出,“工作层”的作用挺大哦!

·形形式式的“包含文件”
   在flash中,除了loadVariables函数传递ASP数据,用#include引进脚本文件,我们有时还会看到一些“另类”调用方法,如:
_global.read_url = "read.asp";
_global.add_url = "add.asp";
_global.delete_url = "delete.asp";
_global.edit_url = "edit.asp";
_global.login_url = "login.asp";
_global.reply_url = "reply.asp";

  这是利用ASP参数设置flash中的一系列全局变量。
   再有,不少ASP文档把常用的一些脚本单独放在某一文档中,最多的是一些环境设置及数据库连接语句,如下面是连结数据库的的脚本,这段脚本可能会在多个ASP文档中引用,我们把它保存为conn.asp文件:
<%
set conn=server.createobject("ADODB.CONNECTION")
dbpath=server.mappath("hslk.mdb")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&dbpath
%>

  然后,只要在需要引用数据库连接的ASP头部添加以下语句就行了: 

  这种手法常遇到,但在DW中,往往会把html界面“隐藏”掉,对我们的页面编辑带来不便,这时,你可以暂时移去这段语句,待编辑完成再恢复。
  本辑至此告一段落,下一辑再见哦...... 

···>>> 概述
  在“走近ASP”的前几讲中,我们接触到了ASP一些基本脚本特性,从这一部分开始,我们将进一步探讨这些特性,虽然说是“进一步”,但我们的宗旨仍然没变,即:我们以看懂脚本流程为主,并且形成使用、移植代码模块,组织成符合自己需要的程序的能力。并且,本讲开始涉及ASP与flash的结合问题,这也是我接触ASP的初衷。
  鉴于上述原因,我的这篇文章实际上是“初学者与初学者的交流”,咱们可都是“菜鸟”哦,你将发现,以下的文字描述将是最浅显的,涉及的内容更是初学者所关心的......
  我们要制作基于ASP动态数据的flash作品时,必需了解Flash与ASP交换数据的原理,而ASP之所以能快速、高效、科学地组织数据依赖于数据库,虽然我们也曾接触过无数据库的ASP例子,但作为初学者也感觉到,这种靠文本文件管理信息的方式效率实在低下,而且功能十分有限,更谈不上安全性了!
  下面我们先探讨一下ASP与数据库的连接。
  在我们读到的大部分ASP文档头部,总能看到一段似曾相同,却又相差甚远的脚本,这就是ASP与数据库连结的脚本,或许在此之前你对它们感到“晕”,那么,看完下面内容,我保证你不再会“晕”:
  ···>>> 有关数据库连结的基本知识
  请你挺着!或许这部分是本讲最让你乏味的,读懂了这部分内容,下面将水到渠成,一通百通哦......
  ·两个重要对象Connection和Recordset:
  其中,Connection是把数据库运用到web页面上来的最根本的手段,ASP脚本中对于数据库后续的种种操作,均依赖它,它是先决条件!
  我们打个比方,在Flash中,“库”中元件没放在舞台上等于零!同理,Connection等同于让“库”中的数据在我们的工作台上有了个“实例”,“舞台”中有了素材的“实例”,精彩的动画从此开始,这个比喻你不可能不懂吧?OK,现在看看如何创建它,在Flash中,创建实例可以用鼠标从库中拖到舞台上,而在ASP中,创建数据库的“实例”可以用采用一句“服务器对象”语句:
“Create”,它可能是这样的:
set Con=Server.CreateObject("ADOBE.Connection")
  其中,Con是实例名,在ASP中,为实例名指定值一定要用“set”,OK,除了那个ADOBE,全懂了!好,那么我们简述一下ADOBE
  有个技术名字叫OLEDB,它可以使用户访问任何数据源,但它是“系统级”的编程接口,非专业程序员难以问鼎,再打个比喻,它好比是C语言,功能强大却又是“阳春白雪”!
  还好,总会有适合“下篱巴人”的东东,那就是上面看到的ADOBE!也就是我们常看到的ADO。
  ADO
也是一组接口,但它是“应用程序级”的,我们无需深究它的接口原理,只需按照上例用上去,Con实例就有了!
  但光有个数据“实例”事情没完啊,Connection其实是“空”的,它好比是flash中的MC,功能强大但还没内容,还得有一个存放数据集的“盒子”,这就是Recordset。它是属于ADO的一个对象。
  Recordset好比是一个具有“横、竖”格子的容器,用句行话说是一个“二维数组”,分别存放数据库中的数据结构与内容。
  创建Recordset也容易,如下所示:
set rs=Server.CreateObject("ADODB.RecordSet")
  这下不用再解释了吧?!rs就是存放数据库结构及内容的“盒子”哦。
  请你再坚持一下哦,接下去的内容可以稍微有点“烦”,但跨过这道坎可是一马平川啊......
  两个对象有了,我们还得依一定方式“打开”它们,两个对象都有一个“open”方法,关于open的具体脚本,暂不展示,免得你一晕不想看下去了,咱先谈谈相关的几个问题:
  有一个服务器对象,叫MapPath,它将“相对路径或虚拟路径”映射为服务器物理路径,比如,它可以把诸如:
“C:\Inetpub\wwwroot\db\hslk.mdb”或者“”等“虚拟路径”映射为“db/hslk.mdb”的服务器路径。
  还有一个“放之四海而皆准”的数据库操作语言SQL,它的功能盖世无双,语句清晰,语法如同“说话”,比如:
select * from hslk where name="lk"
  它的意思就是:从(from)数据库表hslk那里选择(select)所有字段(*)中条件为name="lk"的内容!
  呵呵,好象没什么难度,是吧?
  那么,再坚持下,咱们这就说最后一个问题:连结数据源的两种方式。
  上面把这个问题暂时“挂”起,两个对象还有个open问题,而Connection对象的open有两种方式:
  一种是:采用设置“数据源”(DSN)的方法,我们上一辑已经讲过,通过windows系统的ODBC设置一个DSN源,如果你为这个数据源起了个“myAccess”的名字,那么你就可以用如下脚本完成Connection的open:
               <%
              Set Con=Server.CreateObject("ADODB.Connection")
              Con.Open"DSN=myAccess"
              %>
  还有一种就是“无DSN连接”,如果你不想进行上述的ODBC操作,那么可以手写open语句,就必需加上DriverDBQ两个参数,前者指定微软的数据库驱动程序;后者指定数据库路径,如:
              ?/font><%
              ?/font>Set Con=Server.CreateObject("ADODB.Connection")
              ?/font>Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Set Con=Server.CreateObject("ADODB.Connection")
              ?/font>Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
<%
              ?/font>Set Con=Server.CreateObject("ADODB.Connection")
              ?/font>Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Set Con=Server.CreateObject("ADODB.Connection")
              ?/font>Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>
Con.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ=myAccess"
              ?/font>%> %>

  那么,至于Recordset对象的open如何呢?呵呵,一般地就是用SQL语句喽!
  OK,现在我们已经具备充分的“阅读能力”,下面我们看看一例较完整的脚本!
  翻页继续,咱们现在不会再“晕”喽......

···>>> 一个数据库连结脚本剖析
  下面是一个Flash留言簿的“添加新纪录”程序模块,你千万别被它的脚本书写手法而迷惑,需要再点拨一下的是:
  ConStr是先行定义的Connection对象open的语句,第三行的“con.Open Constr”就是对这个语句的运用,现在我们知道了,这是“无DSN方式”的应用,rs就是Recordset“数据盒子”实例名,它的参数“3,3”是“数据盒子”打开的安全模式,包括权限、读写属性等,可以参看语言手册,属性内容较复杂。
  addnew是内建方法,它使rs新增一条记录,后面几句分别从Flash界面中的“输入文本”中获取“用户名”、“邮箱”、“icq号”、“头像”、“主页”、“留言主题”及“留言内容”等信息。“trim()”函数是去除用户输入的文字两傍空格,(呵呵,这是个不错的防范措施哦),接着,rs更新数据(Update),最后整个con对象关闭,并释放资源(nothing),最后,发送给flash一个“信号”:SendFlag=1,flash根据这个“信号”将决定播放指针跳到哪个关键帧 。
<%
ConStr="Driver=Microsoft Access Driver(*.mdb);dbq="&Server.MapPath("Db/hslk.mdb")
set con=Server.CreateObject("ADODB.Connection")
con.Open constr
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.Open "select * from guestbook where 1=0",con,3,3
rs.addnew
rs("UserName")=trim(request("UserName"))
rs("email")=request("email")
rs("icq")=request("icq")
rs("face")=request("curFace")
rs("url")=request("inurl")
rs("message")=trim(request("fText"))
rs("subject")=trim(request("subject"))
rs.update
rs.close
set rs=nothing
con.close
set con=nothing
Response.Write("sendFlag="&1)
%>
  再说一遍,脚本书写习惯因人而异,ASP对象、方法运用技巧各显神通,但基本脉络把握了,读程序也就不会迷失方向, 在这段脚本中,还有二个极其重要方法,那就是“Request”及“Response”。在上一次第一辑交流中,已经就两个方法作了介绍,它是ASP与flash通讯的唯一途径!
  再说明一下,就我们现在所知,“Request”及“Response”前者是“接受”,后者是“发送”,在实际应用中内涵相当丰富,本文仅以flash与ASP之间的传递信息范围作探讨。
  在探讨之前,我认为很有必要再补充一些ASP与数据库操作方面的常见问题。这些问题虽然在上例中未见到,却会经常出现在一些ASP文档中......
  ···>>> 一些数据处理的情况
  或许,你在某些ASP中,还看到如:
set con=server.createobject("adodb.connection")
con.Mode=2

  这样的脚本,这是connection的属性:Mode=2意思是“允许只写权限”。
  还有,Recordset的常见方法还有:Open(激活数据)、Close(关闭)、Move(移动指针)、Update(修改数据)、Addnew(增加数据)、Delete(删除数据)、Resync(与服务器数据同步更新的模式)等等。
  常见Recordset方法还有Lock,把数据锁闭,不让其他用户同时存取,以上这些方法从字面上就能知道其功能,想必不会过大地为难你吧?!
  另外,我们最常看到的还有数据库指针操作方法Bof(数据库记录头部)、Eof(尾部),它们的运用一般是这样的:
if not (rs.EOF and rs.BOF) then
......
end if

  但下面这个情况,很可能让你怀疑笔者前面说的内容:
con.execute (sql)
  它是connection对象的一个方法:Execute方法通常运行一个SQL命令,从而直接产生Recordset对象,在这种情况下,你将只读到connection对象的建立,却再也找不到“数据盒子”喽,数据操作运用的脚本特例还有很多,再列举下去恐怕又得让我们“晕”乎起来,咱们还是看看与flash交互的两个方法。
  ···>>> “Request”及“Response”
  相对而言,ASP接受flash的数据比较容易理解,如上例“rs("email")=request("email")”这一句,意思是“数据盒子”rs
中的“email”字段的值=flash中动态文本变量email的值。你看到的ASP与flash结合的范例大致全用这种脚本形式。
  那么, Response方法就不那么容易了,记得我曾写过的“flash从外部文本文件接受变量值”中提到过:flash接受的变量值一定得符合MIME标准,比如这里包含3对变量:myvar1="hslk"&myvar2=count+3&myvar3=""。各对变量用“&”连结。Response向flash传递信息时一定得符合这个格式。
  再有:
<%
Resopnse.Write("你好,老康!")
%>

  等同于:
<%=("你好,老康!")%>
  后者是你常见到的书写形式!
  另外,你肯定常见到浏览器地址栏中出现如“http%3A%2F%2Fwww%2Ehslk%2Ecom”的字符串!其实它是咱“老康蓝屋”的域名啊!这可真正的URL编码格式(URLEncode),它是由如下脚本产生的:
<%
Response.write(server.URLEncode(""))
%>
  与此类似的还有“HTMLEncode”方法,这个在ASP程序中会经常遇到,如“Server.HTMLEncode(string)”就是使string不支持
HTML语法编码,我们常遇到留言板支持,或者不支持html语法就可以用此方法设定。
  用ASP向flash发送信息时还大量使用html标识哩,我们知道,服务器在处理ASP文档时,会“极其忠实地对待html标识”!不管
html语句出现在哪里,就是在ASP定界符“<% %>”内照样按html处理!只有用“HTMLEncode”才能改变服务器的顽固脾气哦!
  比如,以下脚本:
<%
Response.Write "

沪上老康向坛友问好!

"
%>

将会以3号大字在浏览器中间显示“沪上老康向坛友问好!”。如果把这个方法用上去,如写成如下:
<%
Response.Write(server.HTMLEncode("

沪上老康向坛友问好!

"))
%>

  那么,浏览器将把html标签及文字如实在还原出来了,以上脚本朋友们可一试,以加深理解。
  事实上,在ASP中向flash发送信息时,我们常看到在信息中混用html标签,比如,“
”就很方便地使flash中的文本换行了,但是有一条得注意,在flash中必需把动态文本对象的“html”属性设置为“可用”,记得上次我写过flash文本与html格式一文,有朋友说:这个有什么用呢?
  现在明白了?flash中的动态文本对象与ASP结合后,其实就是网页中文本域,其运用价值方兴未艾哦......
  那么,怎样向flash传递多个字段的信息呢?从上述原理可知,把各个变量相连结,或者连续发送如:
Response.Write rs("mymail")
Response.Write rs("myurl")
......

  OK,说了半天的ASP“接受”、“发送”,传递总是双方面的,那么在flash中是如何从ASP中接受或向ASP发送数据的呢?
  当然,下面就来说这个事情了,翻过去哦......

阅读(2399) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~