|
本帖最后由 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,由于人一直在地图中心,所以- local dx=x2-x1
- local dy=y2-y1
- local x=CC.ScreenW/2+CC.XScale*(dx-dy)
- local y=CC.ScreenH/2+CC.YScale*(dx+dy)
复制代码 上诉代码最后的x,y即船应该显示于屏幕上的坐标
场景地图
场景地图由s文件和d文件共同决定
s文件的时间层引用了d文件数据,主要决定该点能都通过,以及该点的贴图,如果某点需要动态效果,则必须通过时间层引用d文件实现,最多可以实现3桢的动画,原版里的旗帜飘动一般都是用这个方法实现的
场景地图共6层 地面层 建筑层 空中层 事件层 建筑海拔 空中海拔
地面层,处于最下方,可以任意通行
建筑层,人不能通行,比较大的建筑一般为若干个贴图拼接起来,如果使用较大的贴图,其他部分依然是可以通过的
事件层,这里暂不讲解,留到以后做事件再说
建筑海拔,意为建筑层贴图显示时,额外提高的值。此值同时也作用于地面层。
举例而言,武道大会的高台,高台是地面层(如果是建筑层则人无法通行,因此只能是地面层),但是地面层一般都是平地,事实上高台的贴图本来也是用于平地的,故而需要设置建筑海拔,使该贴图显示时比地面要高,产生高台的效果。
但是,在lua版里,有以下两个问题,需要十分注意
1由于其实质依然是地面层,故而人可以任意通行,即能从高台下不通过台阶走到高台上.....
原版游戏里,是通过高台四周加建筑层栏杆,这样人就不能上来了,只能用过台阶
bt的复刻版里,限制了建筑海拔差如果过大,则不能通行
lua版可以修改SceneCanPass函数,在里面限制当前左边和目的坐标的海拔差,如果过大则不能通行- 在SceneCanPass中,加上以下代码
- local hb1,hb2
- hb1=GetS(JY.SubScene,JY.Base['人X1'],JY.Base['人Y1'],4)
- hb2=GetS(JY.SubScene,x,y,4)
- if math.abs(hb1-hb2)>14 then
- ispass=false
- end
-
复制代码 2显示问题。
这个必须先解释下lua版的绘图次序,首先绘制地面层,然后逐点绘制其它层
所以地面层是会被建筑层及卡层覆盖,而地面层完全不可能覆盖其他层
如果你设计的地图,有出现地面层(一般都是被提高了海拔)覆盖建筑层及其他的情况,虽然sfe里显示正常,但游戏里绝对有问题
解决的办法1 绘制地图时尽量回避
方法2,修改主程序源码,修改绘图次序
另外附上,大地图场景地图 遇到障碍物自动拐弯的方法- function newdirect(oldd)
- if oldd==-1 then
- return -1
- end
- local x,y
- if JY.Status==GAME_SMAP then
- x,y=JY.Base["人X1"],JY.Base["人Y1"]
- elseif JY.Status~=GAME_MMAP then
- x,y=JY.Base["人X"],JY.Base["人Y"]
- else
- return -1
- end
- local function CanMove(od1,od2) --判断某点是否可以到达,od1
- local nx,ny
- nx=x+CC.DirectX[od1+1]
- ny=y+CC.DirectY[od1+1]
- if od2~=nil then
- nx=nx+CC.DirectX[od2+1]
- ny=ny+CC.DirectY[od2+1]
- end
- if JY.Status==GAME_SMAP then
- if SceneCanPass(nx,ny) then
- return true
- end
- else
- if (lib.GetMMap(nx,ny,3)==0 and lib.GetMMap(nx,ny,4)==0) or CanEnterScene(nx,ny)~=-1 then
- return true
- end
- end
- return false
- end
- local d1,d2,d3
- d1=oldd
- if oldd==0 then
- d2=1
- d3=2
- elseif oldd==1 then
- d2=3
- d3=0
- elseif oldd==2 then
- d2=0
- d3=3
- elseif oldd==3 then
- d2=2
- d3=1
- end
- if CanMove(d1) then
- return d1
- elseif CanMove(d2) and CanMove(d1,d2) then--左边以前左前方点
- return d2
- elseif CanMove(d3) and CanMove(d1,d3) then--右边以及右前方点
- return d3
- else
- return d1
- end
- end
复制代码 加上此函数后,修改一下jymain里的Game_SMap()和Game_MMap()
修改的内容很简单,都是在读键值后加上一句direct=newdirect(direct)即可
战场地图
这个很简单,就是场景地图的简化版,只有地面层和建筑层
我个人基本都不管战斗地图的,而是直接把场景地图copy过来,作为战斗地图使用
具体的,只需要在战斗地图加载后,加上这几行代码- for i=0,63 do
- for j=0,63 do
- lib.SetWarMap(i,j,0,lib.GetS(JY.SubScene,i,j,0))
- lib.SetWarMap(i,j,1,lib.GetS(JY.SubScene,i,j,1))
- end
- end
复制代码 --未完待续
[ 本帖最后由 jy02785317 于 2010-2-26 20:45 编辑 ] |
|