Flash游戏开发教程3.docx

上传人:b****3 文档编号:5209464 上传时间:2022-12-14 格式:DOCX 页数:15 大小:25.93KB
下载 相关 举报
Flash游戏开发教程3.docx_第1页
第1页 / 共15页
Flash游戏开发教程3.docx_第2页
第2页 / 共15页
Flash游戏开发教程3.docx_第3页
第3页 / 共15页
Flash游戏开发教程3.docx_第4页
第4页 / 共15页
Flash游戏开发教程3.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Flash游戏开发教程3.docx

《Flash游戏开发教程3.docx》由会员分享,可在线阅读,更多相关《Flash游戏开发教程3.docx(15页珍藏版)》请在冰豆网上搜索。

Flash游戏开发教程3.docx

Flash游戏开发教程3

  做游戏用到最多,同时也是FLASH里最重要的类,就是~~~~~~~~~“MovieClip类”!

  鸟鸟们不知不觉的就一直在用MovieClip类,比如你有没有经常写:

mc.onEnterFrame..

  onEnterFrame就是MovieClip类里的一个方法,只要是个MC(自动被绑上了MovieClip类),就都能用onEnterFrame。

Webjx.Com

  现在回到第一节说的那个天上掉宝地下人物接的游戏。

  人物有两个:

小李和鸣人

  经过分析,这两个人物基本控制部分是一样的,然后就区别在两个人的各自的特殊技能不一样。

  于是我们可以这么做:

  先建个“人物基本控制.as”类

  建个“小李.as”类,第一行一句代码继承“人物基本控制.as”类,然后在正文内容里写上小李特殊技能

建个“鸣人.as”类,第一行一句代码继承“人物基本控制.as”类,然后在正文内容里写上鸣人特殊技能

  见图:

Flash游戏开发教程:

第三节src="

  大家可以看到,“人物基本控制.as”类也是继承了MovieClip类,因为要用到MovieClip类里的功能嘛~比如人物移动要用到onEnterFrame,MC._x,MC._y这点功能。

  类的继承,还可以覆盖继承过来类里的方法。

  比如A类有move、jump、attack三个方法

  我要写个B类,也包括这三个方法,但是attack这个方法和A类的attack有点不同,而move、jump这两个方法则和A类里的一模一样。

  于是我们写B类,第一行先写句话继承了A类。

然后在正文里把attack方法重写一次,就自动覆盖掉了继承过来的A类的attack方法。

其它的方法就不用写了,因为直接继承过来了。

  让我们来换个思路做上面那个例子。

  直接写了“小李.as”类,然后让“鸣人.as”类继承小李类,正文里只需要把特殊技能方法重写遍就OK了。

  见图:

Flash游戏开发教程:

第三节src="

  看了那么多概念,小鸟们要想,咋还不教具体怎么写CLASS呢?

  别急啊,下节里会简单的教些的。

  其实我对这种死东西教学还是比较头大的,鸟鸟们也可以自己网上搜下具体CLASS撰写格式、规矩和变量、方法类型。

肯定比我教的要详细。

因为我在CLASS方面也只能算只比小鸟略微胖点点的中鸟啊,哈哈

Flash游戏开发教程:

第四节

请先阅读:

Flash游戏开发教程:

第三节。

  本来不想写这节的,因为这节的内容很多书上或者网上资料都有,而且写的比我要详细正规得多。

但后来想想,还是写吧!

  而且后面几节要结合接宝的范例游戏,具体分析它的几个CLASS,所以,还是用一节把CLASS的写法说一下。

可能我对CLASS的写法也不是很正规,有老鸟看了后,最好也能指点一下。

  先来个CLASS基本的模式。

  文件名:

Time_control.as

classTime_control{

  //第一部分:

声明本CLASS要用到的变量

  staticvara:

Number=2;

  privatevarb:

Number;

  privatevarc:

Number=1;    

  publicvard:

Number;

  //第二部分:

构造函数

  functionTime_control(){

    init();

  }

  //第三部分:

隐式设置-获取法

  publicfunctionset_d(sss:

Number):

Void{

    d=sss;

  }

  publicfunctionget_d():

Number{

    return(d);

  }

  //第四部分:

私有和公有方法

  privatefunctioninit(){

    //一般写点初始化的内容

  }  

  privatefunctionaa(){    

    

  }

    publicfunctionbb(){    

    

  }

}

  如果是要继承类,比如继承MovieClip类,第一行就改写成

  classTime_controlextendsMovieClip{

  下面简单解释下各个部分(我最不擅长解释说明这类东西)

  CLASS类都是以

  class类名称{

  内容

  }

  的形式,而且类名称和文件名要相同。

 CLASS的内容分四部分

  第一部分

  声明本CLASS所用到的变量,这里要提的是,和在SWF里定义变量不同。

SWF里你可以用比如a=1这种自动变量形式,而在CLASS里你必须写明a的类型是Number,再定义变量值是1

  第二部分

  是CLASS的构造函数,什么意思呢?

就是当CLASS的实例出现后,自动执行这个function里的内容,一般都是些初始化的内容。

function的名称要和CLASS类的名称一样哦~而且这里初始化一般都是用个init()函数,init函数具体在后面回自己定义。

为什么要这样而不直接把初始化内容写在构造函数内呢?

因为当继承其它类的时候,构造函数是不能继承的,还得自己再写一次,而init函数是可以继承的,于是……呵呵,懒人懒办法嘛~直接把内容写在构造函数里的话,每次继承就还要重写次,用自定义init函数的话,就可以偷懒咯~

  第三部分

  是定义隐式设置-获取的function,什么意思呢?

上节我们说过,class可以看作一个封闭的盒子,跟外界无关。

但有时候我们必须读取或者改变CLASS类内的某个变量。

这时候就必须借助隐式设置-获取的function。

只有定义后,外界才能读取和设置CLASS内的变量。

定义的方法就是比普通function多了get/set这个单词。

而且必须要指定返回变量类型,无需返回则用Void表示。

  第四部分

  就是写function咯~这个就不具体说了,function大家老写了

  可能大家看到,class里比平时大家写的,多了private和public,还有static这三个词

  啥意思捏?

  简单简单的说下:

  private与public定义的变量和方法都能在CLASS内一样使用,没啥区别

  而不同的地方就是,public定义的变量和方法能够被外界读取设置和使用,而private则不能,只能在封闭的CLASS内使用。

 比如publicvard:

Number=1设置了变量d是public型的

  然后在第三部分写下:

publicfunctionset_d(sss:

Number):

Void{

    d=sss;

  }

publicfunctionget_d():

Number{

    return(d);

  }

  当CLASS实例化在了一个MC后

  trace(MC._d)就得到1

  输入MC._d=2后,MC内的d就变成2啦~而private设定的变量,你从外部既不能读取也不能赋值。

  自己仔细体会下

  同理,例如:

  publicfunction发绝招{

  }

  就像上几节图里那个封闭盒子上的发绝招按钮,实例化到MC后,就可以直接

  MC.发绝招()

  来让MC执行发绝招()这个function

  而static定义的变量,怎么跟大家描述呢……它不存在于CLASS的实例化里。

  而且static定义的变量,是被所有CLASS实例共享的。

  还是来个例子吧:

  舞台ATTACH个MC,绑定的ccc.as类。

类里有个static变量s=1。

ccc类里初始化函数init()里让s++,这时候s就等于2了是吧?

  然后继续在舞台ATTACH个MC,绑定的ccc.as类,这个MC的s就直接等于2了。

然后它在初始化函数里同样执行了s++,这时候两个MC里的s都同时变成了3

  这就是所有CLASS实例共享static变量。

  怎么说呢,CLASS撰写方面,我自己也不是很行,可能还存在少许的理解误区或者缺少技巧经验。

希望老鸟也指导下。

  关于这节,我建议新鸟鸟们最好自己再找点正规教材自己学习下。

  单靠这节写的些鸟文,小鸟对CLASS还不能很好的认识。

正常。

  所有的知识只有通过实战才能真正的理解。

  在下节里,我会详细的开始教那个接宝游戏怎么做。

具体的代码怎么写。

CLASS怎么写怎么用。

手把手的教鸟们学做这个范例游戏。

Flash游戏开发教程:

第五节

搞了半天的鸟CLASS,我们又回到了做游戏的内容上来。

  咱们学那么多知识,目的也只为了更好的来做游戏。

这个游戏吧,前面也有朋友说到了,根本不用CLASS,做个单个FLA文件F9按了猛打代码,然后MC里点开了东鸟点代码,西鸟点代码,也能完成。

没错,确实这样。

  我自己相当长一段时间内也是不懂CLASS之流,只用一个FLA文件,代码全死敲里面,也做出不少洋洋得意自以为是的小游戏。

  我自己本身就不是科班出身的鸟,当年差了十分没能进计算机系,错过了接受正规编程教育的大好光阴。

(不过事后发现世界是奇妙的,我做过几个单位从事正职编程的都不是计算机系毕业的)

  但当小游戏逐渐变成大游戏后,一个FLA里,root里,MC里代码开始多起来,关系开始复杂起来,于是制作者头也开始大起来,直接影响到睡觉睡不好,饭也吃不好,肠胃不通,消化不良,上班没精神……

  于是,就必须要正规的,能让脑子清醒的,能轻松分辨游戏里各类关系的开发方法。

  再于是,我每天买瓶水,学习了CLASS方面的知识。

(日,学CLASS和买水有啥关系?

  话题扯远了,让我们再次回到接宝上来。

  一楼那个我做的简单范例SWF大家看过了没?

  什么?

没?

  赶快去下了,试着玩玩。

给你5分钟,玩好再继续往下看。

  ……(5分钟的等待)

  好,试玩过了对吧?

  我现在问你,要你分析游戏里的逻辑关系,你怎么分析?

  给你5分钟思考。

  ……(5分钟的等待)

  是不是:

天上不间断掉宝-当地下人物碰到宝,就获得相应的奖励。

时间到就结束游戏。

  是这样的。

  但我思考问题,是按:

  1.游戏时画面上有几大元素?

(MC)

 2.每个MC要实现什么功能?

  从每个MC的角度来思考分析游戏的构成。

  你也要习惯这样,因为我们以后要从MC的角度来编写CLASS,每类MC都会有个对应的CLASS类来告诉这个MC在游戏中该做什么。

  各个MC拼合起来,就成了一个游戏。

  简单游戏和复杂游戏的一个区别,就是游戏里元素多少,元素多了,逻辑复杂,元素少了,逻辑简单。

  好,请鸟鸟们继续思考,接宝游戏里有几大元素(MC)?

它们各自要做点什么?

  给你10分钟……

  ……(10分钟的等待)

  见图:

Flash游戏开发教程:

第五节src="

  公布答案:

  人物

  宝物

  分数(右上角)

  时间(左上角)

  游戏总控制(包括选人、最后最高分显示)

  每类各自要做的事情:

  人物:

  1.能够左右按键移动控制移动

  2.移动范围限定(不能跑出屏幕吧?

  3.按上键技能

  4.一些初始化设定(刚开始出现的坐标,移动速度)

  宝物:

  按随机速度下落,落出屏幕消失

  碰撞检测,是否碰到人物

  碰到人物后产生加分、加时间等不同的效果

  初始化设定(刚开始出现的坐标,移动速度)

  分数:

  1.显示分数

  时间:

  30秒倒计时,显示时间变化

  到了0秒,通知‘游戏控制’执行‘结束游戏’的function

  游戏控制:

  很重要的部分,要控制协调以上几个元素之间的关系,以及游戏的过程。

  集合了很多种function供调用

  以下规整下包含的function

  人物选择:

按照人物选择框的选择,attach人物MC到舞台(人物attach进来后,就会自动按照他自己的CLASS行动啦),同时调用‘掉宝控制’的function开始掉宝以及‘时间控制’里倒计时方法,开始30秒倒计时。

  掉宝控制:

按照随机时间间隔,随机的attach宝物种类到舞台(一样~!

宝物attach进来后,就会自动按照他自己的CLASS行动)

  金币消失:

这个funtion要在时间到0时被调用,作用是让屏幕上的金币原地消失

  游戏结束:

这个function是被‘时间控制’里当时间=0的时候调用的,作用为判断比较当前得分和最高分,显示框出现显示最高分。

  说了那么多,不知道大家思路跟不跟的上

  按我说的仔细思考下吧

  要直到能理解我说的,才能继续看下一小节。

  下一小节开始,我要一个个放出各个CLASS的具体代码了,并进行详解,请时刻关注哦!

  附:

  编写好的CLASS怎么关联到MC?

  就拿上节例子Time_control.as来说吧,要关联到库里的元件'时间'

  老鼠右击元件'时间',然后……

  见图:

Flash游戏开发教程:

第五节src="

  如果是自己拖到舞台上,“第一帧导出”就不选

  如果是attach上舞台,则就要选哦

Flash游戏开发教程:

第六节

 范例接宝游戏中人物类的CLASS讲解

  首先请下载源文件:

CLASS.rar

  下载好,打开一看,如下:

  一个FLA主文件:

  run_game.fla

  三个目录:

  player

  items

  game

  我把.as类文件分门别类的存放,这样看上去清晰,更重要的是别人看了会觉得我很专业。

  目录player里有:

  Player_1.as 

  Player_2.as

  目录items里有:

  Jin.as 

  Bao1.as 

  Bao2.as

  目录game里有:

  Game_control.as

  Score_view.as

  Time_control.as

  .as具体意义看文件名就应该能知道,这里要说的是,一般默认的规则,放CLASS目录用小写字母命名,.as的类文件名的首字母用大写

  这节详细讲下人物类的CLASS,首先是Player_1.as,人物小李的类

  首先去源文件里点进人物1的MC,看下结构。

  由两帧组成,一是“stand”,二是“run”

  人物上面有一层有个圆形的MC,我把它命名为hit,靠这个mc来做碰撞检测。

  金币里面也有这个名叫hit的MC,我判断人物和金币是不是相碰是用这个语句的:

金币MC.hit.hitTest(人物MC.hit)

  传统碰撞检测都这么做。

  又开始扯话题了,马上拉回来

  现在拿出Player_1.as的代码

classplayer.Player_1extendsMovieClip{

  privatevarhit:

MovieClip;//人物MC里出现的东西都要声明,hit这个MC也不例外

  publicvarspeed:

Number;//这个是人物移动的速度

  //构造函数

  functionPlayer_1(){

    init();//初始化的人物打包在init()里了

  }

  //隐式设置-获取法

  publicfunctionset_speed(sss:

Number):

Void{

    speed=sss;

  }//可供外界用MC._speed=X修改speed的数值

  publicfunctionget_speed():

Number{

    return(speed);

  }//可供外界读取speed的数值

  //私-公有方法

  //---初始化方法---

  privatefunctioninit(){

    _y=310;

    _x=300;//人物来到舞台后的初始位置

    speed=6;//移动速度

    onEnterFrame=Move;//人物来到舞台后就开始onEnterFrame,内容见Move这个function

  }

  //---人物移动---

  privatefunctionMove(){

    if(Key.isDown(37)){

      _xscale=-100;

      _x-=speed;

      this.gotoAndStop("run");

    }elseif(Key.isDown(39)){

      _xscale=100;

      _x+=speed;

      this.gotoAndStop("run");

    }else{

      this.gotoAndStop("stand");

    }

    //以上是左右键的定义,应该看得懂吧?

    if(Key.isDown(38)){

      speed=12;

    }else{

      speed=6;

    }

        //以上是上键的定义,按着后速度就加倍咯

    range();//范围定义,内容见下面

  }

  //---限定移动范围---

  privatefunctionrange(){    

    if(_x>540){

      _x=540;

    }

    if(_x<10){

      _x=10;

    }//不让人物出界

  }

}

  这个CLASS文件就是这样。

按照前几节我说的结构,鸟鸟们对照这看下。

能不能看懂。

这里要说的是,第一行的player.Player_1,其中前面的player表示路径“.”就相当于"",player.Player_1就相当于playerPlayer_1,关联到MC的时候也要这么写的。

  小李的CLASS写完了

然后写鸣人的CLASS

Flash游戏开发教程:

第七节

 先补充个游戏里的结构:

  _root下有三个空MC:

pl,item和xs

  pl这个空MC是用来attach人物的

  item这个空MC是用来attach宝物的

  xs这个MC是用来attach显示得分的

  为什么要这么做呢?

……因为管理方便呀~以后你会慢慢体会到的。

  严重警告:

第7课未搞懂看明白者,请回上节反复研究,直至搞懂。

不然继续往下看会让你体内真气逆行,任、督二脉自锁,全身犹如蚂蚁咬,饭吃不下,觉睡不着,放P恶臭,对FLASH丧失学习信心……

  (……)

  好了,能看到这行的,说明你已经是个消化第7节内容的鸟了。

  这一节我也话不多说,直接放代码了。

用你第7节学到的内容自我检验下。

  金币10和50共用的CLASS

classitems.JinextendsMovieClip{

  staticvarbasic_speed:

Number=3;//下落基础速度  

  publicvarscore:

Number=10;  //得分

  publicvarspeed:

Number;  //下落速度

  privatevarhit:

MovieClip;  //声明碰撞检测的MC

  privatevardepth:

Number;  //当宝物被人物获得,显示得分的MC的深度    

  //---构造函数---

  functionJin(){

    init();

  }

  //隐式设置-获取方法

  publicfunctionset_score(kkk:

Number):

Void{

    score=kkk;

  }//得分10还是50,传入这个参数就能解决

  publicfunction_bspeed(){

    basic_speed=3;

    trace(basic_speed)

  }//这个要说明下,静态变量basic_speed每实例化一个MC都会自我增加,所以基础速度越来越快。

这个方法是让basic_speed变回原始的3。

用于每回合开始时初始化使用。

  publicfunctionset_speed(sss:

Number):

Void{

    speed=sss;

  }

  //共有-私有方法  

  privatefunctioninit(){

    _x=50+random(450);

    _y=-15;

    speed=basic_speed+random(50)/10;//下落速度是由基础速度+随机增量

    basic_speed+=0.03

    //trace(basic_speed)

    onEnterFrame=Move;

  }

  privatefunctionMove(){

    _y+=speed;

    if(_y>380){

      this.removeMovieClip();

    }

    ///////////////////////////////// 

    if(hit.hitTest(_root.pl.player.hit)){

      getItem();

    }

    /////////////////////////////////碰撞检测哦~

  }

  publicfunctiongetItem(){

    _root.music_control.snd("jin");//声音控制,以后会讲到

    _root.score+=score;

    depth=_root.xs.getNextHighestDepth();

    vara:

MovieClip=_root.xs.attachMovie("getScore","getScore"+depth,depth++);//ATTACH显示得分的MC

    a.aaa.score="+"+score;

    a._x=_x;

    a._y=_y;

    this.removeMovieClip();

  }

}

 然后是两个宝物的CLASS,继承了金币的类,只不过改写了被人物吃到后的效果

  爱心

classitems.Bao1extendsitems.Jin{

  publicfunctiongetItem(){    

    _root.music_control.snd("bao");

    de

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1