铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 5725|回复: 12

[不负责任的教程]以奇遇系统举例,简单打造大地图和子场景中的随机事件触发

  [复制链接]
发表于 2012-8-19 06:29 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 二宫和也 于 2012-8-26 13:23 编辑

返回教程索引

如题,其实要实现随机事件很简单,高手看来简直不值一哂 -_- 真正复杂的是做具体的事件/剧情和一堆全局判定...我这几天用SetS和GetS用得想吐有木有....

1. 子场景的随机事件
先从子场景讲起,因为这个实现起来比大地图简单。搜索函数Game_SMap(),然后鼠标往下滚,直到看见以下代码为止:
  1.     local x, y = nil, nil
  2.   local keypress = lib.GetKey()
  3.   local direct = -1
  4.   if keypress ~= -1 then
  5.     JY.MyTick = 0
  6. ....
  7. ....
  8. ....
  9. 下略
复制代码
这是一段巨长的代码,实话说,我也看不懂...我只知道这一段是得到玩家的键盘值,然后通过键盘值来判定接下来的动作。比如如果你按了键盘的上箭头,人物就往上走。

这里的keypress是临时变量,用lib.GetKey()得到键盘值。所以我用的懒方法如下,在JY.MyTick = 0下方加入:
  1. if keypress == VK_UP or keypress == VK_DOWN or keypress == VK_LEFT or keypress == VK_RIGHT then
  2.         if math.random(200) == 1 then
  3.                 QZXS("插入任意剧情")
  4.         end
  5. end
复制代码
这一段就是说,如果玩家按了上下左右键移动人物,每按一次键盘就有1/200几率出现剧情,剧情随你编。

看,就是这么简单...

2. 大地图的随机事件
大地图跟子场景大同小异,唯一的不同就是触发剧情战斗的时候会出错跳出,这个我们等下说。先搜索函数Game_MMap(),同样鼠标往下滚,看到如下代码:
  1.   local keypress = lib.GetKey()
  2.   if keypress ~= -1 then
  3.     JY.MyTick = 0
  4. ...
  5. ...
  6. ...
  7. 下略
复制代码
这跟内场景是一样的,所以也可以用上面的方法改

但是如果你在剧情里安插一段战斗的话,你就会发现,直接就跳出了。这里有三个障碍:
1)战斗主函数里面会调用到JY.SubScene这个全局变量来决定战斗后的音乐播放。如果人物在子场景内,JY.SubScene会被设置为场景编号。如果人物在大地图上,JY.SubScene会被设置为-1。在大地图上因为值是-1,战斗结束时会调用到一个nil值导致跳出

2)战斗主函数在战斗结束的时候会把贴图重设为子场景贴图,所以在大地图上战斗结束会出现诡异的情况

3)战斗主函数在初始化的时候会绘制当前的场景作为战斗地图,在大地图上的时候战斗场景会变成一片漆黑

解决方法:
1)WarMain函数里找到以下代码:
  1.   if 0 <= JY.Scene[JY.SubScene]["进门音乐"] then
  2.     PlayMIDI(JY.Scene[JY.SubScene]["进门音乐"])
  3.   else
  4.     PlayMIDI(0)
  5.   end
复制代码
改为:
  1.   if JY.SubScene ~= -1 and 0 <= JY.Scene[JY.SubScene]["进门音乐"] then
  2.     PlayMIDI(JY.Scene[JY.SubScene]["进门音乐"])
  3.   else
  4.     PlayMIDI(0)
  5.   end
复制代码
这里其实就是多加了一个场景判定,大地图状态下直接播放编号0的音乐

2)WarMain函数里找到以下代码:
  1.   lib.PicLoadFile(CC.SMAPPicFile[1], CC.SMAPPicFile[2], 0)
  2.   lib.PicLoadFile(CC.HeadPicFile[1], CC.HeadPicFile[2], 1)
  3.   if CC.LoadThingPic == 1 then
  4.     lib.PicLoadFile(CC.ThingPicFile[1], CC.ThingPicFile[2], 2)
  5.   end
  6.   JY.Status = GAME_SMAP
复制代码
改为:
  1.   if JY.SubScene ~= -1 then
  2.         JY.Status = GAME_SMAP
  3.         lib.PicLoadFile(CC.SMAPPicFile[1], CC.SMAPPicFile[2], 0)
  4.         lib.PicLoadFile(CC.HeadPicFile[1], CC.HeadPicFile[2], 1)
  5.         if CC.LoadThingPic == 1 then
  6.                 lib.PicLoadFile(CC.ThingPicFile[1], CC.ThingPicFile[2], 2)
  7.         end        
  8.   else
  9.         JY.Status = GAME_MMAP
  10.         lib.PicInit()
  11.     Init_MMap()
  12.     JY.SubScene = -1
  13.     JY.oldSMapX = -1
  14.     JY.oldSMapY = -1
  15.     lib.DrawMMap(JY.Base["人X"], JY.Base["人Y"], GetMyPic())
  16.     lib.GetKey()               
  17.   end
复制代码
这里也是加了个判定,大地图战斗结束后会重绘大地图

3)仍然是WarMain函数,找到以下代码
  1.   for i = 0, 63 do
  2.     for j = 0, 63 do
  3.       lib.SetWarMap(i, j, 0, lib.GetS(JY.SubScene, i, j, 0))
  4.       lib.SetWarMap(i, j, 1, lib.GetS(JY.SubScene, i, j, 1))
  5.     end
  6.   end
复制代码
在它的下面,加入:
  1.   if JY.Status == GAME_MMAP then
  2.         local randommap = math.random(100)
  3.         for i = 0, 63 do
  4.                 for j = 0, 63 do
  5.                         lib.SetWarMap(i, j, 0, lib.GetS(randommap, i, j, 0))
  6.                         lib.SetWarMap(i, j, 1, lib.GetS(randommap, i, j, 1))
  7.                 end
  8.         end        
  9.   end
复制代码
这个就是说,如果战斗是在大地图发生的,绘制随机一个场景编号1-100的地图作为战斗地图

基本上就是这样了,简单吧!

3. 后记
在这里引用一段hnc童鞋的话:
  1. 比如走碧血邪线,就可以添加玉真子的加入剧情,射雕结束可以在地图上碰到欧阳锋触发剧情,才能到华山学打狗棒、西毒杖,鸳鸯刀剧情也可以拓展出打劫鸳鸯刀的剧情,就连书剑的剧情也能拓展,比如正线结束就能在地图上随机遇到官兵或红花会,根据正邪不同接到不同的任务,或者在打败随机敌人后几率获得藏宝图(分个几份)什么的,然后就可以寻宝,到指定坐标使用铁铲获得宝藏之类的,可操作的余地就多了
复制代码
像我做的奇遇事件只是皮毛,场景随机事件其实有很大的潜力可挖。虽然在现有的游戏框架下有点困难,比如装备武功物品来来去去就是哪几样,就算被你捡到了也没啥新意。但是这可以作为新的mod的发展方向,比如向网游型发展啥的。这里就要靠各位英雄好汉的努力了。做出来后请发一份给我有木有,好歹也要对得起我码的这些字么...

4. 后记中的后记
前面这几段都可以跳着看了,下载8楼S大的附件,里面有兼容键盘和鼠标触发的简易方法,搜索随机事件,你看了就懂了= =...于是俺羞愧的遁了~

返回教程索引
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-19 06:59 | 显示全部楼层
捧场 加 支持!!!
    +谢谢贡献!!

点评

这个签名真牛啊!  发表于 2012-8-27 12:36
背面木有做呢 。。做出来当签名先的 。。手上有别的要画 所以 没时间画背面呢 。  发表于 2012-8-19 08:11
好帅的签名图,有背面图么 ><  发表于 2012-8-19 07:27
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-19 07:15 | 显示全部楼层
这个大地图任务系统确实蛮有趣的,要改的很多判定函数,
不过完善之后可以考虑屏蔽马车功能了
另外,不知道用鼠标操作会不会对概率有影响~

点评

小二,还得感谢t大解惑啊o(∩_∩)o  发表于 2012-8-26 13:20
才女你赢了,貌似那个函数还真的就跟鼠标移动坐标有关,鼓掌之  发表于 2012-8-26 13:18
我也觉得有可能是这样...  发表于 2012-8-19 08:49
哈 那看来在exe里了?  发表于 2012-8-19 08:42
我觉得那可能是因为移动计算上出了问题,貌似跟鼠标点击本身无关 = =  发表于 2012-8-19 08:40
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-19 08:22 | 显示全部楼层
收藏收藏~~~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-19 10:30 | 显示全部楼层
这个牛啊,支持教学贴,很喜欢楼主的山寨江湖
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-23 23:41 | 显示全部楼层
本帖最后由 hnc 于 2012-8-23 23:52 编辑

我有一种被鞭尸的感觉...再次表示完全看不懂~~下面这句
if keypress == VK_UP or keypress == VK_DOWN or keypress == VK_LEFT or keypress == VK_RIGHT then
   OEVENTLUA[30050]()
   OEVENTLUA[30011]()
end
是说啥意思?事件30011与事件30050有啥关系?

点评

哪些代码没明白,俺免学费丫。引用的位置是在nino_event.lua的第三行里,或者LDCR里面搜索CONFIG.ScriptPath,也可以用相同的方式插在那些文件之间  发表于 2012-8-25 11:06
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-8-25 08:57 | 显示全部楼层
回复 hnc 的帖子

俺怎么敢鞭您老人家的尸,只是拿出来游街示众而已...

那两个事件是完全木有关系的,上面那个是大地图任务的事件,下面那个是奇遇的事件,只是把他们放在同一个判定下而已,具体事件里面有额外的判定条件,你去看看nino_quest_event.lua就知道了

另外你终于肯研究代码了咩

点评

hnc
嗯,我想试试,可惜没看懂nino_quest_event的一些代码,比如就没看出怎么进行判定...我是到现在都没弄懂怎么引用nino_quest_event.lua文件的...  发表于 2012-8-25 10:40
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-26 12:36 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x

点评

老大文成武德泽被苍生千秋万载一统江湖,哦耶~  发表于 2012-8-26 13:26
T大指点迷津了~  发表于 2012-8-26 13:22
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-26 14:17 | 显示全部楼层
二宫大求教怎么在奇遇系统中引入领悟自创武功啊?武功威力可以基于资质声望所学武功等因素随机生成,可以自己定义名字自选招式范围光影特效等等。之前的苍半曾经有这个功能,蛮有意思的,不知道DIY实现起来是否困难。

点评

话说苍半原来有自创武功啊,我一点印象都没有了= =  发表于 2012-8-26 23:10
这个需要写个剧情,比如10本书之后遇到随机剧情然后领悟武功,然后武功的各种设置可以参考顶楼蓝大的教学贴 http://www.txdx.net/thread-504350-1-1.html  发表于 2012-8-26 23:09
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-26 23:52 | 显示全部楼层
本帖最后由 ibin 于 2012-8-27 00:39 编辑

027大的苍半源码jymodify.lua文件有定义CreatKf这个函数,好像是满足一定条件时随机某场战斗后领悟。但是我把那段代码拷贝到山寨版中用DIY运行会报错显示CreatKf这个变量未声明。我对编程属于一窍不通,完全不知道该怎么去debug,还望二宫大帮忙指点下,谢谢!

回复二宫大点评:
加了local后果然就可以了,多谢!
还有个疑问,为啥DIY让主角自带027特效用function T1LEQ(id)时就不需要在前面加local呢?

点评

另外我发现自创武功的攻击范围很诡异啊= =  发表于 2012-8-27 01:25
我试了一下可以使用啊,如果你是把函数放在DIY文件里的话,把function改成local function就好了  发表于 2012-8-27 00:13
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-8-27 01:25 | 显示全部楼层
回复 ibin 的帖子

貌似那是因为LDCR里面本身就有T1LEQ这个函数所以DIY可以直接加载覆盖那个函数,你把CreatKf放在LDCR里面试试就知道了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-27 18:06 | 显示全部楼层
回复 二宫和也 的帖子

明白了,多谢解惑!另自创武功的攻击范围取值是-1,貌似在蓝大那个教程里都没有定义。而且每次创出来的范围都不太一样,确实比较诡异。

点评

我也没看懂....= =...目前只知道攻击范围为-1的时候会读取5个“未知”来进行范围的判定....貌似那几个数在自创的时候是在一定范围内随机的,所以每次都会不一样  发表于 2012-8-27 20:47
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-27 18:19 | 显示全部楼层
小二教程每个都看了,都看不懂,哇哈哈哈哈哈
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-19 04:49

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表