`
lilisalo
  • 浏览: 1110265 次
文章分类
社区版块
存档分类
最新评论

如何用LegendForFlashProgramming来制作SLG游戏

 
阅读更多

※本篇为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为敌军。


四,关于游戏中各种图片的修改
现在手头没带源文件,稍后补充。

五, 作者的话
写的有些乱,大家最好对照着游戏和游戏剧本看一下,以后有时间了会专门制作一个剧本编辑器,欢迎大家拍砖。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics