Flash游戏开发实例系列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Flash游戏开发实例系列:打小狗
在Flash游戏中,打小狗<老鼠等)游戏是比较基础的游戏了。
如果对Flash游戏设计有兴趣的朋友,想学习如何用Flash来制作游戏的朋友,可要好好学习这个游戏的制作哦。
因为该游戏中使用的都是一些比较基础的、基本的和常用的ActionScript脚本语言。
另外,我们也可以从中学到Flash游戏策划、设计到制作完成的一些概念、方法和技巧等知识。
游戏原理:首先,游戏通过startdrag(>、Mouse.hide(>来改变隐藏原来的鼠标,把原先的鼠标换成菜刀,这样砍起来才过瘾嘛:)。
使用Math.ramdon(>并配合遮罩技术使小狗能随机得出现在洞口。
最后的总分会在一个输入文本框中显示出来,见图1所示。
游戏玩法:
游戏的玩法很简单,相信大部分读者都应该知道。
就是先移动鼠标到小狗的头上,然后安下鼠标左键,击中小狗就得分,否则得分为0。
玩这个游戏的意义就在于,看谁能在一定的时间限制内,得到最多的分数,以测验谁头脑反应的最块,谁操作鼠标最灵活。
游戏定义:
在设计游戏前,总需要考虑这样几个问题,游戏环境的形成、规则的创建以及如何编写游戏的代码。
但幸运的的是,这个打小狗<老鼠等)的游戏定义起来并不复杂。
1.游戏环境。
首先要考虑的是游戏在怎样的一个环境中进行。
这是实现一个简单的顺序游戏最关键的部分。
该游戏中,通过随机的方法来让小狗出现,这一点确保了游戏的可玩性。
对游戏而言,可玩性是很重要的,没有可玩性的游戏是不会有玩家去玩第二次的。
2.控制方法。
玩家如何控制游戏中的角色,操作是否方便有决定了游戏的可玩性。
我们可以设定许多行为方法来控制游戏主角的运动。
在该游戏中,主要是让玩家能够自由的控制鼠标。
3.游戏结束。
游戏中最困难的事情之一就是判定游戏是否结束。
当游戏运行一段时间后,游戏将会停止,并在动态文本中显示出玩家的最后得分。
游戏制作:
打开Flash MX,设置场景大小为400px×360px,背景色为#006699,帧频为15fps。
在游戏制作之前,为了让大家有一个整体的感觉,并在以后的设计中做到心中有数,所以笔者在游戏设计制作前先让大家看看游戏主场景中层与帧的结构关系。
如图2所示。
图2
设计元件。
1.设计小狗。
按快捷键Ctrl+F8打开“创建新元件”面板新建一个名为“小狗”的影片剪辑元件。
然后可以手绘或者导入一个小狗头的图像,如图3所示。
图3,图4
2.设计黑洞。
同上方法新建一个名为“洞”的影片剪辑元件。
然后在其场景中使用“椭圆”工具绘制一个黑色的椭圆<不要边线),如图4所示。
3.设计菜刀。
新建一个名为“菜刀”的影片剪辑元件。
在“菜刀”元件把“图层1”改名为“菜刀”层,见图5<菜刀读者可以自行导入)。
点选第1帧,按F9,在弹出的“动作”面板中输入如下代码:
stop(>。
Mouse.hide(>。
图5
点选第2帧,按F6键插入关键帧,然后按快捷键Ctrl+T打开“变形”面板使菜刀发生20度旋转,见图6。
图6
4.设计小狗运动。
1.按快捷键Ctrl+F8新建一个名为“小狗运动”的影片剪辑元件,然后从库中“小狗”元件到“小狗运动”元件的场景中。
2.在元件“小狗运动”的场景中点选“图层1”的第5、10、20、25帧分别插入关键帧,然后选中第10帧,将此帧上“小狗”对象的位置向上移动大约50px,鼠标右键点选第5到10帧间任一帧,选择“创建补间动画”命令,建立运动渐变动画,如图7所示。
在第20到25帧也建立一个运动渐变动画,见图7,只是小狗运动是向下的。
图7
3.新建一个名为“点击”的按钮元件。
在元件的“点击”帧上按F6创键关键帧,然后用“矩形”工具绘制一个矩形,作为隐形按钮的控制区,如图8所示。
图8
4.在“小狗运动”元件的场景中新建一个“图层2”。
在“图层2”的第5帧插入关键帧,从库中拖动“点击”按钮元件到“图层2”上,删除该层中第21到25帧之间的所有帧,如图9所示。
图9
5.再新建一个“图层3”,在该层的第1、5、20帧分别建立空白的关键帧。
点选第1帧,按F9打开“动作”面板输入代码“stop(>。
”。
点选第5帧,在“属性”面板中将该帧的标签名设置为up,如图10所示。
同样将第20帧的标签名设为down。
图10
设计场景1。
1.回场景1,将“图层1”改名为“背景”。
接着从库面板中把元件“洞拖放到场景1中的第1层,然后分别复制9个相同的对象,按快捷键Ctrl+K打开“对齐”面板,把9个“洞”排好,如图11所示。
接着用“文本”工具在场景的右下方输入“得分”两个字<静态文本)。
图11
2.新建一个“小狗”层,接着从库中将“小狗运动”元件拖到该层中,然后再复制出9个,位置如图12所示。
图12
3.新建一个“遮罩”层,在元件“洞”的上方绘制一个矩形。
注意,矩形应该比“小狗运动”元件大点。
同样复制9个。
鼠标右键单击该层,在弹出的菜单中选择“遮罩层”命令。
如图13所示。
图13
4.点选“小狗”层上的第一个<左上角的)“小狗运动”元件,在“属性”面板中将其实例名改为“dog0”,然后同样将其
它的“小狗运动”对象命名为dog1、dog2……dog8。
5.新建一个“脚本”层,点选第1帧,打开“动作”面板,输入代码“stop(>。
”。
在第5帧插入关键帧,输入如下代码:
// random(9>是从0-9中任取一数
// gotoAndPlay("up">是让游戏跳转到up帧运行,实现小狗的随机出现
_root["pig" add random(9>].gotoAndPlay("up">。
6.把“菜刀”元件拖到背景层中,在“属性”面板中起实例名为knife,在“脚本”层的第4帧插入关键帧,输入一下代码:
// mouse.hide(>把默认的鼠标隐藏起来。
mouse.hide(>。
startDrag ("knife", true>。
设计记分系统。
1.在场景1“脚本”层的第1帧输入如下代码:
ROUND = 0。
SCORE = 0。
TATAL = 0。
stop(>。
2.点选“标签”层的第5帧,在“属性”面板上定义该帧的标签名为again,然后在“脚本”层的第22帧输入代码:ROUND++。
if ( ROUND<11 > {
gotoAndPlay ("again">。
}
当ROUND小于11时将不断循环。
游戏的计分方式为越快击中小狗分数越高。
在场景 1中新建一个“分值”层,在第5帧插入一个空白关键帧,输入“POINT = 100。
”在第20帧也插入一个空白关键帧,输入“POINT = 0。
”,如图14所示。
图14
3.在场景1中新建一给“分数”层,用“文本”工具拖出一个文本框,接着在“属性”面板中设置文本框为“动态文本”,变量名为score。
如图15所示。
图15
在“标签”层的第22帧输入如下代码:
Tatal += Point。
Score = Tatal。
其中Tatal为总分,Score = Tatal使得文本框中可以显示现在的玩家的得分。
那游戏怎么知道玩家是否打中了小狗呢?下面我们就要在“小狗运动”元件中加入的“点击”按钮元件。
然后点选“点击”按钮,按F9打开“动作”面板,输入代码:
on (release>
这段代码是在该按钮被鼠标点击时,影片跳至down帧开始播放,而场景1则跳转至End帧播放。
图16
设计场景2。
其实,场景2是很容易设计的,如图16所示。
第第25帧的代码是“gotoAndPlay(1>。
”。
因为篇幅关系,场景2具体的由读者参考源文件自行设计。
Flash游戏制作--五子连珠
五子连珠,在民间俗称”五子棋”,是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,传统的玩法是两玩家在围棋棋盘上进行比赛,这里玩家的对手将变成电脑,想不想和电脑过过招呢?下面我们就来学习使用Flash制作五子连珠这个游戏。
游戏的主界面如图1所示:
图1
游戏玩法:
五子连珠这个游戏需要由两位选手一起来完成,其中一位是电脑,电脑在游戏中使用黑棋比赛,您在游戏中使用白棋进行比赛,游戏的目的是尽量将自己的棋在棋盘上排列成五颗棋子连在一起的直线,水平方向,垂直方向或者斜向都可以,但是不能有拐点,必须是一条直线,哪一方先连好,则胜利。
玩家在游戏中一方面要尽量将自己的棋子连起来,另一方面也需要阻碍对手进行连子,不让对手轻易的将棋子连起来,直到有一方先连好五颗棋子,则游戏结束。
游戏中为了防止一方没有看清对方上一步的落子位置,在棋盘的右上角将显示上一步的落子位置,棋子的位置根据棋盘上的横纵标识来决定<横向为1-15,纵向为A-O)。
游戏制作思路:
本游戏制作起来有一定的难度,难度的关键在于玩家中有一方是电脑,如何合理的控制电脑走棋是最关键的部分。
如果要实现电脑的自动计算棋局和决定落子位置,就需要用到一些Ai<人工智能)方面的知识,在游戏制作中会详细讲解。
棋类游戏一般都会在一个二维的棋盘上进行,所以自然的就会使用二维数组来记录棋子的位置和决定落子的位置,数组在棋类游戏中也是应用非常的广泛。
游戏制作步骤:
下面我们就来开始具体的游戏制作步骤:
游戏素材的准备:
1.棋子的准备:棋类游戏当然少不了棋子,本游戏中需要两类棋子,一种为黑色棋子,一种为白色棋子,默认情况下电脑使用黑色棋子,我们可以从外部导入两副棋子图片,也可以在Flash中进行手工绘制。
本实例中我们就来自己制作两个棋子。
新建一个Graphic组件,并命名为black graphic,使用椭圆工具绘制一个圆形,并填充上黑色,这样一个简单的黑色棋子就做好了,如图2所示:
图2
因为我们需要在游戏中使用Action对棋子进行控制,所以需要将上面做好的Graphic组件转换为Movie clip类型的组件。
所以
新建一个movie clip组件,命名为black,将组件black graphic拖到组件black的编辑区即可。
按照同样的方法制作一个white graphic组件,并绘制一个白色的棋子,然后在建立相应的white movie clip组件,绘制好的白色棋子如图3所示:
图 3 2.控制按钮的制作:游戏中需要使用鼠标将棋子落到棋盘上,所以需要使用按钮结合棋子的方法,因为游戏中我们看到的实际是棋子,但是控制的是按钮,所以这里我们只需要制作一个简单的隐形按钮即可,按钮大小和棋子大小相似,如图4所示:
图4
当游戏结束后还需要有一个Replay按钮允许玩家重玩游戏,所以可以建立一个简单的按钮,用来控制游戏的再次运行,Replay 按钮如图5所示:
图5
3.控制游戏的MC:棋类游戏中少不了大量的Action程序控制,为了便于对游戏进行控制,一般将Action放在专门的Movie clip中,然后就可以在游戏的任何地方调用了。
A:新建一个Movie clip组件,命名为blk,进入组件编辑状态后,在第一关键桢添加如下AS:
stop(>。
function makelist(maker>
//自定义函数makelist,参数为maker,其作用是生成一个列表
{
if (maker =="white">
//如果传递进函数的参数是white
{
color = 2。
color_bad = 1。
//设置两变量值
}
else
//如果传递进函数的参数是black
{
color = 1。
color_bad = 2。
//设置两变量值
}
for (i=0。
i<15。
i++>
//外循环,循环变量为I,循环次数为15次
{
for (j=0。
j<15。
j++>
//外循环,循环变量为j,循环次数为15次,两次循环共15*15此,正好等于棋盘的大小,用来设//置棋盘
{
if (_root.table[i][j] <> 0>
//table数组用来检查棋盘是否为空,为空,相应的值为1,否则为0
{
for (k=0。
k<4。
k++>
{
if (maker =="white">
{
_puter[i*15+j][k] = 0。
}
else
{
_root.player[i*15+j][k] = 0。
}
}//若前一步的落子为白棋,则后一步计算机落子,否则玩家落子
} else {
//如果棋盘为空
for (k=0。
k<4。
k++> {
x = i。
y = j。
score = 5。
while ((_root.table[x+_root.dir[k][0]][y+_root.dir[k][1]] == color> and (x+_root.dir[k][0] < 15> and (y+_root.dir[k][1] >= 0> and (y+_root.dir[k][1] < 15> and (x+_root.dir[k][0] >= 0>> {
x = x + _root.dir[k][0]。
y = y + _root.dir[k][1]。
score = score * 2。
}
if ((_root.table[x+_root.dir[k][0]][y+_root.dir[k][1]] == color_bad> and (x+_root.dir[k][0] < 15> and (y+_root.dir[k][1] >= 0> and (y+_root.dir[k][1] < 15> and (x+_root.dir[k][0] >= 0>> {
score = score / 2。
}
x = i。
y = j。
while ((_root.table[x+_root.dir[k+4][0]][y+_root.dir[k+4][1]] == color> and (x+_root.dir[k+4][0] < 15> and
(y+_root.dir[k+4][1] >= 0> and (y+_root.dir[k+4][1] < 15> and (x+_root.dir[k+4][0] >= 0>> {
x = x + _root.dir[k+4][0]。
y = y + _root.dir[k+4][1]。
score = score * 2。
}
if (score > 30> {
score = score * 2。
}
if ((_root.table[x+_root.dir[k+4][0]][y+_root.dir[k+4][1]] == color_bad> and (x+_root.dir[k+4][0] < 15> and (y+_root.dir[k+4][1] >= 0> and (y+_root.dir[k+4][1] < 15> and (x+_root.dir[k+4][0] >= 0>> {
score = score / 2。
}
if (maker =="white"> {
_puter[i*15+j][k] = score。
} else {
_root.player[i*15+j][k] = score。
}
}//初始化棋盘,根据上一步落子的不同,来计算一下一步的落子
}
}
}
}
B:再新建一个Movie clip组件,命名为blk2,进入组件编辑状态后,在第一关键桢添加as:stop(>。
在第六桢插入一个关键桢,并添加如下AS:
if (_root.playnow == "computer"> {
// 如果先落子的为电脑,则初始化棋盘
_root.func.makelist("white">。
_root.func.makelist("black">。
//分别调用前面定义的自定义函数,且传递不同的参数max_computer = 0。
max_player = 0。
k = 0。
//定义三个变量
for (j=0。
j<15。
j++> {
for (i=0。
i<15。
i++> {
for (k=0。
k<4。
k++> {
if (_puter[j*15+i][k] == max_computer> {
rndnum = random ( 100 > + 1。
if (rndnum > 50> {
max_computer = _puter[j*15+i][k] 。
xc = i。
yc = j。
}
}
if (_puter[j*15+i][k] > max_computer> {
max_computer = _puter[j*15+i][k] 。
yc = j。
}
if (_root.player[j*15+i][k] > max_player> {
max_player = _root.player[j*15+i][k] 。
xp = i。
yp = j。
}
}
}
}
if (max_computer > max_player> {
x = xc。
y = yc。
} else {
x = xp。
y = yp。
}
// 绘制棋子
num = y * 15 + x。
removeMovieClip(_root.b add num>。
duplicateMovieClip(_root.white, "white" add num, num + 300>。
setProperty(_root.white add num, _x, 34.7 + x * 20>。
setProperty(_root.white add num, _y, 34.7 + y * 20>。
_root.table[y][x] = 2。
// 显示棋子
_root.display = "Xpos : " + (x + 1>。
temp = chr ( y + 65>。
_root.display1 = "Ypos : " + temp。
_root.playnow = "player"。
//判断是否获胜
xx = x。
yy = y。
for (k=0。
k<4。
k++> {
if (_root.a_result <> 6> {
_root.a_result = 0。
x = xx。
y = yy。
while ((_root.table[y][x] == 2> and (y+_root.dir[k][1] < 16> and (x+_root.dir[k][0] >= -1> and (x+_root.dir[k][0] < 16> and (y+_root.dir[k][1] >= -1>> {
x = x + _root.dir[k][0]。
y = y + _root.dir[k][1]。
// "_root.table["+y+"]["+x+"]="+_root.table[y][x]
_root.a_result = _root.a_result+1。
}
while ((_root.table[y][x] == 2> and (y+_root.dir[k+4][1] < 16> and (x+_root.dir[k+4][0] >= -1> and (x+_root.dir[k+4][0] < 16> and (y+_root.dir[k+4][1] >= -1>> {
x = x + _root.dir[k+4][0]。
y = y + _root.dir[k+4][1]。
_root.a_result = _root.a_result+1。
}
if (_root.a_result == 6> {
_root.playnow = "nobody"。
}
}
}
if (_root.playnow =="nobody">
}
C:新建一个Movie clip组件,并命名为bb,此组件用来计算电脑如何走棋,进入组件编辑状态后,在图层layer1绘制一个有填充色的矩形,然后在第5桢插入一个关键桢,在同样位置绘制一个大小相同填充色不同的矩形。
新建一个图层,在矩形里输入提示文字:电脑走棋,然后再新建一个图层Action,在第一桢添加AS: stop(>。
,在第8桢插入一个关键桢,在此桢添加如下AS: if (_root.playnow == "computer"> {
//初始化棋盘
_root.func.makelist("white">。
_root.func.makelist("black">。
//调用自定义函数
max_computer = 0。
max_player = 0。
k = 0。
//定义三变量
for (j=0。
j<15。
j++> {
for (i=0。
i<15。
i++> {
for (k=0。
k<4。
k++> {
if (_puter[j*15+i][k] == max_computer> {
rndnum = random ( 100 > + 1。
if (rndnum > 50> {
max_computer = _puter[j*15+i][k] 。
xc = i。
yc = j。
}
}
if (_puter[j*15+i][k] > max_computer> {
max_computer = _puter[j*15+i][k] 。
xc = i。
yc = j。
}
if (_root.player[j*15+i][k] > max_player> {
max_player = _root.player[j*15+i][k] 。
xp = i。
}
}
}
if (max_computer > max_player> {
x = xc。
y = yc。
} else {
x = xp。
y = yp。
}
// 绘制棋子
num = y * 15 + x。
removeMovieClip(_root.b add num>。
duplicateMovieClip(_root.white, "white" add num, num + 300>。
setProperty(_root.white add num, _x, 34.7 + x * 20>。
setProperty(_root.white add num, _y, 34.7 + y * 20>。
_root.table[y][x] = 2。
// 显示棋子
_root.display = "Xpos : " + (x + 1>。
temp = chr ( y + 65>。
_root.display1 = "Ypos : " + temp。
_root.playnow = "player"。
// 判断是否获胜
xx = x。
yy = y。
for (k=0。
k<4。
k++> {
if (_root.a_result <> 6> {
_root.a_result = 0。
x = xx。
y = yy。
while ((_root.table[y][x] == 2> and (y+_root.dir[k][1] < 16> and (x+_root.dir[k][0] >= -1> and
(x+_root.dir[k][0] < 16> and (y+_root.dir[k][1] >= -1>> {
x = x + _root.dir[k][0]。
y = y + _root.dir[k][1]。
// "_root.table["+y+"]["+x+"]="+_root.table[y][x]
_root.a_result = _root.a_result+1。
}
x = xx。
y = yy。
while ((_root.table[y][x] == 2> and (y+_root.dir[k+4][1] < 16> and (x+_root.dir[k+4][0] >= -1> and (x+_root.dir[k+4][0] < 16> and (y+_root.dir[k+4][1] >= -1>> {
x = x + _root.dir[k+4][0]。
y = y + _root.dir[k+4][1]。
if (_root.a_result == 6> {
_root.playnow = "nobody"。
}
}
}
// 游戏结束
if (_root.playnow =="nobody">
}
最后的时间线如图6所示:
图6
D:再新建一个movie clip组件,命名为buttonclip,此组件用来控制双方的落子,进入组件编辑状态后,将前面做好的隐形按钮拖放到编辑区中,然后给第一桢添加AS:stop(>。
.
E:最后再制作一个movie clip,命名为gameover,此组件用来判断游戏是否结束,也就是判断是缶有一方已经连好了五颗棋子。
进入组件编辑状态后,连续建立四个图层,分别为layer1,layer2,layer3和action,在layer1,layer2,layer3的第一桢插入空白,然后在第2桢绘制电脑获胜的提示信息,并将Replay按钮拖到编辑区中,给按钮添加As:
on (release>
如图7所示:
图7
在layer1,layer2,layer3的第三桢按照同样的方法设置您胜利的提示信息,如图8所示:
然后回到图层action,接下来就要添加具体的控制Action了,在此图层的前三个关键桢分别添加as: stop(>。
,在第四关键桢添加如下AS:
for (i=0。
i<=225。
i++> {
removeMovieClip(_root.black add i>。
removeMovieClip(_root.white add i>。
removeMovieClip(_root.b add i>。
}
//清除棋盘上的棋子
_root.gotoAndPlay("run">。
//跳转到游戏的开始
最后的时间线如图9所示:
图9
布置主场景:
游戏的主要工作完成后,接下来需要布置主场景了。
首先使用绘图工具绘制出游戏中的棋盘,棋盘大小为15*15的矩阵,然后给棋盘标上横向和纵向的标识,如图10所示:
图10
分别将组件white,black,buttonclip,blk,bb和gameover拖到舞台的合适位置,如图11所示:
图11
组件white的实例名为:black
组件black的实例名为:white
组件buttonclip的实例名为:b
组件blk的实例名为:func
组件bb的实例名为:computerrun
组件gameover的实例名为:gameoverman
然后在棋盘上绘制两个Dynamic text动态文本框,用来显示上一步落子的位置,分别设置变量名为display和display1。
最后,给第一关键祯添加as:
stop(>。
urls = "边城浪子-闪客帝国"。
num = 0。
table = new Array(>。
computer = new Array(>。
player = new Array(>。
a_result = 0。
// Table array
for (i=0。
i<15。
i++> {
table[i] = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>。
}
// Computer and player table list
for (j=0。
j<15。
j++> {
for (i=0。
i<15。
i++> {
computer[j*15+i] = new Array(0,0,0,0>。
player[j*15+i] = new Array(0,0,0,0>。
}
}
// Make buttons
count = 0。
for (j=0。
j<15。
j++> {
for (i=0。
i<15。
i++> {
setProperty("b"add count, _x, 34.7 + i * 20>。
setProperty("b" add count, _y, 34.7 + j * 20 >。
count++。
}
}
// Eight directions
var dir = new Array(>。
dir[0] = new Array(1,0>。
dir[1] = new Array(1,1>。
dir[2] = new Array(0,1>。
dir[3] = new Array(-1,1>。
dir[4] = new Array(-1,0>。
dir[5] = new Array(-1,-1>。
dir[6] = new Array(0,-1>。
dir[7] = new Array(1,-1>。
playnow = "player"。
removeMovieClip(_root.b112>。
duplicateMovieClip(_root.white, "white112", 142>。
setProperty("white112", _x, 174.7>。
setProperty("white112", _y, 174.7>。
// The first black point
table[7][7] = 2。
到此为止,五子连珠这个游戏就制作完成了,本游戏属于较高级的游戏制作,需要有一定的Action编程基础,不过如果您对Action不太了解,相信学完本实例后,可以在一定程度上提高您的Action水平。