发新话题
打印

[转帖]Flash MX游戏制作常用代码解析

[转帖]Flash MX游戏制作常用代码解析

Flash MX游戏制作常用代码解析 Flash MX(以下简称Flash)在网络中的地位如日中天,各种使用Flash制作广告Flash MTV数不胜数,同时无论是自娱还是商业用途,Flash方便的界面制作和丰富的ActionScript控制为大家制作Flash游戏提供了更多的空间。   下面,我们讨论Flash游戏制作中最常用的一些ActionScript,并配以精彩的实例讲解,以方便大家在制作中查阅。   一、获得随机数   随机函数在Flash游戏制作中很常用,例如在拼图游戏中,每次开始新的游戏时,可以利用随机函数使图块获得新的位置,试想一个千篇一律的游戏谁会有兴趣玩下去呢?   我们有两种产生随机数的方式:random()和Math.random()。举例来讲,如果我们随机赋给x一个0~5的数,可以使用x=random(6)或者x=Math.random()*5。   但这两种方式产生的随机数是有区别的。用random(6)方法返回的x是0<=x<=5的整数,而另外一种返回的x则是0<=x<5的小数。   试着在第一帧中写入下面的ActionScript,并在第二帧创建内容帧以形成循环:   x = random(6);   y = Math.random()*5;   trace("x="+x+",y="+y);   在output窗口中将得到以下数据:   …   x=1,y=3.66887632058933   x=2,y=4.39878350123763   x=0,y=0.522367884404957   x=3,y=2.95675310306251   x=5,y=4.03038211166859   x=2,y=0.223042098805308   …   区别一目了然。   二、获得鼠标及MC(MovieClip)的位置   另外一个在Flash游戏制作使用频率比较高的参数就是坐标了,鼠标的坐标和MC的坐标的获得方式是不同的。鼠标的坐标可以用_xmouse和_ymouse获得,MC的坐标可以用MovieClip._x和MovieClip._y获得。   值得注意的是,在获得坐标时,要考虑实际需要的坐标值是相对的还是绝对的。   下面给出了一个典型的获得鼠标相对坐标和绝对坐标的例子。如图1所示。   其中,浅色的正方形是一个被命名为mc的MovieClip,四个文本框属性均被设置为Dynamic Text,场景中的两个用于获得变量x_timeline和y_timeline(绝对坐标),正方形中的两个用于获得变量x_movieclip和y_movieclip(相对坐标),为了获得变量,需要在文本框的属性面板中的Var属性中分别填入相应的变量名,与上面例子形成循环的方式一样,在第一帧中写下面的ActionScript,第二帧创建为内容帧:   x_timeline = _root._xmouse;   y_timeline = _root._ymouse;   x_movieclip = mc._xmouse;   y_movieclip = mc._ymouse;   注意:场景的坐标原点为其左上角,坐标值向右向下递增,为正值(这与我们通常意义的坐标并不相同);MC的坐标原点是编辑MC时的中心,坐标象限如图2所示。   获得MC坐标的方法与上面说的大同小异,我们将在下面的MC属性简介中做介绍。   三、MC常用属性   获取和控制MC的各种属性如位置、色彩、大小、帧数等在Flash游戏制作相当重要。   MC常用的属性大致如下表所示: 属 性用 法说  明可获得可设置取值范围 _x _yMC._x MC._y返回/设置MC的横纵坐标值YY数值 _xscale _yscaleMC._xscale MC._yscale返回设置MC的x/y轴缩放比例YY数值 _alphaMC._alpha返回/设置MC的透明度YY0~100 _visibleMC._visible返回/设置MC的可见性YYTrue;False _width _heightMC._width MC._height返回/设置MC的宽/高值YY数值 _rotationMC._rotation返回/设置MC的角度YY数值 _currentframeMC._currentframe返回MC的当前帧YN- _totalframesMC._totalframes返回MC的总帧数YN- _framesloadedMC._framesloaded返回已下载帧数YN- _nameMC._name返回/设置MC的名称YY-   具体使用方法参看下例,如图3所示。   完整的源代码:   onClipEvent (enterFrame) {       with (this) {         _root.mw = _width;         _root.mh = _height;         _root.mr = _rotation;         _alpha = _root.al.textinput.value.text;         _xscale = _root.xs.textinput.value.text;         _yscale = _root.ys.textinput.value.text;          if (_x>=330 && _x<=470) {            _x += _root.xInt;          } else {             _x = 400;          }          if (_y>=40 && _y<=165) {             _y += _root.yInt;          } else {             _y = 100;          }           _rotation += _root.rInt;       }   }   需要说明的是:MC的_width和_height属性是基于场景坐标系的(这就是为什么在旋转MC时其_width和_height的值会发生变化的原因);而_xscale和_yscale属性则是基于MC自己的坐标系的,拖拽上例中的_xscale或_yscale控制柄,会看到MC以自身的坐标进行缩放变化。   四、判断按键   既然是游戏,当然就要响应玩家的各种反应。除了鼠标,最直接的就是键盘了。   响应键盘无非是判断玩家按下了哪一个键或者组合键,要实现这些其实很简单,我们既可以通过按钮或MC的事件来响应按键,也可以通过帧上的动作来响应。   1.按钮的keyPress方法   先说按钮,按钮除了响应鼠标的一些动作(如rollOver,release……)之外,还有几个是响应固定按键的(如Enter,Left,Home,PageDown……),下面我们就来制作一个。   建立一个按钮,拖到场景中,捆绑下面的ActionScript:   on (keyPress "") {   trace("按下了Left键");   }   这样在测试的环境下,按下左方向键后,output窗口就会显示出“按下了Left键”。   2.MC响应单个按键   onClipEvent (keyDown) {   if (Key.isDown(72)) {   trace("按下了H键");   }   }   这样在测试的环境下,按下H键,output窗口就会显示出“按下了H键”,其中72是H键的keyCode值(其他按键的keyCode值将在后面的对照表中给出),如果不知道某个键的keyCode值也没关系,Flash为我们提供了getCode函数,将上面ActionScript中的72替换成Key.getCode("H")会得到同样的效果。如图4所示。   完整的源代码:   onClipEvent (load) {       // 初始化瓢虫移动的速度       speed = 5;   }   onClipEvent (enterFrame) {       // 垂直/水平方向       if (Key.isDown(Key.LEFT) && !Key.isDown(Key.RIGHT)) {           _x -= speed;           _rotation = 270;       }       if (Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT)) {           _x += speed;           _rotation = 90;       }       if (Key.isDown(Key.UP) && !Key.isDown(Key.DOWN)) {           _y -= speed;           _rotation = 0;       }       if (Key.isDown(Key.DOWN) && !Key.isDown(Key.UP)) {           _y += speed;           _rotation = 180;       }       //       // 倾斜方向       if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.DOWN)) {           _rotation = 315;       }       if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.DOWN)) {           _rotation = 45;       }       if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.UP)) {           _rotation = 225;       }       if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.UP)) {           _rotation = 135;       }       //       // 保证瓢虫在视线内       if (_y<0) {           _y = 300;       }       if (_y>300) {           _y = 0;       }       if (_x<0) {           _x = 300;       }       if (_x>300) {           _x = 0;       }   }   3.MC响应组合键   onClipEvent (keyDown) {   if (Key.isDown(72) && Key.isDown(17)) {   trace("您按下的组合键是Ctrl+H");   }   }   在测试的环境中按下Ctrl+H键,output窗口就会显示出“您按下的组合键是Ctrl+H”。   4.利用帧上的动作响应按键   新建一个Flash文件,利用上面讲过的:在第一帧写ActionScript,第二帧创建内容帧的方法,使影片形成循环以便随时进行判断,然后在第一帧中写入下面的几组代码,分别进行试验;你也可以不建立第二帧,而是用试验代码代替_root.onEnterFrame=function(){...}中的“...”来达到同样的效果:   //①   trace(Key.getCode());   //②   if (Key.isDown(72)) {   trace("按下了H键");   }   //③   if (Key.isDown(72) && Key.isDown(17)) {   trace("按下了Ctrl+H组合键");   }   //④   if (Key.isDown(17)) {   if (Key.isDown(72)) {   temp = "+H";   }   if (Key.isDown(71)) {   temp = "+G";   }   trace("按下了Ctrl"+temp+"键");   }   注意:对于MC的(2)(3)两种情况,可以将keyDown事件改为enterFrame事件,其中(2)还可以替换为keyUp事件。   5. 键码值对照表   下面,我们给出键码值,供读者速查。   (1)字母和数字键的键码值(keyCode) 按键键码按键键码按键键码按键键码 A65J74S83149 B66K75T84250 C67L76U85351 D68M77V86452 E69N78W87553 F70O79X88654 G71P80Y89755 H72Q81Z90856 I73R82048957   (2)数字键盘上的键的键码值(keyCode) 按键键码按键键码按键键码按键键码 09641008104Enter108 19751019105-109 2986102*106.110 3997103+107/111   (3)功能键键码值(keyCode) 按键键码按键键码按键键码按键键码 F1112F4115F7118F10121 F2113F5116F8119F11122 F3114F6117F9120F12123   (4)控制键键码值(keyCode) 按键键码按键键码按键键码按键键码 BackSpace8Esc27Right Arrow39-_189 Tab9Spacebar32Down Arrow40.>190 Clear12Page Up33Insert45/?191 Enter13Page Down34Delete46`~192 Shift16End35Num Lock144[{219 Control17Home36;:186\|220 Alt18Left Arrow37=+187]} 221 Cape Lock20Up Arrow38,<188';" 222   五、检测碰撞   目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了hitTest,hitTest既可以检测MC与MC的碰撞,也可以检测鼠标与MC的碰撞,看下面的例子,如图5所示。   完整的源代码:   str1=mc1.hitTest(_xmouse,_ymouse)   str2=mc2.hitTest(mc3)   hitTest的语法如下:   1.myMovieClip.hitTest(x,y,shapeFlag)   这用来检测鼠标的碰撞,x和y分别代表鼠标的横纵坐标,shapeFlag用来规定检测以MovieClip的最大边界为限或以MovieClip的实际边界为限。请参看下例。   在图5所示的实例中,用按钮转换shapeFlag的值,在属性文本框中将反映转换的结果,当属性为True时,鼠标只有在测试MC的红色区域时,碰撞才显示True。而当属性为False时,只要鼠标在测试MC的范围内,碰撞就显示True,无论是在红色区域还是内部的白色区域。如图6所示。   完整的源代码:   on (release) {       _root.flag = not _root.flag;   }   2.myMovieClip.hitTest(target)   检测MC之间的碰撞,应用起来十分简单,具体内容请参考图5所示的实例代码。      六、MC的复制与卸载   MC的复制与卸载,无论在Flash游戏还是其他Flash作品中都很常见。   MC的复制,顾名思义,就是产生出一个与目标相同的MC(除name和depth以外)。其语法为:duplicateMovieClip(target,newname,depth)   target:被复制目标的名称。   newname:复制出的MC的名称。   depth:复制出的MC的深度。   需要注意,复制出来的新MC的name最好不要相同,也不要与被复制的MC的相同,因为这样会给控制带来不可预期的麻烦;另外depth也是一个相当重要的参数,如果新复制出的MC与前面某个复制的MC的depth属性相同(即位于通一深度),那么以前被复制的MC将被新复制的MC替换(不管它们是否属于同一被复制目标),这个特性经常被用来制作鼠标跟随的效果。   再来说说MC的卸载:   removeMovieClip(target);   只要将要被卸载的MC的name替换掉语句中的target就可以成功的完成卸载任务。   七、获取影片运行时间   获取自影片开始播放时起已经过的毫秒数虽然很简单,但其利用率却很高,尤其是在一些需要计时的游戏中。   getTimer();   这个函数用以返回自影片开始播放时起已经过的毫秒数,虽然是个很简单的函数,但用利用率却很高,尤其是在一些需要计时的游戏中。   需要说明的是:毫秒与秒的计算公式为1毫秒=1/1000秒;函数以影片第一次播放的开始时刻为0,不受任何其他因素影响。也就是说如果你想从头开始计时,那么只有重起player,或者定义一个变量来存放getTimer的值,然后用getTimer与变量做减法运算以便得到新的运行时间,看下面的例子,如图7所示。   完整源代码:   time_old=Math.round(getTimer()/1000)   time_new=time_old-tTime   八、颜色的设置   说到颜色必须先说说什么是对象,对象就是预先定义好的用来访问某些特定类型的信息的集合,大多数预定义对象都有自己的方法(被指派给一个对象的函数被称为这个对象的一个方法),你可以通过这些方法得到不同类型的返回值或执行某个动作。   预定义对象包括普通对象和顶级对象。普通对象在使用前需要创建(我们将要提到的Color对象就属于这一类),而顶级对象则可以直接调用(如下面要说的Math对象)。   下面我们详细介绍一下Color对象,它包含四种方法:   getRGB():返回由最后一次setRGB调用设置的数值。   getTransform():返回由最后一次setTransform调用设置的转换值。   setRGB(0xRRGGBB):指定Color对象实例的RGB颜色,调用此方法会覆盖由setTransform方法设置的任何以前的设置。   setTransform(colorTransformObject):设置Color对象实例的颜色转换信息。colorTransformObject参数是通过new Object构造函数创建的通用对象它具有指定颜色的红、绿、蓝和alpha(透明度)成分百分比和偏移量数值的参数,颜色转换对象的参数与“高级效果”对话框中的设置相对应,定义如下:   ra:红色成分的百分比(-100到100)。   rb:红色成分的偏移量(-255到255)。   ga:绿色成分的百分比(-100到100)。   gb:绿色成分的偏移量(-255到255)。   ba:蓝色成分的百分比(-100到100)。   bb:蓝色成分的偏移量(-255到255)。   aa:alpha的百分比(-100到100)。   ab:alpha的偏移量(-255到255)。   可以按如下形式创建colorTransformObject参数:   myColorTransform = new Object();   myColorTransform.ra = 50;   myColorTransform.rb = 244;   myColorTransform.ga = 40;   myColorTransform.gb = 112;   myColorTransform.ba = 12;   myColorTransform.bb = 90;   myColorTransform.aa = 40;   myColorTransform.ab = 70;   也可使用以下语法来创建colorTransformObject参数:   myColorTransform = {ra:';50';,rb:';244';,ga:';40';,gb:';112';,ba:';12';,bb:';90';,aa:';40';,ab:';70';}   下面的例子展示了为一个目标电影创建一个新的Color对象,使用Object构造器创建一个颜色改变对象以及使用setTransform方法将这个颜色改变对象传递给一个Color对象的过程,如图8所示。   //为目标MC创建一个名为myColord 的对象   myColor=new Color(MC);   //使用普通对象Object对象创建一个名为myColorTransform的颜色改变对象   myColorTransform=new Object;   //为myColorTransform设置值   myColorTransform={ra:';50';,rb:';244';,ga:';40';,gb:';112';,ba:';12';,bb:';90';,aa:';40';,ab:';70';};   //将颜色改变对象和为MC创建的颜色对象关联起来   myColor.setTransform(myColorTransform);.   完整源代码:   单击setTransform按钮,输入以下代码。   on (release) {       myColor = new Color(_root.mc);       myTransform = new Object();       //判断数值是否在规定范围内       with (_root) {           if (ra<-100) {               ra = -100;           }           if (ra>100) {               ra = 100;           }           if (rb<-255) {               rb = -255;           }           if (rb>255) {               rb = 255;           }           if (ga<-100) {               ga = -100;           }           if (ga>100) {               ga = 100;           }           if (gb<-255) {               gb = -255;           }           if (gb>255) {               gb = 255;           }           if (ba<-100) {               ba = -100;           }           if (ba>100) {               ba = 100;           }           if (bb<-255) {               bb = -255;           }           if (bb>255) {               bb = 255;           }           if (aa<-100) {               aa = -100;           }           if (aa>100) {               aa = 100;           }           if (ab<-255) {               ab = -255;           }           if (ab>255) {               ab = 255;           }           myTransform.ra = ra;           myTransform.rb = rb;           myTransform.ga = ga;           myTransform.gb = gb;           myTransform.ba = ba;           myTransform.bb = bb;           myTransform.aa = aa;           myTransform.ab = ab;       }       //将设置付给MC       myColor.setTransform(myTransform);   }   单击Reset按钮,输入以下代码。   on (release) {       with (_root) {           ra = 100;           rb = 255;           ga = 0;           gb = 0;           ba = 0;           bb = 0;           aa = 100;           ab = 0;           reColor=new Color(mc)           reColor.setRGB(0xff0000)           mc._alpha=100       }   }   九、三角函数   提到数学函数很多人是不是会感到“恐惧”,但在游戏制作中它可是必不可少的,这里我们利用Math的atan方法来制作一个永远指向鼠标的指针。   三角函数属于Flash中的顶级对象──Math,它在我们制作游戏中必不可少。   这里我们利用Math的atan方法来制作一个永远指向鼠标的指针,如图9所示。其他的三角函数以及数学函数的用法和注意事项请参考数学函数表。   新建一个MC,画一个长度为70的水平指向右侧的箭头(箭头根部放在中心点上),回到场景,按下Ctrl+J键修改影片的大小为200*200,将指针从库中拖入场景,命名为“pointer”,修改坐标为100*100,在主timeline的第一帧中写如下ActionScript:   x = _xmouse-100;   y = _ymouse-100;   //将坐标中心移到场景的中心   tan = Math.atan(y/x)*180/Math.PI;   //注意要使用弧度表示的角度值   if (x>=0 && y>=0) {     r = Math.round(tan);   } else if (x>=0 && y<0) {     r = Math.round(360+tan);   } else {     r = Math.round(180+tan);   }   //判断各种不同的情况,通过运算使r值在0-360之间   pointer._rotation = r;   //将r值付给_rotation   放置一个用来显示r值的文本框属性为Dynamic Text,获取变量(Var)为“r”,,第二帧建立内容帧,按下Ctrl+Enter键测试。   下面,我们给出数学函数表(Math)。 方法描   述语 法说   明 Abs计算并返回由参数x指定的数字的绝对值Math.abs(x) acos以弧度为单位计算并返回参数x中指定的数字的反余弦值Math.acos(x)-1.0<=x<=1.0 asin以弧度为单位计算并返回参数x中指定的数字的反正弦值Math.asin(x)-1.0<=x<=1.0 atan计算并返回参数 x 中指定的数字的反正切值Math.atan(x)返回值介于-pi/2与pi/2之间 atan2以弧度为单位计算并返回y/x的反正切值.返回值表示相对直角三角形对角的角,其中x是临边边长,而y是对边边长Math.atan2(y,x)x/y分别指定点的x坐标和y坐标 ceil返回指定数字或表达式的上限值.数字的上限值是大于等于该数字的最接近的整数Math.ceil(x) cos返回由参数x指定的角的余弦值(介于-1.0与1.0之间的值)。必须以弧度为单位指定角度xMath.cos(x) x为弧度,换算公式为:1弧度=角度*180/Math.PI exp返回e的x次方的值,其中e为自然对数的底 (e),x为参数x中指定的指数Math.exp(x)常数Math.E可以提供e的值 floor返回参数x中指定的数字或表达式的下限值。下限值是小于等于指定数字或表达式的最接近的整数Math.floor(x)表达式:Math.floor(12.5)将返回值:12 log返回参数 x 的自然对数Math.log(x) x>0 max返回两个数中最大者Math.max(x,y) min返回两个数中最小者Math.min(x,y) pow计算x的y次幂Math.pow(x) random返回n,其中0<= n<1Math.random()获得a-b之间的随机整数的公式为:Math.floor(Math.random()*(b-a+1)+a) round将参数x的值向上或向下舍入为最接近的整数并返回值Math.round(x) sin计算并返回以弧度为单位指定的角度的正弦值Math.sin(x)换算公式参见cos sqrt计算并返回指定数字的平方根Math.sqrt(x)x>=0 tan计算并返回指定角度的正切值Math.tan(x)换算公式参见cos   以上我们向大家介绍了Flash游戏制作中最常用的一些ActionScript,掌握了这些基本控制方法,就可以制作出很多有意思的Flash游戏,同时在制作的过程中你还会发现更多的技巧。

TOP

发新话题