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