VIP名士
- 积分
- 21587
- 声望
- 19498 声
- 银两
- 268320 两
- 回帖
- 2972
- 精华
- 24
- 阅读权限
- 180
- 注册时间
- 2007-5-29
- 最后登录
- 2024-8-11
|
场景事件的修改这里就不赘述了,可以参见以下帖子:
SetD和GetD:http://www.txdx.net/thread-518105-1-1.html
事件编辑实例详解:http://www.txdx.net/thread-492241-1-1.html
当然金水还是有着一些区别的,如这里ModifyEvent函数,是以前的instruct_3和SetD两个函数的结合,这在综述里面讲过。
而第二个链接里面的OEVENTLUA函数,金水里是没有的。因为苍炎是以lua为核心的,而金水的pascal 对于调用事件提供了太多便利,可以参照我在综述里面的讲解。
子场景的事件,由于金水的引擎已经提供了全面的支持,包括接口函数,数据存储以及修改器等等,其实是很好做的。但大地图上的触发事件则需要我们另辟蹊径了。
子场景事件的触发方式有三种,一是对话触发,也就是面向指定方向按空格或点鼠标,二是使用物品触发,三是走过固定位置触发。
而关于大地图事件,这里给出两个思路,也算是两个小小的系统吧:
A、大地图随机事件
在大地图上走动,有一定几率随机触发一些事件,这个系统是很有用的,可以做成随机遇到商人,或者随机遇敌,或者触发某些支线,随机遇敌的话又可以加入护送任务里面,这样玩起来就更加多元化。
一开始我们的思路是添加一个全局计时器,没过一段时间都可以进行一次判断,决定是否触发事件。这个思路也是可以实现的,有兴趣的可以试试,但这样太消耗资源了。
参考了其他一些mod的制作,发现有像慕容老恭的《山寨江湖》那样,每次按键就进行判断的,这是一个不错的思路。
但具体到金水里面,我们就没必要再在lua里进行按键判断了,这样也停费资源的。我们可以直接将这一部分添加到行走函数里,在按键行走时顺便判断大地图事件的触发,这样资源消耗就能小上不少,也便于操作。
具体方法是这样的:
先在kys_main的Walk函数下面添加变量声明:
- trigger_rand:longint; //用于判断的随机数
- trigger_count:integer; //统计步数,间隔一定步数才触发
- trigger_str: WideString; //调用的脚本路径
复制代码
然后在行走函数的事件轮询里写进如下代码:
- while SDL_PollEvent(@event) >= 0 do //事件轮询
- begin
- ……
- //大地图触发事件
- trigger_str :='f1';
- if walking>0 then //只有行走过程中才会触发
- begin
- trigger_count :=trigger_count+1;
- if (trigger_count mod 100 =0)then //每走100步才会进行判断
- begin
- trigger_count:=0;
- trigger_rand:=random(100);
- if trigger_rand>70 then //有30%概率触发
- begin
- ExecScript(AppPath +'script/MMap_Trigger.lua', trigger_str); //调用指定脚本的指定函数
- end;
- end;
- end;
- ……
- end //轮询结束
复制代码
以上是pascal的部分,然后我们就可以随意在指定的lua脚本里随意编辑自己想要触发的事件了。
例如:
- function f1()
- Talk(0,"啊,踩到狗屎了!",-2,0,0,0);
- pause();
- end
复制代码
效果图(走了N多步之后的某次):
当然我们还可以添加更多更丰富的脚本,也可以添加更多判断条件,如果要传递数据的话,就要涉及到得全局变量赋值了,通过在kys_script里注册相应接口函数就可实现,这里先不讲。
B、大地图挖宝
或者也可称作大地图使用物品触发事件。
目标:在大地图上指定区域使用指定物品,有一定几率挖到随机宝物。
难点:金水的设定中,除了药直接磕改变属性之外,是不存在在任意地方使用其他物品触发事件这一设定的。
但研究useitem函数发现,我们没必要修改pascal源程序。因为这里实际上提供了一个接口,即:
- //如某属性大于0, 直接调用事件
- if Ritem[inum].UnKnow7 > 0then
- CallEvent(Ritem[inum].UnKnow7)
复制代码
也就是只要Ritem[inum].UnKnow7大于0,我们就可以随时使用该物品,并调用Ritem[inum].UnKnow7这个值所对应的lua脚本序号。
首先是准备工作,我们需要给主角一个道具,这里设为“铁铲”。在添加物品的时候顺便设定其UnKnow7的值:
- PutItemPro(1090,195,44); --将铁铲的UnKnow7设定为1090,44是这一属性的地址,可以自己试验出来
- GetItem(195,1); --给予物品
复制代码
这里我新建了一个oldevent_1090.lua文件,添加如下代码:
- clear();
- CurScene=GetCurrentScence(); --获取当前场景
- if CurScene>0 then --只有在大地图才能触发
- Talk(0,"一般只有野外才能挖东西吧。。。",-2,0,0,0);
- else
- x,y=getmainmapposition(); --获取大地图坐标
- if getrolepro(0,21)>10 then --体力大于10才能触发
- if x>=357 and x<=359 andy>=234 and y<=236 then --在指定矩形区域内才能触发
- rand=math.random(100);
- if rand<=30 then
- Talk(0,"挖到东西了",-2,0,0,0);
- randitem=math.random(198)-1; --物品序号从0开始,所以要减1
- GetItem(randitem,1);
- else Talk(0,"居然什么都没有挖到。。。",-2,0,0,0);
- end
- clear();
- putrolepro(getrolepro(0,21)-10,0,21) --扣除体力
- ShowString(250, 200, "一番忙碌之后,体力下降10点",0xFF00,0xFF00);
- pause();
- else Talk(0,"这个地方什么也没有",-2,0,0,0);
- end
- else Talk(0,"没有体力了,我得休息一会儿",-2,0,0,0);
- end
- end
复制代码
效果如下:
这个挖宝系统也还是比较粗糙的,因为没有藏宝图相关的东西,但添加藏宝图的话,又涉及到藏宝图显示的问题,以及全局变量的读写问题,这里先不细讲。
其实这两个系统是不一定非要用在大地图上的,只不过它相对于原版的子场景事件触发方式有了一定的改变。因而也可以去掉大地图的限制,在子场景中使用。
顺带提一下这里的lua程序用到的函数:
PutItemPro:改变指定物品的指定属性,三个参数分别为要赋的值,物品编号,属性编号
Getrolepro:获取人物的某项属性,两个参数依次为人物序号,属性序号
Putrolepro:改变人物的某项属性,三个参数依次为要赋的值,人物序号,属性序号
ShowString:屏幕上显示字符串,五个参数,前两个是显示的位置坐标,第三个是要显示的字符串,第四个和第五个是颜色。为什么有两个颜色参数呢?因为ShowString为了将字体加粗,采用了生成两个一样的字,错开一定位置重叠的方法,来达到加粗的效果,因而这两个颜色参数依次对应两行重叠的字。这里的颜色参数采用16进制数字标识,0xFF0000即为纯红,0xFF00为纯绿,0xFF为纯蓝,每两位16进制分别表示0~255的RGB值。
如果想设定更详细的参数,如字体大小,字体类型等等,那就不能用这个函数了,得研究一下更底层的一些函数。
Talk:这是相对于原版加强了的对话函数,很容易用,总共六个参数。程序中的注释有一些错误,经尝试如下:
6个参数可以是5个数字,一个字符串,也可以是4个数字,2个字符串,数字和字符串之间任意排列。
第一个数字参数是对话人物的序号,用来设置人物头像,序号参看Rrole列表,头像参看\resource\head\。
第一个字符串参数是对话字符串,可以在其中添加^0,^1等标示符来对文字着色,其中^0是白色,^1是黄色,其他颜色可以自己尝试。
第二个字符串参数是指定姓名字符串,可以显示指定的姓名,而不显示对应序号的人物姓名。当这个值为大于等于0的数字的时候,表示显示指定序号的人物姓名,为-2的时候,自动采用头像序号对应的姓名。为数字时,它作为第二个数字参数。
倒数第三个数字为显示模式,即头像显示在左还是右,0时为左,1时为右。
倒数第二个数字为是否显示头像,0时显示去,其他不显示
最后一个数字为对话颜色,这个也可以在字符串里设置,此处颜色序号参照颜色标识,一般设为0,即为白色。 |
|