手把手教你制作Flash游戏.docx
《手把手教你制作Flash游戏.docx》由会员分享,可在线阅读,更多相关《手把手教你制作Flash游戏.docx(35页珍藏版)》请在冰点文库上搜索。
手把手教你制作Flash游戏
手把手教你制作Flash游戏(火影篇)
最近累,虽然有很多朋友都在等勇者2,但我实在没心情开发。
闲着也是闲着,开一贴给刚刚踏上FLASH游戏开发的爱好者们写点东西。
老鸟就不用看了,呵呵,贻笑大方了。
FLASH游戏这东西吧,总入不了大流。
国内拿FLASH做美术方面的应用比较多,而传统的游戏程序员又把FLASH当小儿科,不屑搞这个,事实上开发FLASH游戏也赚不了钱,七七八八的原因加起来,就变成了没多少职业程序员来开发FLASH游戏,学校也不会培养学生深入学习开发FLASH,搞这块的人少,人少交流讨论的也少,正正规规的教材也少,当然优秀作品更少。
目前国内大部分的FLASH游戏开发爱好者没有好教材的指引,自己摸索着就上路了(NND,我也是这样开始的),开发流程和习惯都是各人一套,很多人因为没有接受正确的学习而走了很多歪路(MD,好像我也是)
于是乎,话题转回来,我就开一贴跟菜鸟们多交流吧……
LESSON1游戏制作前的准备
突然灵光一闪:
老子要做个XX类型游戏!
于是立马打开电脑,打开FLASH,找图片,建元件,F9一按,代码蹭蹭的打啊……结果做了一半做不下去了。
以上情况常常发生……
做游戏首先脑子里先要有整个游戏的规划,最好是拿笔画个流程简图,然后再下手。
游戏流程的规划是很重要的,我在做一个游戏游戏前,草稿纸上来来回回要打个半天的草稿才开工,我一直认为游戏的规划部
分是很难的,如果真等到全部想好了,做起来其实是个很轻松的过程,只是耗时间罢了。
理论知识多说没用……
我们不如来实践下,跟我一起做个简单的游戏吧……
吃金币游戏-策划(我在草稿纸头上写下以下几点)
基本描述:
1.天上掉宝物,地下小人物由自己控制,去接宝得分
2.时间限制30秒
写到这里,顺手画了张草图
画好草图,我继续在草稿纸上又写下详细的几处描述:
1.宝物分四种:
金币10、金币50、增加时间的宝物、瞬间获得屏幕所有金币的宝物
2.要有两个人能选,一个人物太无聊
3.人物样子不能太傻(这条请忽略)
4.最好来点技能~!
(晕--不是说简单游戏么……)
5.要能记录我最高得分,有点挑战性!
6.玩到后面最好难度慢慢增加,就让下落物品速度加快吧!
7.即使小游戏,音乐音效也应该有的
8.(占位中...)
写到这里,我又想了想,又画了张草图
大概想了下这个小游戏的运行过程
鉴于我这个人脑子不好使,我又一样样统计了下一共有多少东西。
见下图:
1.人物
2.宝物
3.时间显示的东西
4.分数显示的东西
5.选择人物还有游戏结束后历史高分的两个提示板
6.背景图片和音乐音效
好了,游戏不管大小,我基本动手干活前这些基本的流程都要走。
为的是明确整个游戏的过程,然后统计下有多少东西要做,然后一样样做呗。
接下来就是搜集要用到的素材。
我找了张背景图,找了两张火影的卡通人物:
鸣人和小李。
接下去就是先把要用到的动画元件做好。
然后就开始考虑程序部分(后面几讲重点)。
P.S.看到这里,有人要骂了,小样是不是发个半吊子帖子来骗分啊?
为了表明我不是骗子--...我今天把这个小东西做了下。
因为纯教学讲解用,所以只简单做了两个人物和几个道具,等大家学完后可自行扩充改写。
(为了写这个帖子我今天特意做的,没功劳也有点苦劳啊~)版主给点分升级啦~很多图我都传不上~
控制,键盘方向左右操作,上键小李长按是加速,鸣人是跳跃。
下节讲讲AS方面的开发布局,待续
我们讨论下AS的问题。
先不急于动手打代码,我们先要想好这代码怎么个写法,怎么个安排。
好,现在小鸟们排好队,一个个来回答,你准备怎么写:
10个小菜鸟9个会回答:
我X你的傻X~!
还能怎么写?
F9按了开始写啊……gotoandplay啊,onrelease啊,if啊……该写啥写啥……
咳咳,事实上,也没错。
游戏也能这么出来。
不过我个人推荐我们该融入点面向对象编程的概念。
啥?
NONONO……我不是要开始讲复杂的东西……
我尽量把话往简单了讲……
我们上讲统计过游戏大致那几个东西是吧?
我们现在就把那几个东西独立开来做。
用你听过的,就是分几个CLASS(类)来做。
比如,人物,我们就搞个人的CLASS,宝物,我们就搞个宝物的CLASS,和传统的F9按开一股脑的打代码不同,CLASS类文件是另外写的.AS文件,然后游戏主的.SWF主文件调用的。
来张图:
每个CLASS都会被绑定在对应的MC上
上节统计过的,游戏一共就那么几个MC,每人把自己对应的小蜜绑好合成一体,在舞台上一合成,就是个完整的能运作的游戏了\
这样的结构有什么好处?
1.清晰,修改起来方便,知道哪的问题上哪个地方改
2.CLASS封装性好,不受其它MC和CLASS的影响
3.因为2的原因,所以适合好几个人一起开发。
比如今天你要去谈恋爱,你就拉了隔壁阿三,告诉他要做个怎么样的CLASS,名称和哪几个变量以及实现的功能,然后阿三做好,你就拿来可以直接用了。
4.把整个游戏一个个零件拆开做,不容易犯错。
5.看上去比较专业,不懂行的一看,NND,搞的跟专业开发人员一样,拉风毙了
在具体讲解CLASS构造前,想花点篇幅帮小鸟们理解下CLASS是什么东东。
还是来举个例子,有一个机械战士的MC,这个MC里有机械战士完整的构造,手脚、身体、武器……
但这个机械战士仍然不能动,因为它只是一具机械,没有大脑程序告诉它该怎么走动,怎么攻击……
而我们做的“机械战士控制.as”的CLASS,绑定在这个战士身上。
这个CLASS可以看作为一个封闭的黑匣子,里面装载了指导机械人行动的程序,包括怎么移动、怎么攻击、怎么做事情A、怎么做事情B。
而这一切都是封闭在黑匣子里的,影响不到外界程序,外接程序也影响不到它。
是个独立的东西。
这个黑匣子可以装载到任何一个机械战士身上,任何一个机械战士躯体的MC一旦绑定上这个CLASS,就能立即行动起来。
而且我们可以给这个CLASS做个外界可以调用的接口。
就像黑匣子上装了个可以给外界摁的按钮,你摁一次它就发一次绝招。
象上一节说的,CLASS模式做游戏可以团队开发。
我可以让别人帮我做CLASS,做好我拿来用。
我不需要知道他代码怎么写的,我只需要知道这个CLASS能让这个机械人按照什么规则行动,有什么按钮可以让我摁。
封装性的好处由此显示出来了。
再闯关游戏里,经常出现比如画面上主角一人对N个敌人的场面。
这些敌人每个都可以绑定同一个CLASS。
就是说写了一个CLASS分别装载到N个实例化的MC中去,而不用每个敌人都各自写一段代码。
可能其中两个敌人的生命和攻击力不同。
这也很简单,在CLASS里做一个接收外部传入生命和攻击力两个参数的功能,在敌人MC绑定CLASS后,再传生命和攻击力两个变量的值到MC里即可。
不过要说明,CLASS并不是只能实例化在MC上,还可以装在例如Object之类的上面。
比如我们很常用的一个FLASH本来就有的CLASS:
SOUND
mySound=newSound()
mySound.attachSound("a.mp3")
mySound.start(0,1)
这里我们就可以看作Sound类实例化了在mySound的上,而attachSound和start都是Sound类的“按钮”,可以让外部操控这个装载了Sound类的mySound。
我们并不知道Sound这个CLASS内部代码是如何的,但我们知道按钮可以用来干什么,用的也不是很爽吗?
前面说了CLASS的基本应用,可能有鸟鸟们要问了,我做个function一样可以用啊,或者在MC里敲代码,跟你写CLASS一样。
那为什么还要写CLASS啊?
那下面我就来写点CLASS的另外个重要的特性-“继承”
先来个小例子:
隔壁阿三写了个类“机器人控制.as”,里面写了若干行的代码,包括“移动、跳跃”两个个功能。
我现在也想写个类“超级流氓机器人.as”,里面包括“移动、跳跃、攻击”三个功能。
和阿三写的类比较起来,“移动、跳跃”两个功能是一样的啦,我想写的类只多了个“攻击”功能~
于是可以偷懒了。
在我写的类“超级流氓机器人.as”第一行加句简单的代码,就可以把阿三写的类完全COPY过来。
(代码语法命令后面的课程会讲的)
然后我的“超级流氓机器人.as”文件里,内容就只有段写“攻击的代码”。
看到这里,鸟鸟们又要问了,为什么不直接ctrl+c然后ctrl+v把阿三写的类复制过来,然后在里面加?
1.别人写的代码,复杂的要死,反正我脑子转不过来,不想去分析别人的东西。
分析别人写的代码,痛苦的来~
2.日后我再要写个“移动、跳跃、翻滚”的代码,我不是还要再ctrl+c然后ctrl+v?
多麻烦!
3.假使我用ctrl+c然后ctrl+v的方法做了,但突然发现“移动”功能里有个错误要改……郁闷吧?
你要一个个.as文件改了。
而如果是继承的方法做的,你只要让阿三把他写的类修改了,你自己写的两个类就一点不需要改动了,因为“移动”部分的功能,是直接继承过来的嘛~
说到这里,顺带再提下,FLASH里我们经常也在用类,只是你感觉不到。
做游戏用到最多,同时也是FLASH里最重要的类,就是~~~~~~~~~“MovieClip类”!
鸟鸟们不知不觉的就一直在用MovieClip类,比如你有没有经常写:
mc.onEnterFrame..
onEnterFrame就是MovieClip类里的一个方法,只要是个MC(自动被绑上了MovieClip类),就都能用onEnterFrame。
现在回到第一节说的那个天上掉宝地下人物接的游戏。
人物有两个:
小李和鸣人
经过分析,这两个人物基本控制部分是一样的,然后就区别在两个人的各自的特殊技能不一样。
于是我们可以这么做:
1.先建个“人物基本控制.as”类
2.建个“小李.as”类,第一行一句代码继承“人物基本控制.as”类,然后在正文内容里写上小李特殊技能
3.建个“鸣人.as”类,第一行一句代码继承“人物基本控制.as”类,然后在正文内容里写上鸣人特殊技能
见图:
大家可以看到,“人物基本控制.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了。
见图:
看了那么多概念,小鸟们要想,咋还不教具体怎么写CLASS呢?
别急啊,下节里会简单的教些的。
其实我对这种死东西教学还是比较头大的,鸟鸟们也可以自己网上搜下具体CLASS撰写格式、规矩和变量、方法类型。
肯定比我教的要详细。
因为我在CLASS方面也只能算只比小鸟略微胖点点的中鸟啊,哈哈
本来不想写这节的,因为这节的内容很多书上或者网上资料都有,而且写的比我要详细正规得多。
但后来想想,还是写吧!
而且后面几节要结合接宝的范例游戏,具体分析它的几个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怎么写怎么用。
手把手的教鸟们学做这个范例游戏。
搞了半天的鸟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分钟的等待)
见图:
公布答案:
1.人物
2.宝物
3.分数(右上角)
4.时间(左上角)
5.游戏总控制(包括选人、最后最高分显示)
每类各自要做的事情:
人物:
1.能够左右按键移动控制移动
2.移动范围限定(不能跑出屏幕吧?
)
3.按上键技能
4.一些初始化设定(刚开始出现的坐标,移动速度)
宝物:
1.按随机速度下落,落出屏幕消失
2.碰撞检测,是否碰到人物
3.碰到人物后产生加分、加时间等不同的效果
4.初始化设定(刚开始出现的坐标,移动速度)
分数:
1.显示分数
时间:
1.30秒倒计时,显示时间变化
2.到了0秒,通知‘游戏控制’执行‘结束游戏’的function
游戏控制:
很重要的部分,要控制协调以上几个元素之间的关系,以及游戏的过程。
集合了很多种function供调用
以下规整下包含的function
1.人物选择:
按照人物选择框的选择,attach人物MC到舞台(人物attach进来后,就会自动按照他自己的CLASS行动啦),同时调用‘掉宝控制’的function开始掉宝以及‘时间控制’里倒计时方法,开始30秒倒计时。
2.掉宝控制:
按照随机时间间隔,随机的attach宝物种类到舞台(一样~!
宝物attach进来后,就会自动按照他自己的CLASS行动)
3.金币消失:
这个funtion要在时间到0时被调用,作用是让屏幕上的金币原地消失
4.游戏结束:
这个function是被‘时间控制’里当时间=0的时候调用的,作用为判断比较当前得分和最高分,显示框出现显示最高分。
说了那么多,不知道大家思路跟不跟的上
按我说的仔细思考下吧
要直到能理解我说的,才能继续看下一小节。
下一小节开始,我要一个个放出各个CLASS的具体代码了,并进行详解,请时刻关注哦!
附:
编写好的CLASS怎么关联到MC?
就拿上节例子Time_control.as来说吧,要关联到库里的元件'时间'
老鼠右击元件'时间',然后……
见图:
如果是自己拖到舞台上,“第一帧导出”就不选
如果是attach上舞台,则就要选哦
范例接宝游戏中人物类的CLASS讲解
首先请下载源文件:
CLASS.rar
下载好,打开一看,如下:
∙一个FLA主文件:
o run_game.fla
∙三个目录:
oplayer
oitems
ogame
我把.as类文件分门别类的存放,这样看上去清晰,更重要的是别人看了会觉得我很专业。
∙目录player里有:
oPlayer_1.as
oPlayer_2.as
∙目录items里有:
oJin.as
oBao1.as
o Bao2.as
∙目录game里有:
oGame_control.as
oScore_view.as
oTime_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;