推荐阅读

Photoshop设计大气的2014艺术字教程
最终效果1、新建一个1024 * 900像素的文件,选择渐变工具,颜色设置为红色至暗红色如图1,然后由中间向边角拉出图2所示的径向渐变。2、打开文字素材(先保存下图所示的素材,然后用PS打开),直接可以拖进来,为了便于观察,可以先把文字添加白色。3、把文字图层复制一层,用套索把2014选取出来,按Delete删除,如下图。

详解Web图像的常见应用策略与技巧
本文介绍一些关于响应式图像的适配应用策略,回退原理,SVG的换色技巧,雪碧图的百分比定位计算公式等相关的一些小知识点,目的在于帮助一部分同学快速的理清图像应用思路,以及一些web图像的应用技巧。特点:应用简单,上手容易,性能表现良好难点:lazyload实现根据不同设备,不同分辨率,不同像素比使用的响应式图像,常用的有两种场景:1.1 固定尺寸图像基于设备像素比选择,很多网站logo就是固定宽度图像的一个例子,不管viewport的宽度如何,始终保持相同的宽度。在dom里图像与在css里的图像写法如下面的例子<img srcset="test.jpg 1.5x, test2.jpg 2x" src="test.jpg" 768.jpg 768w, 1200.jpg 1200w, 1920.jpg 1920w" sizes=" (max-width: 360px) 100vw, (max-width: 768px) 90vw, (max-width: 1980px) 80vw, 768px" src="360.jpg" src="http://www.missyuan.net/uploads/allimg/170502/1409454491-0.png" "393""293" />在iphone4(320)下,图像宽度和我们设置的100vw一致,但是为什么浏览器选择了768的图像而没有选择360的?因为4的dpr是2呀^_^,浏览器很智能的选择了质量最合适的768.再看一下6p(414),很听话的按照我们的设置,显示了90vw。因为他的dpr更高,浏览器聪明的选择了1200质量的图像。这里我们可以欺骗一下浏览器:
最新发布

MacromediaColdFusionMX开发者(2)
第三期:ColdFusionMX编程入门 序言 上一期我们讲解了ColdFusionMX的基本管理操作,并且熟悉了ColdFusionMX的管理界面布局,而且上一期最后我们演示了两个非常短小的coldfusion程序,这一期会详细讲解coldfusion的入门编程,其中包括在asp中对于初学者而言非常令人头疼的数据库操作。 在每次开始进入正题之前,每一期的序言内容都会为大家介绍一些关于ColdFusion发展或者其他一些具有价值的小知识,第一期为大家介绍了Macromedia MX产品的策略和coldfusionMX在该产品策略中的位置,而第二期则为大家介绍了ColdfusionMX的版本差异,那么这一期的序言让我们了解一些什么呢?关于ColdFusion的发展。 1995年是个值得纪念的年代,因为发生在那个年月的事情已经是上个世纪的事情了,而且不单单是这么多。如果老资历的开发人员回忆一下的话,那个时候的web是html和cgi称雄的天下,静态页面是html,而动态程序则90%以上是cgi,在我印象中便是如此。美国的一对兄弟allire,在为自己的客户解决数据库访问的问题时,感觉到了cgi程序在编写和维护上的难度是不能容忍的困难。于是,具有计算机天赋的Jeremy Allire便在1995年编写了一种快速响应且易于编写的动态脚本语言,叫做coldfusion,一经推出,便震撼整个网络行业。之后,兄弟俩看到了coldfusion的发展前途,便成立了Allire公司(后来被macromedia收购)。之后的几年,全球500强中的一半都采用了coldfusion来解决公司不同情况的问题。通过不断的版本修改和开发者的不断壮大,Coldfusion后来发展成为业界知名的企业级解决方案的开发首选。现在,为了产品线的统一,为了工业标准的统一,为了完全兼容Java平台,Macromedia发布了ColdfusionMX。而众位以前经常看到的Neo这个词则是macromedia对于使用新一代coldfusion开发行业解决方案的编码名称。 如果大家看到neo这个词,就不难理解Macromedia对于coldfusionMX的殷切期望,大名鼎鼎的电影《黑客帝国》中的男主人公的名字也叫做Neo。以上的相似之处只是作者本人的推测而已了。好,不多聊了,进入我们这一期的正题。第一部分 ColdFusionMX Basic tag编程 作者本人看过很多关于中英文的教材,认为最有效的一种方式就是参照实例的代码段来配合讲解的过程最为优秀。所以,对于每一个coldfuiosn的tag,作者不打算一一赘述,各位朋友可以通过查看一些reference来了解所有的tag功能和语法。关于标准的文档,请在安装coldfusionmx之后参考administrator管理界面里包含的官方文档。

MacromediaColdFusionMX开发者(3)
第四期:ColdFusionMX Basic Tag编程 序言 任何一种程序再简单也要具备一定的逻辑和算法,Coldfusion也不例外。如果只是靠简单的标签的堆砌,是无法真正实现企业商业逻辑的。而且,我在这里非常肯定的提出一点,就是简单绝对不等于功能弱小。目前,网络技术发展到了一个注重表现的时代,就是每一个开发出来的网络应用,要在实现逻辑的同时,具备让客户有丰富的用户体验是另一个追求的目标。Flash+Flashremoting+cf serverside script就是一种极具体验的开发手段。而对于开发工具,众多的开发厂商更是在工具的易用性上做足了文章,微软vs.net开发平台的完整统一性,Oracle9i JDeveloper开发j2ee程序的wizard方式,Macromedia DreamweaverMX众多的服务器端的脚本语言的支持,都是在工具易用性上的一种体现。我们今天要给大家讲解的就是简单易用的coldfusion loop。通过cf中不同的循环,能够实现很多在cf中编程的逻辑。 这里的序言还要补充说明一点,作者已经找到了操作Access数据库时的中文完全解决的方法,如果哪位开发者有兴趣,请去这里查看:第一部分 Basic tag编程深入上一期我们讲了操作数据库的第一个重要的标签,cfquery。但是我们只是讲解了如何使用cfquery进行数据库的查询,现在我们深入讲解一下cfquery的作用,然后在来讲解另外两个操作数据库的标签cfinsert和cfupdate。先来看看cfsnippets这个数据库中employees这个表的构造。随着教程的深入,代码的编写采用verdana字体的8号,并且使用篮色,请学习者注意。我们可以使用cfquery来做数据的插入,编写的形式非常的简单,代码的方式如下:<CFTRANSACTION>

Coldfusion MX技巧精华收集(3)
设定你的根目录 作者: Kyle 2/16/03 内容: 设定你的根目录网站开发人员向来都一直必须在相对路径 vs. 绝对路径这项议题上面打转。在 ColdFusion 环境里面,你可以在多个不同页面使用 CFINCLUDE 卷标,不过既然我们对于在哪个目录里面将会用到 CFINCLUDE 语法,因此在 CFINCLUDE 卷标里面使用相对路径经常会造成很多麻烦。 举例来说,某个被包含的选单里面可能有一个指向网站首页的连结,像下面这样: <A HREF="index.cfm">Home Page</A> 在网站根目录下面的任何档案引入这个包含档都不会有问题。但是如果你在某个次目录下的一个档案里面引入这个选单档案,那么上面这个超链接便会失效,或者至少会连结到错误的页面去。这时候你实际上会希望这个超链接是写成这样: <A HREF="../index.cfm">Home Page</A> 有两种方式可以克服这个问题。一个是在超链接里面直接使用绝对路径。要使用这个作法,你必须在 ColdFusion 里面预先设定好一个路径对应关系(mapping)。你可以在 ColdFusion 管理员(ColdFusion Administrator)的「路径对应(Mappings)」区块里面建立这些对应关系。一旦你建立好了路径对应关系,你便可以把指向网站首页的超链接写成下面这个样子: <A HREF="/mymapping/index.cfm>Home Page</A> 如果你使用了绝对路径,那么不论你在那个位置引入这个档案,该档案里面的超链接永远都会保持有效。我通常使用一个叫做 APPLICATION.RootDir 的应用程序变量来储存这项路径对应设定,并且在超链接里面直接套用这个变量。使用这个作法,如果我真有必要修改目录结构或者路径对应的名称,那么我只需要修改这么一个变量的值就可以了。 <CFSET APPLICATION.RootDir = "/MyMapping"> 如果你套用这个变量,你的超链接看起来会像下面这样:

Coldfusion MX技巧精华收集(4)
使用 Fusebox作者: Kyle 2/16/03 内容: 使用 Fusebox一旦你已经了解 ColdFusion 服务器的运作方式,并且觉得和 CFML 语言相处愉快,那么建议你试试 Fusebox,它是在 ColdFusion 平台上面最受欢迎的标准化开发技术。 Fusebox 将一个应用程序分解成最基本的几个组件,每个组件都被封装成为一个独立的「保险丝(fuse)」。你可以在应用程序里面视需要插入不同的保险丝组件,并且延伸扩充应用程序的功能。这种对象导向的开发方法充分利用了 ColdFusion 自订卷标的模块化天性,并且将这项观念应用到整个应用程序上。 Fusebox 充分利用程序代码的可重用性以及模块性,这两项都是任何应用程序开发工具所奉承的圭臬。Fusebox 的运作模式不但让你能够将同一个保险丝(亦即程序模块)插入到不同的应用程序,它还可以让你将其它人开发的模块轻易地套用在你自己的应用程序上面。 Fusebox 的运作模式是以一个「主应用程序(Home application)」作为中心,它代表了你的整个应用程序。这项主应用程序则是由许多不同的「周边回路应用程序(Circuit applications)」所共同组成的,每一个周边回路应用程序都可以从主应用程序这边呼叫。你可以透过 URL 或者窗体来在主应用程序与周边回路应用程序之间传递一个称为 FuseAction 的变量,这个变量可用来决定你要执行的动作。各种需要用到的档案则都以不同的类型来加以区分,因此应用程序中的各个数据库查询语句,动作指令以及显示画面等等都是彼此相互独立的。这项独立性让你能够掌握最高的可重用性以及易用性。 使用 Fusebox 不仅对于 ColdFusion 应用程序开发过程有所帮助,它还可以帮助你容易跨入 Allaire 公司 ColdFusion 产品线的下一个产品:Allaire Spectra。Spectra 使用的对象导向架构在许多方面都和 Fusebox 所使用的架构非常类似。这两项产品之间的主要差异在于 Spectra 内建了许多预先设计好的自订卷标与函数,可以直接用来处理各式各样开发工作,例如内容管理,个人化以及电子商务相关功能等等。新增站台与setDefaultGatewayUrl()? 作者: willy 2/20/03 内容:

纯AS的Loading效果四例
前言:稍微大一些的Flash作品在播放之前都会有一个Loading预载画面,这考虑到网络的速度,本地浏览不需要等待下载,但传到网上,因为每个用户的网速不同,所以很有必要在我们的作品中加入Loading画面,之前,已经有很多教程是关于Loading制作方法的,今天我们给读者讲述四个纯AS的Loading效果,不懂AS的菜鸟或“代码盲”甚至可以直接复制教程中的代码到自己的作品中,懂AS代码的朋友,可以仔细阅读这些代码,从中学到更多的AS知识,或由此引申出更多的AS Loading效果……感谢作者=棉花糖=、egg616、小郎提供源码和思路--闪客帝国的叶子 stop (); _root . createTextField ( "myload_txt" , 1 , 0 , 0 , 0 , 0 ); with ( _root . myload_txt ) { //设置文本 background = true ; //文本框是否有背景 backgroundColor = 0x336699 ; //文本框的背景颜色 textColor = 0xFFFFFF ; //文本字段中文本的颜色 type = "dynamic" //文本字段为动态文本 selectable = false ; //文本是否可选 autoSize = "center" ; //控制文本字段的自动大小调整和对齐 _x = Stage.width/2; //文本字段的横坐标 _y = Stage.height/2;//文本字段的纵坐标 } onEnterFrame = function () { var Loaded = _root . getBytesLoaded (); var Total = _root . getBytesTotal (); _root . myload_txt . text = Math . floor (( Loaded / Total )* 100 )+ "%" ; if ( Loaded == Total ) { onEnterFrame = null ; removeMovieClip ( _root . myload_txt ); play (); } }; 二. egg616的Loading艺术之一 1、制作原理: 世界上所有的loading大概都可以分为三个部分: 1) 制造一个循环,用于更新数据。一般来说有两种方法,一种是做成二帧,在第二帧中用gotoAndPlay(1)命令产生循环。另一种是只做一帧,利用onEnterFrame命令产生循环。 2) 利用getBytesTotal()与getBytesLoaded()命令获取文件数据。 3) 以图形或动画的方式将第二步获取的数据表现出来(一般同时还以文本方式精确表示) 上面的说明,对一个会做LOADING的人来说是很清楚的,但不会做的看了大概还是不会(呵呵)所以下面我们一步一步来,做个简单的例子(不做文本显示数据了): 2、简单的例子(只有两步,相信你有这个耐性): Ⅰ 打开你一个心爱的动画,新建一个场景,并把它拖到最前面。 Ⅱ 在帧上加入以下的AS动作,即大功告成! 源代码:stop (); function dr ( nam , de , d , al ) { na = createEmptyMovieClip ( nam , de ); na . lineStyle ( d , 0x9900cc , al ); na . _x = 160 ; na . _y = 280 ; na . lineTo ( 240 , 0 ); } //一个画线条的函数,四个参数对应什么,自己看哈onEnterFrame = function () { var a = getBytesTotal (); var b = getBytesLoaded (); //取得下载的数据 if ( b < a ) { dr ( "b1" , 0 , 30 , 30 ); dr ( "b2" , 1 , 20 , 30 ); dr ( "b3" , 2 , 20 , 100 ); b3 . _xscale = b / a * 100 ; //画三条横线,显示下载进度; } else { delete onEnterFrame ; b1 . removeMovieClip (); b2 . removeMovieClip (); b3 . removeMovieClip (); play (); //下载完毕,删除图形和函数; } }; 可以按两次Ctrl+Enter进行下载测试,若对AS有恐惧症者,闭着眼睛复制―粘贴即可 下面是这个例子的效果图 1、打开你要加Loading的动画,新建一个场景,并把它拖到最前面。 2、在最前面的场景的第一帧上加入下面的AS代码。 源代码://Copyright: 吴杰兴 广东廉江//本作品可随意复制或修改,但请注明原作者stop();sw = 550;sh = 400;//Stage.showMenu = false;//隐藏讨厌的右键菜单cs = 60;//网格的密集程度r = 2550;d = r/Math.SQRT2;//网格的弯曲度p = Math.PI;//定义常数PIcreateEmptyMovieClip("ln", 1);ln.lineStyle(0, 0xffffff);for (var i = 1; i<=cs; i++) { ln.moveTo(sw/2+r*Math.cos(i/cs*p), -d+300+r*Math.sin(i/cs*p)); ln.lineTo(sw/2+r*Math.cos(i/cs*p+p/2), -d+300+r*Math.sin(i/cs*p+p/2));}//下面画个颜色渐变的底子createEmptyMovieClip("bg", 0);with (bg) { colors = [0x6666ff, 0xffffff, 0x660099]; alphas = [30, 30, 80]; ratios = [0, 100, 200]; lineStyle(5, 0x00ff00); matrix = {matrixType:"box", x:200, y:115, w:50, h:450, r:p/2}; beginGradientFill("linear", colors, alphas, ratios, matrix); moveTo(-200-sw, -100); lineTo(200+sw, -100); lineTo(200+sw, 100+sh); lineTo(-200, 100+sh); lineTo(-200, -100); endFill();}//r1 = 50;r2 = 170;nu = 32;//分别为中心圆的3个参数;cr = 600;//cr是填色半径createTextField("te", 5, 75, 100, 160, 100);te.textColor = 0x9900ff;//创建文本显示下载的数据function fo1(nam, de, ro) { na = createEmptyMovieClip(nam, de); with (na) { _y = 40; lineStyle(0, 0x000000, 0); colors = [0x6666ff, 0xffffff, 0x660099]; alphas = [130, 130, 20]; ratios = [0, 120, 200]; matrix = {matrixType:"box", x:-cr/2, y:-cr/2, w:cr, h:cr, r:p/2}; beginGradientFill("radial", colors, alphas, ratios, matrix); //这里用AS来渐变填充 moveTo(r1, 0); var bl = Math.cos(p/nu); for (var i = 1; i<=ro; i++) { curveTo(r1*Math.cos(i*p/(nu/2)-p/nu)/bl, r1*Math.sin(i*p/(nu/2)-p/nu)/bl, r1*Math.cos(i*p/(nu/2)), r1*Math.sin(i*p/(nu/2))); } lineTo(r2*Math.cos(ro*p/(nu/2)), r2*Math.sin(ro*p/(nu/2))); for (var i = ro; i>=1; i--) { curveTo(r2*Math.cos(i*p/(nu/2)-p/nu)/bl, r2*Math.sin(i*p/(nu/2)-p/nu)/bl, r2*Math.cos((i-1)*p/(nu/2)), r2*Math.sin((i-1)*p/(nu/2))); } lineTo(r1, 0); endFill(); }}//此函数用来画中间的圆环,其中圆环是用curverTo的方法作出,//这里不作介绍,我将在下个教程中详述onEnterFrame = function () { ab = _root.getBytesLoaded(); bb = _root.getBytesTotal(); // 获取数据 sb = int(ab/bb*nu); fo1("di", 4, sb); di._x = 275; di._y = 200; di._yscale = 25; di._rotation = -30; // 调用函数作上面的圆环 fo1("yz", 3, sb); yz._xscale = 100*Math.pow(3, 0.5)/2; yz._yscale = 25; yz._alpha = 30; yz._x = 275; yz._y = 360; // 在下面再作一个透明的圆环,作为上一个的影子 if (ab>>>" di.onPress = function() { delete onEnterFrame; te.removeTextField(); di.removeMovieClip(); yz.removeMovieClip(); ln.removeMovieClip(); bg.removeMovieClip(); play(); }; }};因为是纯AS的作品,就不再提供FLA文件了,下面是效果图(JPG格式的,比起SWF的差多了。)onClipEvent (load) { this._x = 180; this._y = 300; _root.ss.createTextField("tt", 1, 70, 50, 100, 20); _root.ss.tt.textColor = 0xff0000; _root.ss.createEmptyMovieClip("louding", 2); with (_root.ss.louding) { lineStyle(0, 0x0000ff, 0); moveTo(0, 0); //起点 beginFill(0xff0000, 100); lineTo(0, 10); lineTo(10, 10); lineTo(10, 0); endFill(); } _root.ss.createEmptyMovieClip("loudingk", 3); with (_root.ss.loudingk) { lineStyle(0, 0x000000, 100); moveTo(0, 0); //起点 lineTo(0, 10); lineTo(200, 10); lineTo(200, 0); lineTo(0, 0); }}onClipEvent (enterFrame) { load = int(_root.getBytesLoaded()/_root.getBytesTotal()*100); _root.ss.tt.text = "loading"+load+"%"; _root.ss.louding._width = 2*load; if (_root.getBytesLoaded() == _root.getBytesTotal()) { _root.play(); }} 效果如图:

Flash和ASP通信碰到的问题
在设计asp和 Flash通信过程中,读取数据有个问题,需要点击按钮两次才能显示数据,具体的文件如下city.fla,有名为BTnlink的button,button的动作为on (press) { setProperty(_root.mvCity,_alpha,100); _root.mvCity.gotoAndPlay(2);}有名为mvcity的movieclip,包括了四个动态文本框分别为txtCityName、txtCityPerson、txtCityKind、txtCityMemo,mvcity的第一帧关键帧代码stop();,第二帧代码:function OpenAsp(url){ var URL = "City.asp?key=" + url; this.loadVariables(URL, "POST";this.txtCityName = this.CityName;this.txtCityPerson = this.CityPerson;this.txtCityKind = this.CityKind;this.txtCityMemo = this.CityMemo; }OpenAsp(_root.url);stop();主场景第一帧空白关键帧动作代码: var url; url=""; ,第二帧放上了button和move clip动作为setProperty(_root.mvCity,_alpha,0);_root.url = "Am";stop();asp文件为city.asp,代码如下<%str = "CityName=北京&CityPerson=200&CityKind=ShouDu&CityMemo=Hello,World,this City is" & keyResponse.Write str%>建议用loadVars对象来与ASP通讯……详情搜索HANDMADE的贴子……用loadVariables从ASP后台载入数据时……应该要加一个random的参数……这样才能起到刷新的作用……“post”方式应该也存在这个问题(未做实验研究)……比如:this.loadVariables("City.asp?key="+url+"&random="+random(99999), "POST");原因是当GET方式发送的变量未改变时……会从IE缓存里读取缓存的信息……打开IE缓存看一下就明白了……缓存的纪录是以GET方式的URL为名保存的……对了……刚才没发现……你loadVariables()之后立即进行赋值了……而那时候数据并没有载入完成……所以问题是出在这里了……帮你改一下:function OpenAsp(url){var this.CityName=null;var URL = "City.asp?key=" + url;this.loadVariables(URL, "POST";this.onEnterFrame=function(){if(this.CityName !=null){this.txtCityName = this.CityName;this.txtCityPerson = this.CityPerson;this.txtCityKind = this.CityKind;this.txtCityMemo = this.CityMemo;delete this.onEnterFrame;};};}

Flash游戏制作--五子连珠(二)
// 显示棋子_root.display = "XPos : " + (x + 1);temp = chr ( y + 65);_root.display1 = "Ypos : " + temp;_root.playnow = "player";//判断是否获胜xx = x;yy = y;for (k=0; k<4; k++) {if (_root.a_result <> 6) {_root.a_result = 0;x = xx;y = yy;while ((_root.table[y][x] == 2) and (y+_root.dir[k][1] < 16) and (x+_root.dir[k][0] >= -1) and (x+_root.dir[k][0] < 16) and (y+_root.dir[k][1] >= -1)) {x = x + _root.dir[k][0];y = y + _root.dir[k][1];// "_root.table["+y+"]["+x+"]="+_root.table[y][x]_root.a_result = _root.a_result+1;}x = xx;y = yy;while ((_root.table[y][x] == 2) and (y+_root.dir[k+4][1] < 16) and (x+_root.dir[k+4][0] >= -1) and (x+_root.dir[k+4][0] < 16) and (y+_root.dir[k+4][1] >= -1)) {x = x + _root.dir[k+4][0];y = y + _root.dir[k+4][1];_root.a_result = _root.a_result+1;}if (_root.a_result == 6) {_root.playnow = "nobody";}}}if (_root.playnow =="nobody") {_root.gameoverman.gotoAndPlay(2);}}C:新建一个Movie clip组件,并命名为bb,此组件用来计算电脑如何走棋,进入组件编辑状态后,在图层layer1绘制一个有填充色的矩形,然后在第5桢插入一个关键桢,在同样位置绘制一个大小相同填充色不同的矩形。新建一个图层,在矩形里输入提示文字:电脑走棋,然后再新建一个图层Action,在第一桢添加AS: stop();,在第8桢插入一个关键桢,在此桢添加如下AS:if (_root.playnow == "computer") {//初始化棋盘_root.func.makelist("white");_root.func.makelist("black");//调用自定义函数max_computer = 0;max_player = 0;k = 0;//定义三变量for (j=0; j<15; j++) {for (i=0; i<15; i++) {for (k=0; k<4; k++) {if (_root.computer[j*15+i][k] == max_computer) {rndnum = random ( 100 ) + 1;if (rndnum > 50) {max_computer = _root.computer[j*15+i][k] ;xc = i;yc = j;}}if (_root.computer[j*15+i][k] > max_computer) {max_computer = _root.computer[j*15+i][k] ;xc = i;yc = j;}if (_root.player[j*15+i][k] > max_player) {max_player = _root.player[j*15+i][k] ;xp = i;yp = j;}}}}if (max_computer > max_player) {x = xc;y = yc;} else {x = xp;y = yp;}// 绘制棋子num = y * 15 + x;removeMovieClip(_root.b add num);duplicateMovieClip(_root.white, "white" add num, num + 300);setProperty(_root.white add num, _x, 34.7 + x * 20);setProperty(_root.white add num, _y, 34.7 + y * 20);_root.table[y][x] = 2;// 显示棋子_root.display = "Xpos : " + (x + 1);temp = chr ( y + 65);_root.display1 = "Ypos : " + temp;_root.playnow = "player";// 判断是否获胜xx = x;yy = y;for (k=0; k<4; k++) {if (_root.a_result <> 6) {_root.a_result = 0;x = xx;y = yy;while ((_root.table[y][x] == 2) and (y+_root.dir[k][1] < 16) and (x+_root.dir[k][0] >= -1) and (x+_root.dir[k][0] < 16) and (y+_root.dir[k][1] >= -1)) {x = x + _root.dir[k][0];y = y + _root.dir[k][1];// "_root.table["+y+"]["+x+"]="+_root.table[y][x]_root.a_result = _root.a_result+1;}x = xx;y = yy;while ((_root.table[y][x] == 2) and (y+_root.dir[k+4][1] < 16) and (x+_root.dir[k+4][0] >= -1) and (x+_root.dir[k+4][0] < 16) and (y+_root.dir[k+4][1] >= -1)) {x = x + _root.dir[k+4][0];y = y + _root.dir[k+4][1];_root.a_result = _root.a_result+1;}if (_root.a_result == 6) {_root.playnow = "nobody";}}}// 游戏结束if (_root.playnow =="nobody") {_root.gameoverman.gotoAndPlay(2);}}最后的时间线如图6所示:图6D:再新建一个movie clip组件,命名为buttonclip,此组件用来控制双方的落子,进入组件编辑状态后,将前面做好的隐形按钮拖放到编辑区中,然后给第一桢添加AS:stop();.E:最后再制作一个movie clip,命名为gameover,此组件用来判断游戏是否结束,也就是判断是缶有一方已经连好了五颗棋子。进入组件编辑状态后,连续建立四个图层,分别为layer1,layer2,layer3和action,在layer1,layer2,layer3的第一桢插入空白,然后在第2桢绘制电脑获胜的提示信息,并将Replay按钮拖到编辑区中,给按钮添加As:on (release) {gotoAndPlay("endit");}如图7所示:图7在layer1,layer2,layer3的第三桢按照同样的方法设置您胜利的提示信息,如图8所示:图8然后回到图层action,接下来就要添加具体的控制Action了,在此图层的前三个关键桢分别添加as: stop();,在第四关键桢添加如下AS:for (i=0; i<=225; i++) {removeMovieClip(_root.black add i);removeMovieClip(_root.white add i);removeMovieClip(_root.b add i);}//清除棋盘上的棋子_root.gotoAndPlay("run");//跳转到游戏的开始最后的时间线如图9所示:图9布置主场景:游戏的主要工作完成后,接下来需要布置主场景了。首先使用绘图工具绘制出游戏中的棋盘,棋盘大小为15*15的矩阵,然后给棋盘标上横向和纵向的标识,如图10所示:图10分别将组件white,black,buttonclip,blk,bb和gameover拖到舞台的合适位置,如图11所示:图11组件white的实例名为:black组件black的实例名为:white组件buttonclip的实例名为:b组件blk的实例名为:func组件bb的实例名为:computerrun组件gameover的实例名为:gameoverman然后在棋盘上绘制两个Dynamic text动态文本框,用来显示上一步落子的位置,分别设置变量名为display和display1。最后,给第一关键祯添加as:stop();urls = "边城浪子-闪客帝国";num = 0;table = new Array();computer = new Array();player = new Array();a_result = 0;// Table arrayfor (i=0; i<15; i++) {table[i] = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}// Computer and player table listfor (j=0; j<15; j++) {for (i=0; i<15; i++) {computer[j*15+i] = new Array(0,0,0,0);player[j*15+i] = new Array(0,0,0,0);}}// Make buttonscount = 0;for (j=0; j<15; j++) {for (i=0; i<15; i++) {duplicateMovieClip(_root.b, "b"add count, count + 30);setProperty("b"add count, _x, 34.7 + i * 20);setProperty("b" add count, _y, 34.7 + j * 20 );count++;}}// Eight directionsvar dir = new Array();dir[0] = new Array(1,0);dir[1] = new Array(1,1);dir[2] = new Array(0,1);dir[3] = new Array(-1,1);dir[4] = new Array(-1,0);dir[5] = new Array(-1,-1);dir[6] = new Array(0,-1);dir[7] = new Array(1,-1);playnow = "player";removeMovieClip(_root.b112);duplicateMovieClip(_root.white, "white112", 142);setProperty("white112", _x, 174.7);setProperty("white112", _y, 174.7);// The first black pointtable[7][7] = 2;到此为止,五子连珠这个游戏就制作完成了,本游戏属于较高级的游戏制作,需要有一定的Action编程基础,不过如果您对Action不太了解,相信学完本实例后,可以在一定程度上提高您的Action水平。

Flash游戏制作--打飞碟
射击类游戏不仅在各种平台的游戏中占有重要地位,在Flash游戏中也占有数量上的绝对优势,不少朋友喜欢将学习Flash射击游戏的制作作为学习Flash游戏制作的开始,又因为射击游戏可根据作者自己水平的不同,可难可易,较易掌握,所以Flash射击游戏的制作成为Flash游戏的一大热点,这次我们就来学习一款简单的Flash射击游戏―打飞碟(本例的源文件和.swf文件请点击这里下载)。图1为游戏的主界面:图1游戏的玩法和目的:从游戏主界面中可以看出,在野外优美的景色中,射手需要集中注意力,使用鼠标控制瞄准器努力射中从房屋后面飞出来的飞碟,飞碟的飞行方向是不断变化的,而且飞行的轨迹是弧线,所以一定要仔细认真才能准确的击中飞碟,下面的房屋中间的窗户作为游戏中的记分台,每击中一个飞碟,记分增一,累计击中60个飞碟后,游戏结束。不过也可以在游戏制作过程中根据自己的需要设置游戏胜利所需要击中的飞碟数,游戏的玩法非常简单,制作方法也不是很难,下面我们一起来学习本游戏的制作游戏制作步骤:游戏中所需组件的制作:1. 飞碟的制作:游戏的名字叫打飞碟,当然少不了飞碟了,如果你有耐心的话,可以自己在Flash中绘制一个漂亮的飞碟,或者从外部导入现成的飞碟图片也可以。影片中新建一个Graphic组件,命名为duva,进入组件的编辑状态后,使用绘图工具绘制一个飞碟的外形,然后填充上自己认为满意的颜色即可,如图2所示:图22. 瞄准器的制作:有了飞碟,还需要有瞄准器才可以打飞碟,所以接下来我们制作一个瞄准器。新建一个graphic组件,命名为imgTimeCircel,进入组件的编辑状态后,使用椭圆工具绘制一个黑轮廓且无填充色的正圆,然后在正圆的四面各画四条段直线,这样一个简单的瞄准器就做好了,如图3所示:图33. 飞碟的击破状态的制作:有了飞碟,又有了射击飞碟的瞄准器,就可以开始打飞碟了,不过在继续往下制作前,我们需要考虑一下飞碟被击中后的状态,这样可以使游戏显得更加逼真和生动。新建一个graphic组件命名为lens,进入组件编辑状态后,将默认图层layer1更名为lines,然后使用绘图工具绘制一些浅绿色的粗线条,尽量绘制的零乱些,如图4所示:图4然后再新建一个图层重命名为circle,使用椭圆工具在线条中心绘制一个无填充色的正圆,再新建一个图层重命名为flare,使用椭圆工具绘制一个具有渐变填充色的圆,如图5所示:图5然后再新建一个Graphic组件,命名为flare,将组件lens拖到编辑区,并在属性面板中设置填充色为红色,如图6所示:图64. 飞碟按钮的制作:因为游戏中需要使用鼠标控制瞄准器来射击飞碟,而射击飞碟需要借助于按钮的帮助,所以需要将飞碟和飞碟击中后的状态做成按钮,才可以在游戏中起作用,新建一个button组件,命名为duvabutt,在Up桢将组件duva拖到编辑区中,在down桢插入一个关键桢,将对象换成组件flare,这样当瞄准器在飞碟上按下时,将打破飞碟。5. 记数器的制作`:游戏中需要用到记录已打中飞碟个数的记数器,所以新建一个movie clip组件,命名为count,进入组件编辑状态后,将默认图层重命名为box,使用绘图工具绘制一个小屋,然后将时间线延续到第60桢,如图7所示:图7然后再新建一个土层,重命名为ScooreBoard,先使用矩形工具在小屋上绘制一个小窗口,然后使用文本工具在窗口上输入数字00,按照同样的方法在第二桢输入01,依此类推,在第60桢输入数字60,然后再新建一个图层,命名为number,在此层给每一桢都添加as:stop();,最后效果如图8所示:图86. 隐形按钮的制作:游戏中并不一定每枪都能射中飞碟,当然也有射失的时候,所以需要制作射失的效果,也就是射击失败后也要有瞄准器的响声和瞄准器的发光效果。这些就需要在场景中布置大量的隐形按钮来实现。新建一个movie clip,命名为Lights,使用圆形工具绘制一个正圆,如图9所示:图9然后新建一个movie clip,命名为all the hotspots,将组件lights拖到编辑区中,一个接一个的排列好,如图10所示:图107. 最后需要制作的就是飞碟从不同角度飞出,沿着不同飞行路线飞行的效果,可以把每一种飞行路线做成一个movie clip,本游戏中一共有5种飞行路线,所以一共制作了从duva1到duva5的5个不同的movie clip.您可以根据自己的需要制作一定数目的飞行路线。这里我们以duva2为例,说明飞行路线的制作方法,其他movie clip的制作方法相类似。新建一个movie clip组件,命名为duva2,进入组件的编辑状态后,将组件duvabutt拖到编辑区中,然后在第34桢插入一个关键祯,将对象duvabutt拖到左上角,建立从第1桢到第34桢的motion过渡动画,然后在第35桢也插入一个关键桢,将对象duvabutt替换为组件flare,在第70桢插入一个关键桢,同样做一个对象flare飞向左上角的motion运动过渡,最后时间线如图11所示:图11按照上面相类似的方法制作其他的飞行路线即可,只不过motion过程中的运动方向互不相同罢了。到此为止,所有游戏中需要的组件已经制作完毕,下面就要布置主场景了布置主场景:1. 回到主场景中,将默认的图层layer1重命名为terrain,使用绘图工具绘制一个野外的风景,如图12所示:图122. 新建一个图层,重命名为crosshair,将组件all the hotspots拖到舞台的上部,作为瞄准器的触发区,为了不影响游戏的效果,所以设置此层为不可见,如图13所示:图133. 新建一个组件命名为counter,将组件count拖到舞台的下中部,作为记分牌使用,如图14所示:图144. 接下来就要在舞台中布置飞碟了,简单起见,我们游戏中一共有五中飞碟的飞行路线,所以我们以每五层为一组,每组都包括所有的飞行路线,不过每一组之间都要有一定的时间间隔,比如第一组的结束桢可以做为第二组的开始祯,同样的,每组内也需要有一定的时间间隔,也就是第一种飞行路线的结束桢可以做为第二种飞行路线的开始桢,这样做的目的是同一时间内只飞出一个飞碟,避免了同时飞出多个飞碟的局面,这样才符合实际情况。这样,一个有趣的射击游戏就做好了,游戏中基本上没有使用Action, 完全依靠手工来完成各功能,制作起来也不是很难,很适合初学者来学习。

用Flash制作Google搜索程序
在我们构造Google 搜索程序之前我们还需要Google Web APIs Developer's Kit,你可以从http://www.google.com/apis/download.html下截直接解压缩就可以了。里面已经含了所需要的文件和已经编译好的文件,官方地址是http://www.google.com/apis。不过实际上对我们有用的只是GoogleSearch.wsdl这个文件,把这个文件和SWF文件放在同一文件夹运行既可。 构造一个Flash 表单屏屏幕 1. 在 Flash MX Professional, 选择 File > New 并选择 Flash Form Application. 这将创建一个默认包含两个嵌套表单的应用程序。 2. 在属性面板中改变form1这个实例名为 frmSearch.。这个表单将包含搜索的主界面。 3. 右击“frmSearch”并选择“Insert Nested Screen”,这一步将在“frmSearch”下面创建一个名字为form2的新表单屏幕,改变新表单屏幕的实例为frmLoading。 4. 现在你可以增加UI 组件(components) (等价于VB中的控件) 到表单。应用程序表单是应用程序中所有其它表单的父级;所有放在这个表单的物件出将在子表单中显示。对于这个应用程序, 我放了一个Google 的图像标志在左上角。 5. 选择“frmSearch”表单. 在组件面板(Components panel), 拖一个Label, button, TextInput, 和TextArea 组件到舞台. 排列这些组件如下图所示3. (右击并选择“Free Transform”缩放组件) 6. 使用属性检查器(Property inspector),给下列组件命名:Label:lblSearchTime; Button:BTnSearch; TextInput:txtQuery; TextArea:txtResults.创建动画 在这里我们将增加一个简单的动画元素到程序。为了这个目的,增加一个 "loading" 元素,让用户知道搜索正在进行: 1. 选择“frmLoading”表单屏幕。 2. 在右下角, 为用户增加一个指示载入进程的图像或者文本元素 (如图). 我制作了一个电影夹子(movie clip)在里面增加了一个进度条. 你可以增加一些文字(例如"Loading...")。然后选择 Modify > Timeline Effects 去创建一个动画而根本没有任何创作。 3. 在属性检查器中选择“frmLoading”然后改变可视化属性为false去隐藏“frmLoading” 。这个防止载入部件的默认为显示的.以后当执行搜索的时候我们可以通过ActionScript去使它显示出来。 用组件连接一个数据源 Flash MX Professional 有一个新的组件结构, 包括UI 组件和新的数据组件. 在Flash中, 组件不像DLLs是编译代码库. 更确切的说,他们是相当于VB 或 Delphi中控件. Flash Professional 增加了XMLConnector 和WebServiceConnector 组件,用这两个通知数据源去自动完成界面。 新的组件绑定允许你为数据组件去定义输入和输出. 用IDE构建的可视化设计面板, 你可以在你的表单中直接连接XMLConnector 或者 WebServiceConnector 参数到UI 组件. 你可以使用Flash组件指示器(类似于VB中的属性页)的参数选项卡。 下面我们用这些技术连接你的应用程序到Google 搜索服务: 1. 从组件面板拖一个“WebServiceConnector”组件到“frmSearch”表单屏幕。这个组件在发布成应用程序后是不可见的,给这个组件一个实例名为 GoogleSearch。 2. 选择“GoogleSearch”组件并打开组件检查器(Component inspector)。这是你设置所建立网络服务的地方。选择“参数选项卡”并设置“WSDLURL”为Google's 的WSDLURL地址(在本例中应这样写http://api.google.com/GoogleSearch.wsdl)。Flash 会自动请求这个服务并得到它有效的操作。从“operations”弹出菜单, 选择“doGoogleSearch” (如图).3. 在组件检查器中选择“绑定”(Bindings)选项卡。这个面板允许你绑定WEB服务的输入和输出直接到应用程序的一个UI组件。单击“+” 图标去选择你要绑定的参数。输入参数是用右箭头表标示,输出参数是用一个左箭头来标示 (如图)。Google界面需要所有的输入参数,因此一个一个的把它们增加到绑定列表,因为我们也需要绑定一个输出参数, 所也增加输出参数到列表。 4. 对于列表中的每一个绑定,你需要设置一个UI 组件, 一个变量参考, 或者一个文字变量去传给或从web 服务返回。首先从绑定列表中选择“params.q”―传给Google服务的搜索请求字串,然后把它绑定到“frmSearch”表单中的“TextInput”组件, 单击“Bound To”行上的"find" 图标。Flash打开“Bound To”对话框,那里显示了你应用程序的一个等级列表,查找“txtQuery”组件实例,选择它,然后单击OK按纽 (如图)。