接宝石在flash中也是比较经典的一种游戏类型,主要运用了鼠标对游戏中对象的控制,hittest测试碰撞,游戏中记时和记分的方法,可以说此游戏中运用的技术在flash游戏制作中很具有代表性,可以说此类技术在游戏制作中的通用性也比较强,学习此游戏的制作方法,可以在其它游戏的制作中起到举一反三的作用。(本例的.swf和.fla文件请点击这里下载)
游戏方法:
此游戏主界面如图1所示:
图1
游戏中玩家主要使用鼠标来控制下面的小人左右移动,以便接到不断落下的宝石。宝石的类型分为三中,接到不同的宝石得分不同,其中接到一个蓝宝石会得5分,接到一个红宝石或者黄宝石会得3分,不过如果游戏中落下的全是宝石游戏也没什么意思了。游戏中还会不断落下黑色的炸弹,如果不小心接到了炸弹,则会从总分中扣除5分,所以在忙于珍贵的宝石的同时,也需要注意不要接到炸弹,不然可就惨了。
游戏有一定的时间限制,游戏剩余时间会显示在右上角,玩家应该在时间限制内尽量多接宝石,以取得高分。
游戏制作思路:
此游戏玩法简单,制作思路也很清晰。总体上可以分为4大部分:
第一部分:游戏中小人的控制,游戏中需要使用鼠标来控制小人左右移动,以便接到宝石,此部分的实现较简单,只需要使用startdrag函数即可以实现。
第二部分:宝石和炸弹的不断下落:游戏中宝石和炸弹需要不断的随机下落,可以运用random和duplicatemovieclip两个常用函数来实现,前一个函数用来产生随机数,随机控制宝石的初始坐标位置,后一个函数用来复制出更多的宝石,两个函数结合在一起,就可以制作出宝石不断随机下落的效果。
第三部分:宝石接到与否的判断,此功能需要使用hittest碰撞测试函数来检测,使用也相对简单。
第四部分:游戏中的记分和记时:此部分需要用到动态文本框的设置,和一些时间函数,关键是时间为零后要立刻结束游戏。
通过上面的制作思路的分析,可以看出如果将此游戏作适当的分解,一步一步来制作,其实并不难,所以一个游戏在制作前进行适当的分析和规划是很重要的。
下面我们就来按照上面规划好的制作思路来具体制作此游戏
游戏制作步骤:
游戏素材的准备:
1. 进一步往下制作前需要准备好游戏中需要的素材,此游戏一共需要五个素材,分别是蓝色宝石,黄色宝石,红色宝石,炸弹和小人,素材的获得有很多方法,可以直接从外部文件中获得,也可以自己动手在flash中绘制,图2所示为本游戏中的宝石和小人:
图2
2. 分别将蓝色宝石,黄色宝石,红色宝石和炸弹制作成相应的graphic组件,然后新建一个movie clip组件,将小人图象拖进去,并重命名为小人。现在游戏中一共有5个组件,分别是graphic组件蓝色宝石,黄色宝石,红色宝石和炸弹以及movie clip组件小人。
游戏中主要组件的制作:
1.记时器的制作:游戏中需要用到一个记时器,用来记录游戏的剩余时间,本游戏时间限制为100秒,并进行倒记时,时间为0后则游戏结束。新建一个movie clip组件,重命名为mtimebar,进入组件的编辑状态后,使用文本工具在编辑区的中心输入”剩余时间”几个字,然后新建一个图层layer2,在文字下面使用文本工具绘制一个文本框,在properties属性面板中设置此文本框的类型为dynamic text动态文本,设置为动态文本框的原因是游戏中此文本框的时间会不断变化,所以需要设置为动态的,然后设置此文本框的变量名为txt,设置变量名的目的是为了使用action控制文本框中的内容,如图3所示:
图3
将图层layer1和layer2都延长到第3桢,然后新建一个图层并重命名为actions,在此图层的第1 关键桢添加如下as:
now = new date();
starttime = now.gettime();
hastime = 100;
txt = hastime;
//第一句创建了一个新的date日期对象now,然后第2句将当前时间赋给变量//starttime,接下来将值100赋给变量hastime,最后一句将变量hastime的值100设//置为文本框的初始值。
此图层的第2 关键桢添加如下as:
now = new date();
temptime = now.gettime();
txt = hastime-int((temptime-starttime)/1000);
if (!txt) {
_root.gotoandstop("end");
this.stop();
}
//第一句创建了一个新的date日期对象now,然后第2句将当前时间赋给变量//temptime,第三句将表达式hastime-int((temptime-starttime)/1000)的值设置给//文本框,temptime-starttime为当前时间与初始时间的差,也就是已经花掉的时间,
//此值再被hastime减去,则为剩余时间。if语句判断文本框中的值是否为零,如果//剩余时间为零,则主场景中会跳到最后一桢并停止,意味着游戏结束。
此图层的第3关键桢添加如下as:
gotoandplay (_currentframe-1);
//如果剩余时间不为零,自然会播放到此桢,但是为了持续记数需要返回到上一桢播放,//所以_currentframe-1达到了此目的
2. 分牌的制作:游戏中需要显示玩家的得分,所以需要一个得分牌。新建一个moview clip组件,重命名为mscorebar,进入组件编辑状态后,按照制作记时器的方法制作一个”得分”的文本和一个动态文本框,同样将此文本框设置个变量名txt,然后新建一个图层,重命名为actions,再此层的第一祯添加如下as:
txt = _root.score;
//将主场景中的变量score的值赋给得分文本框,关于变量score,将在主场景中//进行说明。
3. 宝石变化组件的制作:游戏中掉下的宝石或者炸弹是随机出现的,所以我们这里可以使用一点制作技巧,将所有将要落下的物体放到一个mc里,但是分别放到不同的关键桢中,这样只需要使用as随机调用不同的桢即可实现随机掉下不同的宝石的效果,所以这里新建一个movie clip,重命名为mstonepics,在图层layer1中插入四个连续的关键桢,分别将炸弹,红宝石,黄宝石和蓝宝石放到第1到第4关键桢中。
4. 随即下落宝石mc的制作:游戏中宝石需要随机下落,所以这里专门制作一个movie clip来进行宝石随机下落的控制,新建一个movie clip组件,重命名为mfallingstone,进入组件的编辑状态后,将图层layer1重命名为stonepics,并将此图层延长到第三桢,然后将组件mstonepics拖到此层,并在proiperties属性面板中将其命名为stone,如图4所示:
图4
再新建一个图层,重命名为actions,在此图层的第一关键桢添加如下as:
var plusscore;
//定义变量plusscore,用来代表不同宝石所有的不同分数
i = math.random();
//使用random随机函数产生随机值在0到1范围内的值,并赋给变量i
if (i<0.5)
//如果产生的随机数小于0.5,则执行下面的代码
{
stone.gotoandstop(1);
plusscore = -5;
}
// 组件stone将停止在第一桢,也即放置炸弹的那一桢,并且将-5赋给代表加分的变//量plusscore
else if (i<0.7)
//如果产生的随机数大于0.5而小于0.7,则执行下面的代码
{
stone.gotoandstop(2);
plusscore = 2;
}
// 组件stone将停止在第2桢,也即放置红宝石的那一桢,并且将2赋给代表加分的//变量plusscore
else if (i<0.9)
//如果产生的随机数大于0.7而小于0.9,则执行下面的代码
{
stone.gotoandstop(3);
plusscore = 2;
}
// 组件stone将停止在第3桢,也即放置黄宝石的那一桢,并且将2赋给代表加分的//变量plusscore
else
//如果产生的随机数大于0.9而小于1,则执行下面的代码
{
stone.gotoandstop(4);
plusscore = 5;
}
// 组件stone将停止在第4桢,也即放置蓝色宝石的那一桢,并且将5赋给代表加分//的变量plusscore
this._x = random(560)+20;
this._y = -10;
//设置不同宝石的随机坐标,横坐标的范围为20到580之间,纵坐标统一为-10
speed = 10+random(20);
//变量speed为下落速度,范围为10到30之间
在此图层的第2关键桢添加如下as:
this._y += speed;
//设置宝石的新坐标为原坐标加下落速度
if (this._y>420)
{
this.removemovieclip();
}
//如果宝石的纵坐标超过420,也即到达舞台的最下面,说明没有被接到,所以使用//removemovieclip()删除此mc,也即没有被接到的宝石从游戏中消失
else if (this._y<=320 && this._y+speed>=320)
{
disx = math.abs(this._x-_root.man._x);
if (disx<30)
{
_root.score += plusscore;
this.removemovieclip();
}
}
//如果宝石的纵坐标不到320,但是再下落一个speed值便超过320,说明宝石已经被//接住了,所以得分增加,然后删除宝石
在此图层的第3关键桢添加如下as:
gotoandplay (_currentframe-1);
//重复播放上一桢
布置主场景:
最后的步骤就是步骤主场景了,制作好上面的所有组件以后,返回到主场景中。
1. 首先将默认图层layer1重命名为bg,然后延长到第5桢,此图层用来设置背景,使用矩形工具画一个和舞台一样大小的矩形,并填充上适当的颜色,如图5所示:
图5
2. 新建立一个图层命名为buttons_man,用来放置游戏中需要用到的一些控制按钮,首先制作一个控制开始游戏的按钮放置在第1桢,给按钮添加as:
on (release) {
gotoandplay(2);
}
然后在此桢加上游戏的开始画面,如图6所示:
图6
在第2关键桢将组件小人拖到舞台的下方,并在属性面板中给组件设置实例名为man,如图7所示:
图7
在第5桢插入一个关键桢,添加一个时间到达的提示按钮,给按钮添加如下as,以便控制游戏的重新开始:
on (release) {
gotoandstop(1);
}
//返回第一桢的游戏开始界面,重新开始游戏
3. 新建一个图层命名为bar,用来放置积分牌和记时器,因为主场景的第一桢为游戏开始界面,所以需要将第一关键桢删除,将组件mscorebar和mtimebar拖动到第2关键祯,如图8所示:
图8
4. 最后再次新建一个图层重命名为actions,用来放置一些控制用的action,在第一桢添加as: stop();,以使游戏一开始停止在第一桢的开始界面,在第2桢添加as:
startdrag("man",true,20,320,580,320);
//对小人进行拖动,切设置好了拖动的范围,以使小人只可以在水平方向上移动,//而不可以在垂直方向上移动。
mcdepth=0;
score=0;
//定义两个变量值,其中score为游戏的得分
在第3桢添加as:
if (math.random()<0.2) {
_root.attachmovie("fallingstone", "s"+mcdepth, mcdepth);
mcdepth++;
}
在第4桢添加as:
gotoandplay (_currentframe-1);
//返回上一桢继续播放
给第5桢设置桢标签end,如图9所示:
图9
5. 最后主场景中时间线如图10所示:
图10
到此为止,接宝石这个游戏就制作完成了,制作过程其实很简单,关键是制作前的规划和制作思路的总体设计,这样制作起来就有一定的针对性,可以做到有的放矢
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器