原文地址:http://bbs.9ria.com/viewthread.php?tid=4122
新官上任,得放点火。但是小弟不才,写个简单的教程先。 希望大家有关游戏编程的问题、教程、心得都来游戏编程讨论区发帖,本人特喜欢送银两。
本教程由WiZiM(wizim404.com)原创于bbs.actionscript3.cn论坛。 博客地址:wizim.actionscript3.cn 转载请注明出处.若有问题和意见请发邮件给我:wzm92[at]yahoo.com.cn
我等游戏爱好者最困扰的事情就是flash在浏览器中的帧速。他总比在本地播放器中的播放的帧速慢10%-40%。有的玩家帧速快,有的玩家帧速慢,尤其影响flash联网游戏的公平性。 早在as2时代,前辈们发现在html中改变wmode属性来改善帧速(挺有用的,和本地播放器播放差不多快了,详细内容:http://nextframe.jp/fpsCheck/fpsCheck.htm),但是呢,我们做的游戏会被很多网站转载,我们能控制自己网站的wmode,不能控制其他网站的wmode啊。而且wmode有个致命的缺点就是按方向键会使网页的发生滚动。这样游戏中就要不得不使用wsad按键方案,很多玩家会感到不适应。
而as3时代来临了,我们有了更好的办法控制帧速了。没错就是stage.frameRate! 我们现在可以运行时动态改变flash的帧速了,比如你帧速是30帧每秒,但是实际是23帧每秒。我们就设定他帧速为37帧每秒。实际帧速就会有提升了。 来看代码:
- const FRAMERATE=stage.frameRate//将初始帧速保存为常量,即期望每秒帧数
- var frameNum=0;//定义帧数计数器,每次enterframe都会使之自加1
- var oldFrameNum=0;//1秒前的帧数计数器的值,这样可以计算出1秒内过了多少帧。
- var errFrameNum=0;//最后看才知道干什么用,现在先不关他。
- /*
- *定义一个文本框来显示一些数值
- */
- var tf=new TextField()
- addChild(tf);
- tf.x=200;
- tf.y=200;
- tf.autoSize=TextFieldAutoSize.CENTER;
- /*
- *定义一个计时器,1000毫秒也就是1秒钟会运行一次timerHandle函数
- */
- var myTimer= new Timer(1000);
- myTimer.addEventListener(TimerEvent.TIMER, timerHandle);
- myTimer.start();
- /*
- *每帧都要做的事情 是什么呢?看看enterFrameHandle函数里,只是把frameNum++;
- */
- addEventListener(Event.ENTER_FRAME,enterFrameHandle);
- /*
- *以下函数一秒钟执行一次。
- */
- function timerHandle(e:*)
- {
- var frameNumPerSec=frameNum-oldFrameNum;//此时的总帧数减去上一秒的帧数就是这1秒走过的帧数,也就是实际帧速
- oldFrameNum=frameNum;//把现在的帧数保存下来,作为下一秒的oldFrameNum
- if(frameNumPerSec>FRAMERATE)//实际帧速大于期望帧速的时候我们要做一些处理
- {
- stage.frameRate-=(frameNumPerSec-FRAMERATE)//将设定帧速降低,降低多少就要看实际帧速与期望帧速差多少了
- }else if(frameNumPerSec<FRAMERATE)//同理
- {
- stage.frameRate+=(FRAMERATE-frameNumPerSec)
- }
- tf.text="帧速设定值"+String(stage.frameRate)+",实际帧速"+String(frameNumPerSec);//显示到文本框中
-
- /*
- *总不能设定帧速都上万了,实际帧数还不能达到期望吧。以下代码为了避免这种情况。
- */
- if(frameNum>1000 && (frameNumPerSec<FRAMERATE-10||frameNumPerSec>FRAMERATE+10||stage.frameRate>FRAMERATE+30||stage.frameRate<FRAMERATE-30))//从1000帧以后再检测,因为刚打开flash的时候就是有些卡的。
- {
-
- if(++errFrameNum>=5)
- {
- trace("您的计算机不能为此游戏保持稳定的帧速\n请关闭一些软件或者到官方网站下载exe版本")
- stage.removeChildAt(0);
- removeEventListener(Event.ENTER_FRAME,enterFrameHandle);
- myTimer.removeEventListener(TimerEvent.TIMER, timerHandle);
- errFrameNum=0;
- }
-
- }else{
- errFrameNum=0;
- }
-
-
- }
- function enterFrameHandle(e:*)
- {
- frameNum++;
- }
复制代码
|