※本篇为LegendForFlashProgramming脚本引擎的使用教程第二篇。
一,关于LegendForFlashProgramming脚本引擎
http://blog.csdn.net/lufy_legend/article/details/6889424
二,准备工作
本次用LegendForFlashProgramming0.1来制作,本篇教程基于三国记黄巾之乱,你可以到这里下载三国记黄巾之乱,首先需要注意,在游戏剧本里,可能有很多被注释掉的代码,看的时候可以直接跳掉。另外,在第一篇教程《如何用LegendForFlashProgramming来制作LVG游戏》中已经 涉及到的语法等,此篇中就不再累赘了。
三, SLG游戏的一些设定
关于游戏中的几个文件夹
1,initialization文件夹,里面包含游戏中所有数据的设定,。
①Arms.sgj,兵种设定文件
②chara.sgj,人物设定文件
③Item.sgj,武器装备设定文件
④Props.sgj,物品设定文件
⑤Skill.sgj,特技设定文件
⑥Strategy.sgj,策略设定文件
⑦Terrain.sgj,地形设定文件
⑧Stage.sgj,战场上一些特殊物件的设定,比如火焰
2,images文件夹,游戏中所有的图片
①icon文件夹里是游戏的icon文件
②logo文件夹里是游戏的logo页面所需要的背景图片和按钮文件
③map文件夹里是游戏的地图文件,.rmap为R地图文件,.smap为S地图文件
④face.swf头像图片
⑤item.swf武器图片
⑥meff.swf法术图片
⑦stage.swf战场上特殊物件的图片,比如火焰
⑧R.swf人物R动作图片
⑨S.swf人物S动作图片
⑩img.swf游戏中的最基本的一些图片,比如框架,按钮等
⑪sound.swf这个比较特殊,不是图片文件,是游戏中的声效文件
3,sound文件夹,里面是游戏中的音乐文件。
4,script文件夹,里面是游戏的剧本文件。
四, SLG游戏的制作
1,打开MainSLG.lf,可以看到,里面的代码首先是显示loading,然后开始读取logo画面所需要的图片,最后跳转到logo.lf。
Load.script(script/logo.lf);为剧本跳转,
2,Logo.lf中,里面没有基本上都是之前讲过的语法,加入了一张背景图片,五个按钮。
①SouSouObjectLoad.loadimg();和SouSouObjectLoad.loadfile(1);,这两句代码,是游戏的初期化,在调用剧本的时候,必须进行游戏的初期化。
②SouSouSound.musicMode(1);为音乐有效无效的设定,参数为1的时候为有效,0的时候为无效。
③SouSouWindow.system(read);为显示读档画面
④SouSouGame.taobao();是为了参加淘宝的移动大赛,专门添加的功能,可以无视之,跳过。
⑤SouSouGame.close();是关闭游戏。
⑥SouSouSound.playMusic(sound/sg01.mp3);播放音乐。参数为音乐文件的路径。
3,r01.lf:游戏里的第一个R剧本文件
在SouSouRMap.start();之前的代码,都是以前说过的,下面从SouSouRMap.start();开始的代码说起。
R剧本代码的固定格式为:
SouSouRMap.start();
initialization.start;
addMap(images/map,r01.rmap);
SouSouRCharacter.add(0,34,3,9,7);
SouSouRCharacter.add(0,151,2,15,15);
……
initialization.end;
function.start;
function.end;
loop.start;
loop.end;
SouSouRMap.end();
//设定人物不可控
SouSouRunMode.set(1);
SouSouSound.playMusic(sound/sg02.mp3);
SouSouRCharacter.add(0,163,1,29,19);
SouSouTalk.set(163,0,报!);
……
Load.script(script/r02.lf);
SouSouRMap.start();和SouSouRMap.end();之间,是R剧本的初始化。
① initialization.start;和initialization.end;之间,添加R剧本地图和出现人物。
② addMap(images/map,r01.rmap);添加地图,参数为(地图路径,地图名)
③ SouSouRCharacter.add(0,34,3,9,7);添加人物,参数为(是否可控制,人物编号,方向,x坐标,y坐标)
④ function.start; 和function.end;之间,是R剧本里的方法初始化。
⑤ function characterclick3();
SouSouTalk.set(3,0,大哥,赶紧出发吧);
endfunction
characterclick方法是人物点击事件,必须加在function.start; 和function.end;之间,方法名是characterclick+人物编号,例如characterclick3是点击人物编号3时调用的方法。
⑥loop.start;和loop.end;之间,是R剧本的循环事件,例如自由R剧本中的坐标测试等,在三国记黄巾之乱中可以说基本上没有涉及到自由R,没有示例的话,说起来比较麻烦,所以等下一版游戏发布的时候,再做详细说明。
⑦SouSouRunMode.set(1);设定操作不可控,即剧情模式,当然其相对的就是我刚才提到的自由R模式,在剧情模式中,游戏不可控制,只能按照剧本编写的剧情顺序播放。
⑧SouSouRunMode.set(0);设定操作可控。
⑨SouSouTalk.set(163,0, 有大批黄巾军已经攻破了邻县!);游戏对话。
参数(人物编号,表情编号,对话内容)
⑩SouSouRCharacter.remove(163);移除人物,参数为(人物编号)。
⑪SouSouRCharacter.moveTo(1,163,24,14);人物移动。
参数(移动模式,人物编号,坐标x,坐标y),
移动模式为0时,表示相对移动,为1时,表示绝对移动。
⑫Layer.drawRect(-,0,0,800,480,0x000000,1);画一个矩形,
参数(层,起始坐标x,起始坐标y,宽,高,颜色,矩形边框线粗)。
⑬Load.script(script/r02.lf);跳转页面到 r02.lf。
5,r02.lf:游戏里的第二个R剧本文件
r02.lf 中比r01.lf中多一个新的语句, SouSouRCharacter.changeAction(171,1);表示改变人物动作,参数(人物编号,动作编号)。
6,r03.lf中,无新语句,我们直接看r04.lf。
① SouSouWindow.addProps(1);加入物品。参数(物品编号)。
②SouSouWindow.msg(得到两个馒头,1);显示信息。参数(信息内容,1)。
③SouSouMember.add(1,3);我方成员加入。参数(人物标号,人物加入等级)。
④SouSouMember.addEquipment(1,0,6,1,1,1,0); 加入装备,参数(人物编号,头盔编号,盔甲编号,盔甲lv,武器编号,武器lv,坐骑编号)。
⑤Load.script(script/s01.lf);跳转到s01.lf第一个s战场剧本,这是进入S战场的第一种方法。还有第二种方法,请看r08_1.lf。
⑥r08_1.lf也算是一个简单的自由R的例子了,里面的SouSouWindow.preWar(script/s03.lf);表示进入出战准备画面,参数(出战后调用的S剧本)
SouSouMember.setMust(1);是设定默认必须出场的人员,参数(人物编号)
7,在r08.lf中,还有一个SouSouWindow.shop();表示进入商店画面,在endWindow;结束商店之前,可以用shopProps(0);来添加一些该商店能够出售的商品,比如馒头,包子等。shopProps(0)中的参数为物品编号。
8,s01.lf是游戏的第一个S战场剧本--大兴山之战。
首先,需要说明的是,游戏进入S剧本初始化之前,一定要有我方人员出场设定,在r04.lf结束时采用的是直接进入战场,即R剧本中没有出战选择,所以在S剧本中必须要有我方人员出场设定。
S剧本的固定格式为:
SouSouSMap.start();
initialization.start;
SouSouSCharacter.addOur(0,2,1,14,1);
……
SouSouSCharacter.addEnemy(4,4,1,13,7,1,1);
……
SouSouSCharacter.addFriend(7,5,2,2,14,0,0);
……
addMap(images/map,s01.smap);
initialization.end;
function.start;
function win();
Load.script(script/r05.lf);
Exit.run();
endfunction;
function lose();
SouSouWindow.msg(战斗失败!,1);
Layer.clear(-);
Load.script(script/lose.lf);
Exit.run();
endfunction;
functionatBelongCoordinate(belong,cx,cy);
if(@atBelongCoordinate1 != 1 && @belong==0 &&@cx==13 && @cy==7);
//获得物品(物品编号)
SouSouWindow.addProps(1);
SouSouWindow.msg(得到包子,1);
//SouSouTalk.set(1,0,占领!9-11);
Var.set(atBelongCoordinate1,1);
endif;
endfunction;
function.end;
loop.start;
SouSouSCharacter.checkHp(4,0,0,@checkHp1!=1);
……
loop.end;
SouSouSMap.end();
SouSouMember.addEquipment(4,0,1,1,6,1,0);
……
SouSouSound.playMusic(sound/sg03.mp3);
SouSouRunMode.set(1);
//剧情
……
SouSouWindow.setCondition(1、击毙程远志和邓茂!,1、刘备阵亡!);
SouSouRunMode.set(0);
SouSouSAttack.start(0);
①先来看剧本中上面的几行代码。
Var.set(save_file,s01);//*1
Var.set(save_word,save_s01_1); //*2
//添加选择
SouSouTalk.select(1.保存存档,2.放弃保存); //*3
if(@select==0);
SouSouWindow.system(save); //*4
endif;
Mark.save_s01_1; //*5
这些是添加游戏是否存档提示的代码。*1表示当前存档所存的那个剧本。*2表示存储的剧本的哪里。*3显示是否存档选择。*4表示进行存档。*5设定标示,与*2中设定的值必须一致。
②SouSouMember.preWar(1);我方人物出场设定,即设定此战我方队员的参战人员,这个设定必须是加到战场初始化之前,且在R剧本中没有进行出战选择。
9,SouSouSMap.start();和SouSouSMap.end();之间,是S剧本的初始化,添加地图,出现人物及发生事件等信息。
10,initialization.start;和initialization.end;之间,设定人物的出场和地图。
11,SouSouSCharacter.addOur(0,2,1,14,1); //我军人物出场设定,参数(人物出战顺序号,方向(0down,1left,2up,3right),出现x坐标,出现y坐标,是否隐藏)。
12,SouSouSCharacter.addEnemy(4,4,1,13,7,1,1); //敌军人物出战设定,参数(人物编号,等级,方向(0down,1left,2up,3right),出现x坐标,出现y坐标,是否隐藏,AI(0默认,1被动出击,2主动出击))
13,SouSouSCharacter.addFriend(7,5,2,2,14,0,0);//友军人物出战设定,参数(人物编号,等级,方向(0down,1left,2up,3right),出现x坐标,出现y坐标,是否隐藏,AI)
14,addMap(images/map,s01.smap);添加S战场地图
15,function.start;和function.end;之间添加战场上可以触发事件的函数。
16,win()函数,战斗胜利后调用的函数,必须有。
17,lose()函数,战斗失败后调用的函数,必须有。
18,adjacent(index1,index2)人物相邻测试,参数(人物编号,人物编号)。
在adjacent函数里,可以添加多个相邻测试,但是每个相邻测试必须用一个变量来控制,比如if(@adjacent1 != 1&& @index1==3 && @index2==5);这里表示人物3和人物5相邻,且变量adjacent1不等于1的时候,触发这个事件,当事件结束后,使用Var.set(adjacent1,1);将变量adjacent1设为1,表示该事件已经发生,那么下次人物3和人物5相邻的时候,此事件就不发生了。
19,checkHp(index,minhp,maxhp)hp测试函数,当人物hp处于指定范围内的时候触发,变量(人物编号,hp范围小,hp范围大)。这个事件也一样,可以添加多个测试,需要一个变量来控制。
20,atBelongCoordinate(belong,cx,cy)坐标测试,当指定方(我方,友方或敌方)到达某一座标后触发的事件。这个事件也一样,可以添加多个测试,需要一个变量来控制。
21,loop.start;和loop.end;之间,添加需要循环的事件。其实上面所说的函数,只是相当于预设好了事件,我们有地方调用它们,然后它们才会发生,否则它们只是设定好了而已。
SouSouSCharacter.checkHp(4,0,0,@checkHp1!=1);表示当变量checkHp1不为1的时候,不断循环checkHp函数,并传递相应的参数。
SouSouSCharacter.adjacent(3,5,@adjacent1!=1);表示当变量adjacent1不为1的时候,不断循环adjacent函数,并传递相应的参数。
SouSouSCharacter.atBelongCoordinate(0,13,7,@atBelongCoordinate1!=1); 表示当变量atBelongCoordinate1不为1的时候,不断循环atBelongCoordinate函数,并传递相应的参数。
22,SouSouMember.addEquipment(4,0,1,1,6,1,0);表示设定人物装备,参数(人物编号,头盔编号,装备编号,装备等级,武器编号,武器等级,坐骑编号)
23,SouSouSCharacter.show(1,1);武将出现,就是让原来设定成隐藏的武将出现在战场上。参数(人物编号,模式),其中模式设为1表示武将出现,如果设定成0,则是将武将隐藏。
24,SouSouSCharacter.changeAction(3,ATK);武将动作,参数(人物编号,武将动作),其中ATK表示攻击动作,ATKPREPARE表示预备攻击动作,MOVE表示移动动作,HERT表示受攻击动作,PANIC表示原地转圈,PANT表示喘气。
25,SouSouSCharacter.changeDirection(5,1,1);改变武将方向,参数(人物编号,1,目标人物编号)或者(人物编号,0,方向)
26,SouSouWindow.singled(3,5);单条开始。
27,SouSouWindow.singledend();单条结束。
28,关于单条的各种动作,看下面一段单条吧,里面包含详细注释
//单挑开始[左人物编号,右人物编号]
SouSouWindow.singled(3,5);
Wait.time(40);
//单条控制:人物攻击预备[人物(0左1右)]
SouSouSingled.atkPrepare(0);
//单条控制:单条对话[人物(0左1右),说话内容]
SouSouSingled.talk(0,你爷爷的,有地不种,去当贼!?);
Wait.time(40);
SouSouSingled.block(1);
//单条控制:单条对话[人物(0左1右),说话内容]
SouSouSingled.talk(1,哼!说得轻巧,不造反哪儿来的地种?);
Wait.time(40);
//单条控制:人物前移[人物(0左1右),移动距离(+右-左)]
SouSouSingled.move(0,3);
//单条控制:单条对话[人物(0左1右),说话内容]
SouSouSingled.talk(0,现在后悔还来得及。);
Wait.time(40);
SouSouSingled.talk(1,……);
Wait.time(40);
SouSouSingled.talk(1,拼了!);
//单条控制:人物前移[人物(0左1右),移动距离(+右-左)]
SouSouSingled.move(1,-1);
Wait.time(40);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
Wait.time(40);
SouSouSingled.block(0);
SouSouSingled.talk(0,就这点本事吗?);
Wait.time(40);
SouSouSingled.talk(1,(……糟糕!碰到高手了。));
Wait.time(40);
SouSouSingled.talk(1,呀呀呀……!);
//单条控制:人物前移[人物(0左1右),移动距离(+右-左)]
SouSouSingled.move(1,-1);
Wait.time(40);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.atkBlock(1);
Wait.time(40);
//单条控制:人物喘气[人物(0左1右)]
SouSouSingled.pant(1);
Wait.time(40);
SouSouSingled.talk(1,不行啊,完全无效……);
Wait.time(40);
SouSouSingled.block(0);
SouSouSingled.talk(0,怎么样?还打吗?);
Wait.time(40);
//单条控制:人物攻击预备[人物(0左1右)]
SouSouSingled.atkPrepare(1);
//单条控制:单条对话[人物(0左1右),说话内容]
SouSouSingled.talk(1,打,不打就没饭吃啊,杀啊!);
Wait.time(40);
//单条控制:人物前移[人物(0左1右),移动距离(+右-左)]
SouSouSingled.move(1,-1);
//单条控制:攻击跳闪[人物(0左1右)]
SouSouSingled.atkDodge2(1);
Wait.time(40);
SouSouSingled.talk(1,嗯?人呢?);
Wait.time(40);
SouSouSingled.talk(0,笨蛋,在你后面呢,看招!);
//单条控制:攻击致命[人物(0左1右)]
SouSouSingled.atkHertFatal(0);
//单条控制:人物喘气[人物(0左1右)]
SouSouSingled.pant(1);
SouSouSingled.talk(1,我的妈呀,不行了);
Wait.time(40);
//单条控制:人物前移[人物(0左1右),移动距离(+右-左)]
SouSouSingled.move(0,1);
//单条控制:攻击挡格[人物(0左1右)]
SouSouSingled.block(0);
Wait.time(40);
//单条控制:单条对话[人物(0左1右),说话内容]
SouSouSingled.talk(0,明知道打不过俺,还这么拼命,勇气可嘉,今天就饶你命吧。);
Wait.time(40);
//单条控制:单条结果[-1失败0平手1胜利]
SouSouSingled.result(1);
Wait.time(100);
//单条结束
SouSouWindow.singledend();
29,SouSouWindow.setCondition(1、击毙程远志和邓茂!,1、刘备阵亡!);显示胜利条件
30,SouSouSAttack.start(0);当一切准备就绪,战斗开始。
31,SouSouWindow.addMoney(100);获得银两。参数(银两数)。
32,Exit.run();该剧本结束,不再进行此剧本的其他代码了。
33,SouSouSound.playEffect(Se35);播放声效。
34,SouSouSCharacter.outRect(1,0,0,15,15);区域撤退,第一个参数是表示所属,-1为友军,0为我军,1为敌军。
35,SouSouSCharacter.changeRect(1,status,chaos,14,6,19,7);区域混乱,第一个参数是表示所属,-1为友军,0为我军,1为敌军。
四,关于游戏中各种图片的修改
现在手头没带源文件,稍后补充。
五, 作者的话
写的有些乱,大家最好对照着游戏和游戏剧本看一下,以后有时间了会专门制作一个剧本编辑器,欢迎大家拍砖。