Flash小游戏项目
任务书
北方工业大学信息工程学院计算机科学与技术系
20##年 04月 10日
一. 课程目的
1.通过理论课学习和上机操作,使同学们掌握Flash软件的基础知识。
2. 掌握Flash的启动与退出、Flash文档的新建和保存、Flash的工具认识和Flash的舞台设置等知识。
3. 能够利用Flash绘制图形、填充图形和编辑图形。
4. 了解在Flash中的素材、元件及“库”面板的使用,包括导入各种类型的素材、创建3种不同的元件、转换元件类型和“库”面板的使用等知识.
5. 掌握Flash动画的制作,包括帧的使用、图层的创建、简单动画(逐帧动画、补间动画)的制作、特殊动画(引导动画、遮罩动画)的制作等内容.
6. 能够为动画添加声音,包括为帧和按钮添加声音、输出声音和设置声音等内容.
7. 掌握为动画添加Actions语句,包括添加Actions语句的方法、Actions语句的语法规则及内涵、控制动画播放Actions语句和对Flash组件的使用等内容。
二. 课程内容
1. 学习和掌握绘图与编辑工具 使用;
2. 学习和掌握文本、辅助工具和色彩使用;
3. 学习和掌握资源和资源管理;
4. 基本动画制作
5. 图层动画制作
6. 编辑应用音频资源
7. 系统配置与动画测试
8. 动作脚本应用基础
9. 交互式动画
10. 组件与行为
11. 作品的导出与发布
三. 课程设计报告内容要求
1.系统目的
2.系统总体设计及使用技术
3.系统主要功能
4.系统主要界面及介绍
5.系统难点
6.课程设计的总结
四. 课程具体要求
使用Flash结合AS制作出2款小游戏,并上传到指定Web服务器上测试。
注:AS是指Action Script
1 运行环境
操作系统: Windows
Web服务器: IIS
开发工具: Flash CS3
2 功能描述
整个游戏的场景不得少于2个。
2.1 基本功能描述
l 元件绘制:游戏使用的所有道具都需要自己绘制。
l 代码编写:代码可以使用老师提供的范例、但是必须结合自己的游戏进行优化。
扩展功能描述
l 多玩家:在同一台机器时间2个玩家对战游戏。
l 人机对站:实现玩家和电脑的对战。
l 网络对站:玩家通过网络实现对战操作。
工程进度表:
3 编程要求
在项目开发过程中必须严格遵守下列要求:(示例见附录)
1) 所有元件必须使用添加到元件库的方式;
2) 所有元件必须放置在独立的层内;
3) 元件不能使用示例中的;
4) CS代码必须进行完成,修改成满足自己具体的应用;
五. 附例
使用Flash 8制作拼图小游戏
说明:此例主要Flash 8的复制到网格和hitTest()函数等命令的使用,对两者的结合制作出拼图小游戏的过程进行了详细的说明。
图1 完成效果图
拼图游戏是一种古老的游戏,相信大家都玩过拼图游戏,今天我就将拼图游戏的一种制作方法教给大家。完成效果如图1。
游戏规则:当在某个小图片上按下鼠标左键不松开鼠标进行拖动时,该小图片跟随鼠标移动,当松开鼠标时,如果是小图片的最后正确位置,该小图片就停留在正确位置,否则回到原来的位置。
制作步骤:
1. 使用Photoshop进行图片处理
1) 打开Adobe Photoshop CS;
2) 使用“文件”菜单的“打开…”命令打开准备好的图片“未标题-1.jpg”,如图2。
3) 使用“视图”菜单的“显示”的“网格”命令,显示出网格。
4) 使用切片工具将图像等分为36份。(每份3×3小格)
5) 使用“文件”菜单的“存储为Web所用格式…”命令,单击“存储”按钮后,选择保存位置(本例选择“桌面”)和名称(本例为“未标题-1.html”)后,保存即可。
6) 关闭Adobe Photoshop CS。
2. 使用Flash 8制作拼图游戏
1) 打开Flash 8,新建一个“Flash 文档”。
2) 设置文档大小为640×480像素。
3) 使用“文件”菜单的“导入”下的“导入到库”命令,将桌面上的“images”文件夹中所有图片导入到库中。
4) 从库中将“未标题-1.gif”拖入舞台中,按F8键将它转换为元件,名称为tu1,类型为影片剪辑,确定。
5) 重复上一步操作,把“未标题-2.gif”转换为tu2,“未标题-3.gif”转换为tu3,……,“未标题-36.gif”转换为tu36。
6) 将舞台中的36个影片剪辑打乱次序后进行排列。
6)方法:先将每行的左面一个和右边一个放好位置,再选中这一行的几个,使用对齐面板中的“垂直中齐”和“水平平均间隔”进行排列。之后再对每列的几个影片剪辑,使用对齐面板中的“水平中齐”和“垂直平均间隔”进行排列,如图3。
图3
7) 将图层1命名为“图形”,并锁定。
8) 在库面板中,右击tu1,选择“直接复制”,在弹出的“直接复制元件”对话框中,名称为bt,类型为按钮,确定。这时就有一个按钮元件bt。
9) 双击bt按钮图标,进行按钮的编辑:将弹起帧的内容全选后,使用“修改”菜单的“分离”命令(或按Ctrl+B)把图像打散,使用墨水瓶工具给它添加黑色边框。在点击帧插入关键帧。在弹起帧将填充删除,只留边框。
10) 返回场景1。新建一图层,将该图层拖到“图形”层的下面。
11) 将按钮bt拖入舞台中,选择该按钮,执行“插入”菜单的“时间轴特效”的“帮助”下的“复制到网格”命令,在网格尺寸的行数和列数中填入6,在网格间距的行数和列数中都填入0像素数。单击确定按钮。
12) 出现一个“复制到网格”的影片剪辑,将其分离(Ctrl +B),在属性面板,将分离后的元件的实例类型(默认的是图形)都转换为“按钮”。并按先行后列的顺序起名bt1,……,bt36。位置如下图。将该层命名为“按钮”并锁定。
13) 新建一图层,命名为“参考图”,将该图层拖到“按钮” 层的下面。
14) 将“未标题-1.jpg”文件导入库, 将之拖入“参考图”层,转换为元件,位置和按钮层的按钮相同,在属性面板,设置其颜色:Alpha,15%。
15) 使用文本工具,在图片的上方空白处输入文字“拼图游戏”:隶书、60、粗体、颜色#996600;在滤镜面板,添加“投影”效果,阴影颜色#999966。锁定该层。
16) 将“图形”层解锁,选中影片剪辑tu1,打开动作面板,输入代码:
onClipEvent (mouseDown) { //当按下鼠标左键时
if(this.hitTest(_root._xmouse,_root._ymouse,false))
//判断鼠标指针在该对象上
{ this.startDrag(true); //进行鼠标跟踪
x=this._x; //用x存储原来的水平坐标
y=this._y; } //用y存储原来的垂直坐标
onClipEvent (mouseUp) { //当按下鼠标左键时
if (this.hitTest (_root.bt1)) //判断该对象和按钮bt1有重叠,停留在正确位置
{ this._x=_root.bt1._x; //使该对象的水平坐标和按钮bt1的水平坐标相同
this._y=_root.bt1._y; } //使该对象的垂直坐标和按钮bt1的垂直坐标相同
else //否则返回原来位置
{ this._x=x;
this._y=y; }
stopDrag();
} //_root.bt1可用this._parent.bt1代替。
17) 将以上代码全选后复制,返回场景,再选择tu2,打开 动作面板,进行粘贴,只用将bt1全部改为bt2即可。
方法:可在动作面板中单击查找和替换按钮,在弹出的“查找和 替换”对话框中,查找内容:1,替换为:2,单击“全部替换”按钮。
18) 类似进行上步操作,为其它的影片剪辑都添加动作代码。
19) 使用“控制”菜单的“测试影片”(或按Ctrl+Enter),观看效果。
20) 使用“文件”菜单的“导出”的“导出影片”(或按Ctrl+Shift+Alt+s),输入文件名“拼图游戏”,保存。
21) 可使用“文件”菜单的“发布设置..”命令进行发布设置后发布。也可使用“文件”菜单的“发布”命令(Shift+F12)直接发布。
第二篇:Flash小游戏开发
LESSON 6 范例接宝游MC戏详细分析
搞了半天的鸟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上舞台,则就要选哦~!
LESSON 7 范例接宝游戏中人物类的CLASS讲解
一般兄弟叫我小周
我的游戏玩家称呼我周哥
同事称呼我周大师
象我讨教问题的喜欢称呼我周老师
虽然我身为一名正职的FLASH设计师,大家也是可以可以称呼我为周老师的。因为一年前我作为未婚妻大人的御用陪读,不经意间居然也通过BT的几门考试得到了《上海市教师资格
证》??(虽然我不知道我要这张证有什么用)??
那个??话题又乱扯了(不过也证明了我思维活跃嘛~如果你的思维有我一半的扯,日后你
可以去考个证当老师了,纵使比现在的计算机老师水平高些,但也足以误人子弟)
回到本节主题上来,我们来学习范例游戏的具体代码。
首先请下载源文件:
/temp/CLASS范例.rar
(斑竹看到帮忙传下,1.8M的附件我没权限传到坛子上)
下载好,打开一看,如下
一个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的代码
复制内容到剪贴板
class player.Player_1 extends MovieClip {
private var hit:MovieClip; //人物MC里出现的东西都要声明,hit这个MC
也不例外
public var speed:Number;//这个是人物移动的速度
//构造函数
function Player_1() {
init();//初始化的人物打包在init()里了
}
//隐式设置-获取法
public function set _speed(sss:Number):Void {
speed = sss;
}//可供外界用MC._speed=X修改speed的数值
public function get _speed():Number {
return (speed);
}//可供外界读取speed的数值
//私-公有方法
//---初始化方法---
private function init() {
_y = 310;
_x = 300;//人物来到舞台后的初始位置
speed = 6;//移动速度
onEnterFrame = Move;//人物来到舞台后就开始onEnterFrame,内容见
Move这个function
}
//---人物移动---
private function Move() {
if (Key.isDown(37)) {
_xscale = -100;
_x -= speed;
this.gotoAndStop("run");
} else if (Key.isDown(39)) {
_xscale = 100;
_x += speed;
this.gotoAndStop("run");
} else {
this.gotoAndStop("stand");
}
//以上是左右键的定义,应该看得懂吧?
if (Key.isDown(38)) {
speed = 12;
} else {
speed = 6;
}
//以上是上键的定义,按着后速度就加倍咯
range();//范围定义,内容见下面
}
//---限定移动范围---
private function range() {
if (_x>540) {
_x = 540;
}
if (_x<10) {
_x = 10;
}//不让人物出界
}
}
这个CLASS文件就是这样。按照前几节我说的结构,鸟鸟们对照这看下。能不能看懂。 这里要说的是,第一行的player.Player_1,其中前面的player表示路径“.”就相当于"\"
player.Player_1就相当于player\Player_1
关联到MC的时候也要这么写的。
小李的CLASS写完了
然后写鸣人的CLASS
记得前几节我说的“继承”这个概念么?
快去翻出来看看。
鸣人和小李就是上键技能不同,所以继承过来后,正文把按键控制重写一次就行了,其它就
全继承小李的类了
代码如下
复制内容到剪贴板
class player.Player_2 extends player.Player_1 {
//继承了player.Player_1类,所以只需要把两者间唯一不同的Move函数重写次
就可以啦~当然构造函数还是要的
function Player_2() {
init();
}
//人物2的Move函数
private function Move() {
if (Key.isDown(37)) {
_xscale = -100;
_x -= speed;
if (_currentframe != 3) {
gotoAndStop("run");
}//这句自己体会下,不加的话,按上键后鸣人就一直不停的在跳跃了
} else if (Key.isDown(39)) {
_xscale = 100;
_x += speed;
if (_currentframe != 3) {
gotoAndStop("run");
}
} else {
if (_currentframe != 3) {
gotoAndStop("stand");
}
}
//
if (Key.isDown(38)) {
gotoAndStop("jump");
}
range();
}
}
好了,人物类就写完了。
消化下。后面的宝物类大同小异,下一节再写。
LESSON 8 范例接宝游戏中宝物类的CLASS讲解
先补充个游戏里的结构:
_root下有三个空MC: pl,item和xs
pl这个空MC是用来attach人物的
item这个空MC是用来attach宝物的
xs这个MC是用来attach显示得分的
为什么要这么做呢???因为管理方便呀~以后你会慢慢体会到的。
严重警告:第7课未搞懂看明白者,请回上节反复研究,直至搞懂。不然继续往下看会让你体内真气逆行,任、督二脉自锁,全身犹如蚂蚁咬,饭吃不下,觉睡不着,放P恶臭,对
FLASH丧失学习信心??
(??)
好了,能看到这行的,说明你已经是个消化第7节内容的鸟了。
这一节我也话不多说,直接放代码了。用你第7节学到的内容自我检验下。
金币10和50共用的CLASS
复制内容到剪贴板
class items.Jin extends MovieClip {
static var basic_speed:Number = 3; //下落基础速度
public var score:Number = 10; //得分
public var speed:Number; //下落速度
private var hit:MovieClip; //声明碰撞检测的MC
private var depth:Number; //当宝物被人物获得,显示得分的MC的深
度
//---构造函数---
function Jin() {
init();
}
//隐式设置-获取方法
public function set _score(kkk:Number):Void {
score = kkk;
}//得分10还是50,传入这个参数就能解决
public function _bspeed(){
basic_speed= 3;
trace(basic_speed)
}//这个要说明下,静态变量basic_speed每实例化一个MC都会自我增加,所以基础速度越来越快。这个方法是让basic_speed变回原始的3。用于每回合开始时初始化使
用。
public function set _speed(sss:Number):Void {
speed = sss;
}
//共有-私有方法
private function init() {
_x = 50+random(450);
_y = -15;
speed = basic_speed+random(50)/10;//下落速度是由基础速度+随机增
量
basic_speed+=0.03
//trace(basic_speed)
onEnterFrame = Move;
}
private function Move() {
_y += speed;
if (_y>380) {
this.removeMovieClip();
}
/////////////////////////////////
if (hit.hitTest(_root.pl.player.hit)) {
getItem();
}
///////////////////////////////// 碰撞检测哦~
}
public function getItem() {
_root.music_control.snd("jin");//声音控制,以后会讲到
_root.score += score;
depth = _root.xs.getNextHighestDepth();
var a:MovieClip = _root.xs.attachMovie("getScore",
"getScore"+depth, depth++);//ATTACH显示得分的MC
a.aaa.score = "+"+score;
a._x = _x;
a._y = _y;
this.removeMovieClip();
}
}
然后是两个宝物的CLASS,继承了金币的类,只不过改写了被人物吃到后的效果
爱心
复制内容到剪贴板
class items.Bao1 extends items.Jin {
public function getItem() {
_root.music_control.snd("bao"); depth = _root.xs.getNextHighestDepth();
var a:MovieClip = _root.xs.attachMovie("getScore",
"getScore"+depth, depth++);
a.aaa.score = "TIME";
a._x = _x;
a._y = _y;
////////
_root.time_c._time += 8;
///////
调时间控制类的public方法,后面会讲到
this.removeMovieClip();
}
}
五角星
复制内容到剪贴板
class items.Bao2 extends items.Jin {
public var score:Number = 30;
public function getItem() {
//_root.score+=score
_root.music_control.snd("bao");
///////
for (var i in _root.item) {
if (_root.item[i]._name.substr(0, 3) != "bao") {
_root.item[i].getItem();
}
}
_root.score += score;
depth = _root.xs.getNextHighestDepth();
var a:MovieClip = _root.xs.attachMovie("getScore",
"getScore"+depth, depth++);
a.aaa.score = "+"+score;
a._x = _x;
a._y = _y;
///////
this.removeMovieClip();
}
}
宝物这类,和人物类有点相似的。
下节会把时间控制类和分数控制类一起讲掉。大家快把这节的内容消化了吧~
LESSON 9 范例接宝游戏中得分显示类和时间控制类的CLASS讲解
事实上这两部分比较简单
所以并在一起讲解了
讲解前先点开FLA文件,把这两个MC看看,对MC构造了解了,才能写CLASS嘛~
看下得分显示类的代码
复制内容到剪贴板
class game.Score_view extends MovieClip {
private var w1:MovieClip;
private var w2:MovieClip;
private var w3:MovieClip;
private var w4:MovieClip;
private var w5:MovieClip;
private var w6:MovieClip;
private var i:Number
//构造函数
function Score_view() {
init();
}
//公-私有方法
public function init() {
onEnterFrame = Control;
}
private function Control() {
for (i=1; i<=6; i++) {
if (i<=int(String(_root.score).length)) {
this["w"+i].gotoAndStop(int(String(_root.score).s
ubstr(i*(-1), 1))+1);
} else {
this["w"+i].gotoAndStop(1);
}
}
}
}
原理很简单,就是让这个MC一直onEnterFrame着,按照总得分来不断操控MC里的6个数
字MC变化
仔细思考下Control()里的代码,想通了其实很简单哦~~
不多说了,懂了后就跟我看时间控制类的(不懂就继续看,直到看懂为止)
下面是时间控制类
复制内容到剪贴板
class game.Time_control extends MovieClip{
private var t:Number
public var time:Number
//------------------------------------------
/*
function Time_control(){
init()
}
*/这段被注销掉了,因为我不要它一出现在舞台就开始倒计时。什么时候倒计时,游
戏控制类会给本类发出命令(调用本类中的Go()的function)
//-------------------------------------------
public function set _time(ttt:Number):Void{
time=ttt
}
public function get _time():Number{
return(time)
}
//===========================================
private function TimeGo(){
t++
if(t%30==0) time--
if(time==0) {
delete onEnterFrame
_root.game_c.endGame()
}
}//倒计时代码,当时间=0,通知游戏控制类作出endGame()的行为。
public function Go(){
t=1
time=30
onEnterFrame=TimeGo
}//初始化,并开始倒计时
}
有了前两节的基础,这节显的很简单??(感觉好像应该先教这节啊??- -??是不是难度顺序颠倒了??)
下节会讲最后的,也是很重要的类-游戏控制类,尽请期待~!
LESSON 10 范例接宝游戏中游戏控制类的CLASS讲解
终于讲到这节了,累死,也饿死,为了明年年初要拍婚纱,我每天中午就吃个苹果减肥,然
后靠苹果的能量再给鸟鸟们写教程??
今天算是暴走式的更新速度了,从第7节写到了第10节,胃软导致了手软,手软导致了脚
软,较软导致了XX也软??
版主看到,体恤下吧,加点分,我好早日升中级会员??(咳咳)
本节讲的是最后一个类:游戏控制类
我自己每个游戏都会在舞台上有这个MC帮我看场子,指挥调度手下的兄弟,提供各类凶器,
把握整个进程??
这个游戏的游戏控制类:Game_control.as
先点开FLA里的MC,看看它的构造。
有两个框,一个是选择人物的,一个是显示最高得分的。
我用它们两的visible属性控制它们可见和不可见。
Game_control.as把握着整个游戏的进程,提供了一些方法。
先看它怎么控制游戏的:
1.先初始化游戏参数,然后让选人框可见,让玩家选人。
2.玩家选好人,它就把人物attach到舞台上,同时通知‘时间控制类’这个小弟你可以30
秒倒计时了,又同时开始在天上撒金币和宝物。
3.‘时间控制类’小弟一看时间到0了,马上又来通知大哥,时间到0了
4.大哥收到风声后,停止撒金币,让画面上已有的金币宝物全部消失,同时一番比较后显示
出你的历史最高分,同时提供你个重新游戏的按钮
5.按重新游戏,大哥就回到第1步??
(好像所有小弟里,只有分数显示自管自工作,没有被大哥叫到)
它包含了一些方法,供小弟和自己用:
1.初始化数据:init()
2.根据玩家选择,在舞台上attach人物:chose(n:Number)
3.天上播撒金币和宝物:onGame()
4.屏幕上宝物消失:jin_disappear()
5.结束游戏,比较得分和最高分,让显示框显示最高分:endGame()
对照着我们来看下代码
复制内容到剪贴板
class game.Game_control extends MovieClip {
private var t:Number = 1;
private var game_begin:MovieClip
private var game_end:MovieClip
private var depth:Number
private var topScore:Number=0
public var time:Number;
//构造函数
function Game_control() {
init();
}
//隐式设置方法
public function set _time(ttt:Number):Void {
}
//公-私有方法
public function init() {
time=35
_root.score = 0;
_root.createEmptyMovieClip("pl", 3);
_root.createEmptyMovieClip("item", 2);
_root.createEmptyMovieClip("xs", 1);
//初始化里建立空MC,同时也就是把以前的MC删除覆盖
game_begin._visible=true
game_end._visible=false
_root.music_control.bg(1)
}
public function chose(n:Number) {
game_begin._visible=false
_root.pl.attachMovie("ren"+n, "player", 1);
_root.time_c.Go()//时间控制小弟~号开始倒计时啦~
_root.music_control.bg(2)
onEnterFrame = onGame;
}
private function onGame() {
t++;
if (t%time == 0) {
depth=_root.item.getNextHighestDepth()
if (random(8) == 0) {
var
a:MovieClip=_root.item.attachMovie("bao"+(1+random(2)),
"bao"+depth, depth++);
}
else if (random(5) == 0) {
var a:MovieClip=_root.item.attachMovie("jin2",
"jin"+depth, depth++);
a.score=50
} else {
_root.item.attachMovie("jin1", "jin"+depth,
depth++);
}
time = 20+random(30);
}//这段自己仔细看下,就明白怎么随机时间间隔里播撒出随即类型的宝物了
}
private function jin_disappear() {
for(var i:String in _root.item){
_root.item[i]._speed=0
_root.item[i]._bspeed()//这个方法Jin.as里写过的,还记得吗?
哈哈
_root.item[i]._alpha-=5
_root.item[i]._xscale+=2
_root.item[i]._yscale+=2
if(_root.item[i]._alpha<0) {
_root.item[i].removeMovieClip()
delete onEnterFrame
}
}//大小和alpha同时变化直到宝物消失~
}
public function endGame(){
onEnterFrame=jin_disappear
game_end._visible=true
if(_root.score>topScore) {
topScore=_root.score
game_end.sc=topScore
}//判断和记录历时最高分,同时显示最高分框显示~
}
}
事实上在人物选择框,两个人物是按钮,用来调用‘游戏控制’类里的chose(n:Number)方法。
当chose(n:Number)被调用时,后面一连串的进程就都自动展开了??
今天一下子讲的太多了,能消化掉吗?
游戏主体也就这样了。剩下点小东西,比如声音控制,下节课讲。
LESSON 11 声音控制&我对FLASH创作游戏的看法
【响应正版号召,再次宣传】
本文作者:周云(老鸟可以直接叫小弟我小周,粉丝必须称呼周哥,讨教的嫩鸟就叫声周老
师吧,满足下我的欲望,啊哈哈哈~)
联系方式:danyun1982@163.com
首发于蓝色经典论坛
欢迎转载呀~(不欢迎又咋样??要转照样转??)
转载必须保留我的作者名称和联系方法,不然转载者生个儿子+String(a)
c=["gu","yan"]
b=["长不高","没P"+c[random(c.length)],"是女孩"]
a=b[random(b.length)]+"呀~!"
我喝了半瓶子水~幻想自己刚吃了个鸡腿~死撑着把这最后节不缩水的写完~
让我们来看看声音控制部分吧~
声音控制,我个人不习惯用类来控制。
我一直是在游戏第一帧先用Sound类把库里的声音关联起来
然后做个Object,在里面定义function来控制声音的
当然你也可以写个类来控制,这随你的,用痰盂还是马桶,我们谁也不能强求谁,对吧?
把第一帧的声音控制代码拿出来~~~
复制内容到剪贴板
/////////---声音控制---/////////////
music_bg1 = new Sound();
music_bg1.attachSound("bg1");
music_bg2 = new Sound();
music_bg2.attachSound("bg2");
music_bg_jin = new Sound();
music_bg_jin.attachSound("bg_jin");
music_bg_bao = new Sound();
music_bg_bao.attachSound("bg_bao");
//库里的声音文件都关联起来~
music_control = new Object();
music_control.bg = function(n) {
for (i=1; i<=2; i++) {
_root["music_bg"+i].stop();
}
_root["music_bg"+n].start(0, 999);
};
music_control.snd = function(n) {
_root["music_bg_"+n].start(0, 1);
};
//music_control这个Ob里定义了bg()和snd两个方法,bg用来放长段背景音乐,
snd用来放音效
_root.music_control.bg(1)
//看,就是这么用的
现在前面几节那些CLASS里写到的声音调用语句知道是怎么回事了吧?
----------------------饥肠辘辘的分割线------------------------
游戏开发基础的课程,至此已经全部写完了。
范例游戏有很多地方可以扩充,比如加点掉宝种类,再加几个人物和技能,玩到一半掉下只猪??等等等等
我只是抛砖引玉下而已~
要玩我做的游戏?等我找找??随便先找个
/games_786.html
如果喜欢,我可以再开贴教这类STG射击型的,或者动作闯关型的,或者FMS联机型的,或者XX型的,或者YY型的都可以??
关于做游戏,事实上正规的团队应该有三种人:
1.策划
2.美工
3.程序员
但实际上,FLASH这种东西,相比其它,真的属于不赚钱的。所以搞的专业人士不多。 大多数情况下,都是闪客单干。
所以很多时候开发都不正规,比如代码不注释~在一个FLA里,帧里,隐蔽的很多MC的小边小角里,敲了很多代码,如果有人接手,必然会分析到晕倒??
这种不正规,在长时间单干下,是不会被意识到并且改正的。但如果参加过团队制作,就会立即意识到这个问题。
一个好程序员,或者懂的很多的牛人,并不会必定是个好的游戏开发者
我自己见过好几个自己认为技术很牛的人,他们并不做游戏,或者游戏做出来并不受欢迎 他们自己分析原因是没好美工,导致画面粗糙,不吸引人
而我则认为更主要的原因是缺少好的游戏策划
在我心里,游戏受欢迎程度取决的因素:策划>程序>美工
就比如细节方面,好的策划知道怎么样的设定更体贴玩家,知道什么元素能抓牢玩家,什么能激起玩家欲望,什么能让玩家HIGH
老实说,这比懂CLASS重要得多了
如果你跟我一样是一名独立创作FLASH游戏的制作者,那你先要成为一名很好的游戏玩家。 要能从玩家的角度来设计制作游戏。
当然,策划游戏,是需要天赋的。
我们不能要求每个人样样都完美,毕竟每个人都有自己擅长的和不擅长的。
继续努力吧。
最后一句,如果以后来上海想请我吃饭我一定会带上老婆给你DOUBLE面子的??