2014-02-16 21:15:11 shangguanyingqi 阅读数 6320

转自: http://blog.csdn.net/chongtianfeiyu/article/details/8096446

ActionScript3.0(以下简称AS3.0)开发flash游戏目前已经成为主流使用的flash脚本语言。

AS3.0是面向对像的脚本语言,它由JAVA衍生出来,所以它拥有JAVA的编写特点。

它比AS2.0的运算速度提高近十倍,但是局限还是有的,所以在开发AS3.0的游戏有许多需要开发者注意的地方:
1.Document Class或Main 类
       顾名思义,Documet Class就是“文档类”,AS3.0的编写不再像AS2.0把大部分代码写在时间轴上或影片剪辑上,但是依然可以把代码写在时间轴上。如果这样的话,给后期修改或查找BUG带来了很大的不便,所以尽量不要把大段代码写在文档类中。
2.强大的事件侦听器Event
       AS3.0中,Event事件的功能变得十分的强大,我们再也不用onPress或onRelease来处理按钮事件了,取而代之的都变成了事件处理。所以原先的程序也要随之进行变化。这里可以用flash自带的event事件,同时也可以定义自定义的事。模块与模块之间不仅可以用回调函数来传递数据,也可以用事件侦听的方式来判断数据的变化。

3. XML的支持
        AS3.0中XML的功能比AS2.0优秀很多,代码效率和执行效率要优于AS2.0,功能非常全面,如果制作程序中需要十分多的数据,可以用XML进行外部存储读取。
4.AS3.0的数据存储方式
       使用如下几种存取数据方式进行存取100万次运算,所花时间依次为(单位为毫秒,ms):如下几种存取数据方式100万次存取运算效率依次为:* 类定义中的属性(如public、private类属性) 135 毫秒Point类对象 140毫秒Rectangle类对象(x等属性) 140ms* Array类对象 270ms* Object类对象 500 ms动态类动态属性 550* Rectangle类对象(left等属性) 700* 自定义类getter/setter 1000 自定义类Function 1000最快的是第一类,速度是Array的两倍,Object的四倍,getter/setter的约八倍。存取坐标要用Point和Rectangle,比Array快的多。 Object和动态类效率较低,一般情况下请尽量使用密封类。
5.游戏开发中需注意的事项:
例1.代码优化:在编写程序时不合理的代码编写习惯可能会影响程序的处理性能,因此好的书写习惯能提高程序的性能。
例1:
Var i:int = 0;
for(i = 0; i < array.length; i++)
{…}
的写法就比
For(var i:int = 0; I < array.length;i++)
{…}要好很多;

例2:清除容器中的所有物件可以用
While(spt. numChildren > 0)
{
 Spt.removeChildAt(0);
}来完成

例3:场景中的MovieClip或Sprite在清除之前一定要用removeEventListener把上面所有的事件清除掉,这样系统才会gc掉。

例4:请使用cacheAsBitmap进行位图缓存,对图形颜色多,元素多的加快CPU的处理速度。

例5:位图在运算速度上很快,但是在尺寸上变得很大,而矢量图虽然尺寸很小,但是在图形渲染上很占CPU资源,所以要选择尽量色差小,颜色简单的图形用矢量来做。大量复杂的图形可用位图代替。

例6:资源的压缩,矢量图中线段数量也决定了图形渲染的快慢。可以采用flash软件自带的修改->形状->优化,减少图形中的线条的数量。

例7: 用unit()或int()代替取整运算Math.floor()和Math.ceil()。比如var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。如果是Math.floor(),还可以用位运算(>>0)来代替。比如var test:uint =1.5>>0,比unit()或int()更快。
        用乘-1来代替Math.abs()方法。比如var nn:Number = -23;var test:Number= nn < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。当然还有更多的优化计算的方法。一般来说,低级运算要比高级运算速度;内部方法比调用其他方法速度快。另外要注意的是,这些方法有的时候可能并一定适用。

例8: 在各种重要的代码优化手段中,有这么一条:在定义局部变量的时候,一定要用关键字var来定义,因为在Flash播放器中,局部变量的运行速度更快,而且在他们的作用域外是不占用系统资源的。

例9在编写游戏时尽量不要把帧频设得太高,太高的帧频会导致CPU计算量加大。

例10:我们常用的关键字:for in 可以代替其它的循环语句。(这点值得商榷)

例11:不要过多使用 Object 类型。数据类型注释应力求精确,这样可以提高性能。只有在没有适当的备选数据类型时,才使用 Object 类型。同时也便于代码管理,时刻知道对象的类型和作用。同时也有利于编译器编译时优化

例12:对于类型是MovieClip等需要绘图的对像,能重复用的就重复用,比如删除一个对像后如果重新使用它,先判断if(mc == null)存不存在,存在就不再给它赋一个新的对像了。(AS3.0尽量用Shape类)

例13:善用对像池功能,在制作大型游戏时,往往会用到很多一模一样的影片剪辑,把从场景中删除的对像放入对像池中,当需要用到对像时,可以从池中直接创建新的对像来保证内存的占用。

例14:Lib注册机制,在制作大型的游戏时,往往是多人分工,一个游戏维护起来也相当复杂,这时可以采用Lib文件的注册方式添加游戏的事件管理。统一由一个时间片,或一个侦听池管理。减少了游戏运行时的负担,也起到了多人维护的作用。


2007-07-10 14:58:00 weixin_34183910 阅读数 101
      AS3.0和Flash Video Encoder的中文帮助终于出来了。
      这是我们学习和开发的好帮手,决不能错过。emteeth.gif
     官方的下载地址(PDF格式):
                                                         ActionScript 3.0 编程
                                                         ActionScript 3.0 组件帮助
                                                         Flash Video Encoder 用户手册
      还有CHM版语言参考        下载地址:
      (文件大小,4.03m):http://roading.net/download/help/as3helpcn.chm

转载于:https://www.cnblogs.com/CreateSunshine/archive/2007/07/10/812677.html

2015-10-10 18:59:21 qq_24714469 阅读数 1062

//刚接触as3.0,若有错误恳请指正,十分感谢。

as(actionscript)提供了在flash中许多交互功能,有两种方法可以使代码生效,一,在时间轴上右键,动作面板内添加代码(快捷键F9)。在这种情况下所有内容视为主类的一部分,运行flash之后在动作面板内的代码直接生效。但该主类内不允许嵌套类,为了使用自定义类,即第二种方法,在flash的主面板属性面板上添加独立的as文件。在所使用的flash根目录下创建类文件夹,(比如名为Classes)然后在文件内创建as文件(比如Main.as),然后在flash主面板属性内填写Classes.Main即可。需要注意的是第二种方法独立在主类之外,因此使用许多函数方法时需要import额外的库。

为了实现交互,在flash的素材库内可以导入图片,然后将图片转换为元件(影片剪辑MovieClip或按钮Button),之后可以直接命名其As链接并在代码区内使用,如StartButtonIn.addEventListener(MouseEvent.CLICK,f1_MouseClickHandler_1); //为按钮添加鼠标点击事件监听。

此外,在动作面板也提供有代码片段功能,能够自动生成部分代码。但若选中多个元件后使用此功能,会自动将所选元件合并为一个且后续可能报错。


2017-07-01 22:20:18 Tian_zhishang 阅读数 2897

       自flash的新版本语言ActionScript3.0发布以来已经过了不少时间,想必大家都已经从当初2.0与3.0的变化中缓了过来,但对新手而言,想要用AS3.0来实现特定功能仍然有一定难度,在这里就简单介绍下我曾经遇到过的问题,对播放控制进度条的制作及其对声音的控制这一块作些简单介绍。为了让和我一样处于起步阶段的同胞少走弯路,高手请自动忽视。

        每当看到别人制作出的flash作品时,大家都会发现上面会有个播放控制进度条,可以通过拖动进度条来方便的实现快进快退,从而能够实时的控制自己的观看进度。因此,一个好的flash作品基本都会配备一个进度条,既增强了交互性又能方便观众,何乐而不为呢?

        那么我们自己怎么制作进度条呢,可能有不少人在网上疯狂搜索,可是基本上能找到的都是用AS2.0写的,让我们就这样把代码弄到我们的作品中显然是不现实的,因为2.0和3.0的版本变化还是比较大的。因此,我在借鉴了网上相关作品的基础上,对其加以改进整合,制作出了用3.0语言写的播放进度条,使其能够完美实现进度条这个功能,废话不多说了,下面贴代码:

          

          

             

        作个滑块和一个进度条,然后两个组合一下就成了播放控制进度条合的话要改一下数据,这个我代码中会标记在哪改。

        下面是代码,写在进度控制这个元件里,三个都用影片剪辑就可以了

如下图

                              


代码如下:

import flash.events.MouseEvent;
import fl.motion.MotionEvent;


//progressBar是进度条的名称,slider是滑块的名称
//滑块的状态

//动态获取滑块的x坐标

var drag:Boolean= false;
var sliderX:Number;
//滑块的滑动范围,前面两个参数分别是滑块和进度条重合的x和y坐标,开始没对齐的可以用这个改坐标使滑块和进度条对齐
//后面两个参数是横向偏移量和纵向偏移量

var rect:Rectangle = new Rectangle(0, -27.25,progressBar.width, 0);
//ENTER_FRAME事件,即时更新滑块的位置
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
function EnterFrameHandler(e:Event):void
{

        //自然播放的结果
        if (drag == false) 
{
        //获取主场景中的currentFrame和totalFrames,并算出滑块的x坐标

        sliderX = root["currentFm"]/(root["totalFm"]/progressBar.width);
        slider.x = sliderX;
}
     
   //认为滑块拖动之后的结果
if (drag == true) 
{
        MovieClip(root).gotoAndStop(Math.floor((Math.abs(slider.x)+1)*(root["totalFm"]/progressBar.width)));
        }

if (slider.x<=0 && drag == true) 
{
        slider.x = 0;
        MovieClip(root).gotoAndStop(1);
        }
                if (slider.x>=progressBar.width) 

{
        drag = true;

}
   //安上进度条后从最后一帧跳到第一帧,这边2280是我的flash最后一帧的前一帧方便侦听,
   //需要的自行更改

   if(root["currentFm"]==2280)  
MovieClip(root).gotoAndPlay(1);
}











 
//注册事件侦听
//鼠标左键在滑块上按下
//鼠标左键在滑块上抬起
//鼠标左键在进度条上按下
//鼠标左键在进度条上抬起

slider.addEventListener(MouseEvent.MOUSE_DOWN,slider_DOWN);    
slider.addEventListener(MouseEvent.MOUSE_UP,slider_UP);        
progressBar.addEventListener(MouseEvent.MOUSE_DOWN,progressBar_DOWN);  
progressBar.addEventListener(MouseEvent.MOUSE_UP,progressBar_UP);     

//事件侦听函数
function slider_DOWN(evt:MouseEvent):void{
   
 evt.target.startDrag(false,rect);     //按住滑块,滑块随鼠标拖动
   
 drag=true;
    stage.addEventListener(MouseEvent.MOUSE_UP, slider_UP);
           //在舞台上添加一个监听器
//防止出现在滑块上按下在其他位置抬起的情况
    }
     
function slider_UP(evt:MouseEvent):void{
    stage.removeEventListener(MouseEvent.MOUSE_UP, slider_UP);
 //移除在舞台上抬起左键时的监听器
    stopDrag();
    drag=false;
    MovieClip(root).play();
   //鼠标左键抬起后主场景继续播放,需要暂停的写stop()
   
 }
 
function progressBar_DOWN(evt:MouseEvent):void{
    drag=true;
    slider.x=mouseX;
    }
function progressBar_UP(evt:MouseEvent):void{
        drag=false;
        MovieClip(root).play();
    }

           上面的就是进度控制条的代码了,不过大家肯定会发现还有两个东西没定义,没错,就是currentFm和totalFm,不过不用担心,这两个都是主场景的,只需要在主场景的第一帧加上这么一段代码就可以使用了,

var totalFm:Number=totalFrames;
var currentFm:Number;
 
addEventListener(Event.ENTER_FRAME,reflash);
 
function reflash(e:Event):void{
    currentFm=currentFrame;
}

 

       恩,对于只需要播放进度控制条这一块的朋友,那么看到这里就可以了,上面的代码都是可以直接拿去用的,不过你以为我会这样就结束了?注意看我的标题,没错,是播放控制进度条与控制声音的两种模式,进度条说完还有声音控制这一块呢,那么接下来就进入第二块内容——进度条对声音的控制。

       想来不少朋友刚做这一块的时候都要求加入声音吧,那么简单的导入声音什么的我想大家都会了,导入到库或者导入到舞台都可以,想要与动画同步的话设置成数据流格式即可,这边估计没人会有疑问。那么接下来就是让声音与进度条同步的问题了,

对于只有一种声音,直接导入到主时间轴上的并让它随着时间轴的播放而播放的这种情况,我们只需要静观其变,对就是什么都不做,因为我们使用的的是MovieClip(root)来控制主场景随着进度条的移动而移动的,而当一种音乐以数据流格式导入到主时间轴上时,该音频也会和主场景上其他元件一样与进度条进度一致,所以不需要作什么改变。

        那么接下来介绍第二种放置音乐的办法,那就是导入到影片剪辑里,相信肯定有不少人卡在这方面上,以致见到影片剪辑元件就是又爱又恨。那么相比直接导入主时间轴上,导入到影片剪辑有什么好处呢?大家都知道影片剪辑就相当于一个小的独立的swf文件,它有自己独立的时间轴,而且能用actionscript3.0语言对它进行控制。不过虽然把声音导入到影片剪辑(以下简称MC)中是很有好处的,但是如何用进度条进行控制就成问题了。以往直接导入声音时,声音随进度控制,让它停就停,让它播就播,像个乖宝宝一样。然而一进入MC中立马开始使坏,不是播了停不下来就是在重复播,到处写满了stop();不是空属性错误就是停不下来,感觉很容易让人找不到头绪。其实我开始也是这样,一行一行的注释,一行一行的写停止,到了测试的时候正常播放或者把进度条往后拖还好,一旦往前拖就会出现从MC开头播放的问题,往前点几次就播放几次,那声音组合起来听起来简直是“天籁之音”,折磨的人发狂。好吧扯远了,接下来就说说怎么解决吧。

      解决方法当然是很简单的,因为MC元件中放入声音后,即使有时候你写了停止,但是在停止之前,已经触发了MC的第一帧,然后MC中的声音就开始播放了,这时你要做的就是在第一帧加入空白帧,如果音频前几帧不重要的话也可以拆分音频把第一帧转为空白关键帧,这样通过进度条往前拖拉时就不会出现MC自动播放的问题了。

     那么解决完这个,那就是如何控制音频播放进度的问题了,同样的,只要把上面的 MovieClip(root).gotoAndStop(Math.floor((Math.abs(slider.x)+1)*(root["totalFm"]/progressBar.width)));

这句代码复制一下然后稍作修改即可,假设放音频的MC实例名是mc,那么控制mc的代码就是下面这句

root["mc"].gotoAndPlay(Math.floor((Math.abs(huakuai.x)+1)*(root["totalFm"]/bar.width))+X);

此句中的“+X”是可以改变音频提前或延迟播放的帧数,也可以在MC中手动修改,正好合适的就可以删掉“+X”,

这样就实现了用进度条控制MC存放的声音的功能。

     另外再说一些功能,如果想要控制播放到指定帧可以用gotoAndPLay(); 或者gotoAndStop();

如果想控制mc在哪些帧不播放只需要在进度控制中加以下代码: if(root["currentFm"]<=25)

root["mc"].stop();之类的就可以控制了,还有一些其他控制都是类似,这里不作赘述。

      上述内容如有错误,欢迎各位朋友加以指正,如有问题,也可互相探讨。

2013-08-19 10:48:12 u010031939 阅读数 0

一。把.flv文件放在video文件中使video文件和Flash文件在同一个目录下。

二.as代码。

package ch14_1
{
	import flash.display.MovieClip;
	import flash.events.AsyncErrorEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	
	public class FLVText extends MovieClip
	{
		public function FLVText()
		{
			var nc:NetConnection = new NetConnection();//通过NetConnection 对象nc,建立数据和数据源的连接
			nc.connect(null);//视频位置在本地,null
			var ns:NetStream = new NetStream(nc);//声明一个ns,使用nc作为连接的参数
			ns.play("video/梦想宣言.flv");//视频流ns回放指定的flv文件
			var video:Video = new Video(550,400);//视频框对象video,width =550,height =400
			addChild(video);//显示
			video.smoothing =true;//是哦in渲染时使用平滑处理
			video.attachNetStream(ns);//指定视频对象显示视频流ns
			ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError);//定义回调函数
		}
		private function asyncError(e:AsyncErrorEvent):void
		{
			
		}
	}
}

Flash AS3.0实战

阅读数 52