铁血丹心

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

[通用] 略谈LUA版修改2

[复制链接]
发表于 2010-2-26 20:04 | 显示全部楼层 |阅读模式
本帖最后由 jy02785317 于 2010-8-18 11:13 编辑

==============================================================================================
前言
==============================================================================================
1,以下内容适用于游泳的鱼制作的金庸群侠传LUA复刻版,部分内容亦适用于金庸群侠传原版(DOS版)以及weyl制作的金庸群侠传passcal复刻版
2,以下所使用的修改工具为游泳的鱼制作的FishEdit_lua版,也有用到黄顺坤制作的sfe
3,以下内容侧重于制作mod,对于工具的使用不详加解释。如需进一步讲解,请参考其他文章或者直接联系工具的作者
4,修改时请注意多多备份,若按照以下内容,使您的作品出现了异常,我也无能为力

==============================================================================================
编辑地图
==============================================================================================
三类地图 大地图 场景地图 战斗地图
总的来说lua版和其他版本没区别
当然游戏中处理方式有一些差异,以下会根据需要涉及
[大地图]
在fishedit里可以看到,一共分四层:地面 表面 建筑 引用建筑
地面层不拦路,人可以通行,当然还要区分是否是水面,lua版里默认水上漂,水面不拦路,只是根据玩家当前所处的位置,来判断玩家是行走还是乘船
表面层不拦路,多为地面上的道路或者小石子
建筑层拦路,人不能通过,需要注意的是,向大地图添加建筑后,只有那一个坐标点的建筑层有数据。
  但是,打击应该注意到,游戏里的建筑通常比较大,其面积远远超出一个坐标的面积,所以此建筑其他部分,依然可以通行,为了解决此问题,需要用到下一层 引用建筑
引用建筑,即表示该点为此建筑的一部分
如图,此为刚刚添加了贴图到建筑层坐标216,215的情况,只显示引用建筑层
在216,215单击左键,可以发现跟随鼠标的0,0变成了216,215
在改建筑其他点点右键,设置其引用建筑

虽然建筑已经添加,但是也仅仅只是一个阻止人移动的障碍物而已,如果需要能从它进入一个场景,则需要修改r文件,这里和普通金群修改完全一样,不详细说明

lua版由于默认水上漂,所以如果想改成原版那样需要上船下船反而有点麻烦。整理下有这几条规则
1非乘船状态,不能移动到水面,但是可以移动到船的坐标上,同时状态改为乘船
2乘船状态,只要没有建筑拦路,可以任意移动(同时修改人和船的坐标),但是如果到了地面上,则状态改为行走,不修改船的坐标
另外呢,lua版默认就不显示船(人不在船上的情况),所以需要做个修改
方法1,修改主程序源码,重新编译,这里不详加解释
方法2,在指令lib.DrawMMap后显示船,首先判断船的坐标和人的坐标差,小于一定范围才显示
设人坐标x1,y1,船坐标x2,y2,由于人一直在地图中心,所以
  1. local dx=x2-x1
  2. local dy=y2-y1
  3. local x=CC.ScreenW/2+CC.XScale*(dx-dy)
  4. local y=CC.ScreenH/2+CC.YScale*(dx+dy)
复制代码
上诉代码最后的x,y即船应该显示于屏幕上的坐标

场景地图
场景地图由s文件和d文件共同决定
s文件的时间层引用了d文件数据,主要决定该点能都通过,以及该点的贴图,如果某点需要动态效果,则必须通过时间层引用d文件实现,最多可以实现3桢的动画,原版里的旗帜飘动一般都是用这个方法实现的
场景地图共6层 地面层 建筑层 空中层 事件层 建筑海拔 空中海拔
地面层,处于最下方,可以任意通行
建筑层,人不能通行,比较大的建筑一般为若干个贴图拼接起来,如果使用较大的贴图,其他部分依然是可以通过的
事件层,这里暂不讲解,留到以后做事件再说
建筑海拔,意为建筑层贴图显示时,额外提高的值。此值同时也作用于地面层。
  举例而言,武道大会的高台,高台是地面层(如果是建筑层则人无法通行,因此只能是地面层),但是地面层一般都是平地,事实上高台的贴图本来也是用于平地的,故而需要设置建筑海拔,使该贴图显示时比地面要高,产生高台的效果。
  但是,在lua版里,有以下两个问题,需要十分注意
1由于其实质依然是地面层,故而人可以任意通行,即能从高台下不通过台阶走到高台上.....
原版游戏里,是通过高台四周加建筑层栏杆,这样人就不能上来了,只能用过台阶
bt的复刻版里,限制了建筑海拔差如果过大,则不能通行
lua版可以修改SceneCanPass函数,在里面限制当前左边和目的坐标的海拔差,如果过大则不能通行
  1. 在SceneCanPass中,加上以下代码
  2.         local hb1,hb2
  3.         hb1=GetS(JY.SubScene,JY.Base['人X1'],JY.Base['人Y1'],4)
  4.         hb2=GetS(JY.SubScene,x,y,4)
  5.         if math.abs(hb1-hb2)>14 then
  6.                 ispass=false
  7.         end
复制代码
2显示问题。
这个必须先解释下lua版的绘图次序,首先绘制地面层,然后逐点绘制其它层
所以地面层是会被建筑层及卡层覆盖,而地面层完全不可能覆盖其他层
如果你设计的地图,有出现地面层(一般都是被提高了海拔)覆盖建筑层及其他的情况,虽然sfe里显示正常,但游戏里绝对有问题
解决的办法1 绘制地图时尽量回避
方法2,修改主程序源码,修改绘图次序

另外附上,大地图场景地图 遇到障碍物自动拐弯的方法
  1. function newdirect(oldd)
  2.         if oldd==-1 then
  3.                 return -1
  4.         end
  5.         local x,y
  6.         if JY.Status==GAME_SMAP then
  7.                 x,y=JY.Base["人X1"],JY.Base["人Y1"]
  8.         elseif JY.Status~=GAME_MMAP then
  9.                 x,y=JY.Base["人X"],JY.Base["人Y"]
  10.         else
  11.                 return -1
  12.         end
  13.         local function CanMove(od1,od2)  --判断某点是否可以到达,od1
  14.                 local nx,ny
  15.                 nx=x+CC.DirectX[od1+1]
  16.                 ny=y+CC.DirectY[od1+1]
  17.                 if od2~=nil then
  18.                         nx=nx+CC.DirectX[od2+1]
  19.                         ny=ny+CC.DirectY[od2+1]
  20.                 end
  21.                 if JY.Status==GAME_SMAP then
  22.                         if SceneCanPass(nx,ny) then
  23.                                 return true
  24.                         end
  25.                 else
  26.                         if (lib.GetMMap(nx,ny,3)==0 and lib.GetMMap(nx,ny,4)==0) or CanEnterScene(nx,ny)~=-1 then
  27.                                 return true
  28.                         end
  29.                 end
  30.                 return false
  31.         end
  32.         local d1,d2,d3
  33.         d1=oldd
  34.         if oldd==0 then
  35.                 d2=1
  36.                 d3=2
  37.         elseif oldd==1 then
  38.                 d2=3
  39.                 d3=0
  40.         elseif oldd==2 then
  41.                 d2=0
  42.                 d3=3
  43.         elseif oldd==3 then
  44.                 d2=2
  45.                 d3=1
  46.         end
  47.         if CanMove(d1) then
  48.                 return d1
  49.         elseif CanMove(d2) and CanMove(d1,d2) then--左边以前左前方点
  50.                 return d2
  51.         elseif CanMove(d3) and CanMove(d1,d3) then--右边以及右前方点
  52.                 return d3
  53.         else
  54.                 return d1
  55.         end
  56. end
复制代码
加上此函数后,修改一下jymain里的Game_SMap()和Game_MMap()
修改的内容很简单,都是在读键值后加上一句direct=newdirect(direct)即可
战场地图
这个很简单,就是场景地图的简化版,只有地面层和建筑层
我个人基本都不管战斗地图的,而是直接把场景地图copy过来,作为战斗地图使用

具体的,只需要在战斗地图加载后,加上这几行代码
  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
复制代码
--未完待续

[ 本帖最后由 jy02785317 于 2010-2-26 20:45 编辑 ]

本帖子中包含更多资源

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

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-2-26 20:27 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-2-26 23:55 | 显示全部楼层
厉害~~到底要写多少个~~

不过LZ有心了,支持!

[发帖际遇]: winson7891当选为年度“赏善罚恶”大使,路过荆州城,罚凌退思获得银两29。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-3-1 12:16 | 显示全部楼层
唐浩强的《C语言》
027的《LUA语言》
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-5-6 19:18

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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