铁血丹心

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

[lua复刻] 大地图行走时显示缩微小地图的源码

  [复制链接]
发表于 2010-7-2 17:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jy02785317 于 2010-8-18 11:05 编辑

代码如下。
使用时,需要在Game_MMap()函数中的lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],pic)指令后后面调用此函数。

  1. function DrawMMapMini()
  2.   local len=16;
  3.   for x=JY.Base["人X"]-len,JY.Base["人X"]+len do
  4.     for y=JY.Base["人Y"]-len,JY.Base["人Y"]+len do
  5.       local dx,dy;
  6.       local xx=x-JY.Base["人X"];
  7.       local yy=y-JY.Base["人Y"];
  8.       dx=CC.ScreenW-len*8+(xx-yy)*4;
  9.       dy=len*4+(xx+yy)*2;
  10.       if x==JY.Base["人X"] and y==JY.Base["人Y"] then
  11.         lib.FillColor(dx,dy,dx+5,dy+5,C_RED)
  12.       elseif x>=0 and y>=0 and x<=479 and y<=479 then
  13.         if lib.GetMMap(x,y,1)~=0 then
  14.           lib.Background(dx,dy,dx+4,dy+4,196)
  15.         elseif lib.GetMMap(x,y,2)~=0 then
  16.           lib.FillColor(dx,dy,dx+3,dy+3,RGB(0,128,0))
  17.         elseif lib.GetMMap(x,y,3)~=0 then
  18.           lib.FillColor(dx,dy,dx+3,dy+3,RGB(160,82,45))
  19.         elseif CC.MMapBoat[lib.GetMMap(x,y,0)]==1 then
  20.           lib.FillColor(dx,dy,dx+3,dy+3,RGB(65,105,225))
  21.         end
  22.       end
  23.     end
  24.   end
  25.   local Sce={};
  26.   for x=JY.Base["人X"]-len,JY.Base["人X"]+len do
  27.     for y=JY.Base["人Y"]-len,JY.Base["人Y"]+len do
  28.       local dx,dy;
  29.       local xx=x-JY.Base["人X"];
  30.       local yy=y-JY.Base["人Y"];
  31.       dx=CC.ScreenW-len*8+(xx-yy)*4;
  32.       dy=len*4+(xx+yy)*2;
  33.       if x>=0 and y>=0 and x<=479 and y<=479 then
  34.         local sid=CanEnterScene(x,y);
  35.         if sid>=0 and Sce[sid]==nil then
  36.           Sce[sid]=true;
  37.           local str=JY.Scene[sid]["名称"];
  38.           lib.FillColor(dx,dy,dx+3,dy+3,C_ORANGE);
  39.           lib.Background(dx-string.len(str)*4,dy+4,dx+string.len(str)*4,dy+20,128);
  40.           DrawString(dx-string.len(str)*4,dy+4,str,C_WHITE,16);
  41.         end
  42.       end
  43.     end
  44.   end
  45. end
复制代码

评分

参与人数 1声望 +15 收起 理由
KA + 15 好贴奖励

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-2 17:38 | 显示全部楼层
全指令半个注释都没有。。。

[发帖际遇]: KA客栈巧遇乔峰,与之对酒后付帐,花费银两39。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2010-7-2 17:44 | 显示全部楼层
不是很难理解吧。
我一般注释都是写给自己看的,防止以后想不起来某段代码或者某个变量是做什么的。

基本上分两段,前面是以主角坐标为中心取点,根据点的类型不同,绘制不同的颜色。
后一个部分,是绘制场景名,之所以拿出来,是为了保证场景名不会被小地图覆盖。另外考虑到一个场景可能有多个入口的情况,加了一个表Sce,用来记录已经绘制了场景名的场景。

[发帖际遇]: 竟然敢用假玄铁令求谢烟客办事!jy02785317被谢烟客痛殴一顿,丢失银子银两10两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-2 17:51 | 显示全部楼层
dx=CC.ScreenW-len*8+(xx-yy)*4;
dy=len*4+(xx+yy)*2;
学习

PS:
007是华为的吗?

[发帖际遇]: 夏海跟韦小宝赌钱,被韦小宝出千骗去银两9两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-2 19:36 | 显示全部楼层
没图没真相啊~

还有,根据点的不同,绘制不同颜色这做法本来就很有问题~
你事准备个完整的小图,然后根据人物坐标显示一部分不就行了?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2010-7-2 19:54 | 显示全部楼层

现在有图了

winson的方法固然好,但是需要事先准备图,
如果不是大地图,而是小地图的话,就会很麻烦,特别是如果游戏中修改了地图(虽然目前还没有哪个mod有在游戏中修改大地图)
取点的话,也不是就一定不好,其实很多颜色相近的贴图都在一块的。

当然,winson的方法显示效果肯定是最好的。

[发帖际遇]: jy02785317参加了一灯大师举办的《佛学交流大会》,因表现突出,被一灯大师点名表扬,增加声望3。

本帖子中包含更多资源

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

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-3 18:40 | 显示全部楼层
007大大好厉害啊,调用函数,一到这就头痛
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-3 19:03 | 显示全部楼层
这function是用哪一种语言写的啊?
怎么我没看过……

[发帖际遇]: Near告诉瑛姑是裘千仞杀害了她的儿子,得到瑛姑感激赠送银两3两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2010-7-3 19:09 | 显示全部楼层
回复 8# Near


    LUA
这是游泳的鱼制作的复刻版里使用的,除了图形引擎键盘IO,声音以及关键一些模块外,其它的都用LUA脚本实现
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-3 19:14 | 显示全部楼层
我真是孤陋寡闻,学了这么久programing竟还没听过,谢谢解答。

[发帖际遇]: Near跟踪成昆进入明教密道,结果:被秃驴发现打伤,损失医药费银两12。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-7-4 00:07 | 显示全部楼层
哦~看了图比想象中好多了~

有diablo2小地图的感觉哦~厉害厉害~

不过这种方法也只在大地图效果可以达到~

小地图贴图类型太多太杂,根本无法分类吧~

还有的就是~其实准备个小图也不是很麻烦的事情~要是制作Mod的话,整个mod100多个小图一晚上就够准备了吧~

[发帖际遇]: winson7891出门游玩没带钱,巧遇刚出大漠的郭靖,被郭靖慷慨地赠与银两21两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2010-7-4 09:32 | 显示全部楼层
我现在考虑 直接绘制小地图,嗯就是把贴图缩小后,再绘制一遍
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-2-2 16:31 | 显示全部楼层
额,请问路过的高手,此代码应该加到哪里?

1楼提到的
lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],pic)
这段代码在jymain.lua里出现过三次,不管插在这三段代码的哪一段后面都会出错,求高手指点。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-2-3 00:23 | 显示全部楼层
需要在Game_MMap()函数中的lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],pic)指令后后面调用此函数。

简单地说,
第一步,jymodify里把这段代码copy进去
第二部,在Game_MMap()函数中的lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],pic)指令后,换行,插入DrawMMapMini()这一句
第三部,进游戏看效果
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-2-3 16:57 | 显示全部楼层
LZ威武~~~~~~~

测试结果很完美~~~~

有点美中不足的是对手机版的支持不太好,可能是运算量过大,手机的CPU难以负荷,用诺记N78测试苍龙逐日的结果,大地图行走几乎是慢动作,要是能减少运算量的话就好了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-2-3 17:28 | 显示全部楼层
可以考虑减少地图大小,能有效降低计算量
代码里有一句len=16,可以考虑把16改小一点
另外也可以考虑隔点绘制,对地图质量略有降低,但是计算量大幅降低
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-2-3 21:29 | 显示全部楼层
本帖最后由 苍天泰坦 于 2011-2-12 17:10 编辑

感谢LZ指点,按你说的将16改为8后,速度明显提升,实际上以手机的320*240分辨率,这个数值刚刚好,而且走路的速度只比以前稍慢一点,完全在可以接受的范围内,不必再考虑隔点绘制的问题了。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-2-3 23:06 | 显示全部楼层
本帖最后由 苍天泰坦 于 2011-2-3 23:07 编辑

同样是jymain.lua,差距咋这么大呢,尝试在金庸原版加入失败,原版的jymain.lua里查找不到
lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],pic)
最接近的语句是
        lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],GetMyPic());             --显示主地图
这个语句共出现过四次,无论怎么尝试加入,结果不是小地图只在读档后显示一下就消失,要么就是小地图可以显示,人物走路速度为龟速,并且在三步之后整个屏幕变为绿色,这下彻底傻眼了,怎么办?

相关代码如下:
  1. function Game_Cycle()       --游戏主循环
  2.     lib.Debug("Start game cycle");

  3.     while JY.Status ~=GAME_END do
  4.         local t1=lib.GetTime();

  5.             JY.Mytick=JY.Mytick+1;    --20个节拍无击键,则主角变为站立状态
  6.                 if JY.Mytick%20==0 then
  7.             JY.MyCurrentPic=0;
  8.                 end

  9.         if JY.Mytick%1000==0 then
  10.             JY.MYtick=0;
  11.         end

  12.         if JY.Status==GAME_FIRSTMMAP then  --首次显示主场景,重新调用主场景贴图,渐变显示。然后转到正常显示
  13.                         lib.PicInit();
  14.                         CleanMemory();
  15.             lib.ShowSlow(50,1)

  16.                         lib.LoadMMap(CC.MMapFile[1],CC.MMapFile[2],CC.MMapFile[3],
  17.                             CC.MMapFile[4],CC.MMapFile[5],CC.MWidth,CC.MHeight);

  18.             lib.PicLoadFile(CC.MMAPPicFile,0);
  19.             lib.PicLoadFile(CC.HeadPicFile,1);
  20.             lib.PicLoadFile(CC.ThingPicFile,2);

  21.             PlayMIDI(16);
  22.             JY.Status=GAME_MMAP;
  23.             lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],GetMyPic());
  24.                         lib.ShowSlow(50,0);
  25.         elseif JY.Status==GAME_MMAP then
  26.             Game_MMap();
  27.                 elseif JY.Status==GAME_SMAP then
  28.             Game_SMap()
  29.                 end
  30.         local t2=lib.GetTime();

  31.                 if t2-t1<CC.Frame then
  32.             lib.Delay(CC.Frame-(t2-t1));
  33.             end
  34.         end
  35. end


  36. function Game_MMap()      --主地图
  37.     local direct = -1;
  38.     local keypress = lib.GetKey();
  39.     if keypress ~= -1 then
  40.             JY.Mytick=0;
  41.                 if keypress==VK_ESCAPE then
  42.                         MMenu();
  43.                         if JY.Status==GAME_FIRSTMMAP then
  44.                                 return ;
  45.                         end
  46.                 elseif keypress==VK_UP then
  47.                         direct=0;
  48.                 elseif keypress==VK_DOWN then
  49.                         direct=3;
  50.                 elseif keypress==VK_LEFT then
  51.                         direct=2;
  52.                 elseif keypress==VK_RIGHT then
  53.                         direct=1;
  54.                 end
  55.     end


  56.     local x,y;              --按照方向键要到达的坐标
  57.     if direct ~= -1 then   --按下了光标键

  58.         AddMyCurrentPic();         --增加主角贴图编号,产生走路效果
  59.         x=JY.Base["人X"]+CC.DirectX[direct+1];
  60.         y=JY.Base["人Y"]+CC.DirectY[direct+1];
  61.         JY.Base["人方向"]=direct;
  62.     else
  63.         x=JY.Base["人X"];
  64.         y=JY.Base["人Y"];

  65.     end

  66.         JY.SubScene=CanEnterScene(x,y)   --判断是否进入子场景

  67.     if lib.GetMMap(x,y,3)==0 and lib.GetMMap(x,y,4)==0 then     --没有建筑,可以到达
  68.         JY.Base["人X"]=x;
  69.         JY.Base["人Y"]=y;
  70.     end
  71.     JY.Base["人X"]=limitX(JY.Base["人X"],10,CC.MWidth-10);           --限制坐标不能超出范围
  72.     JY.Base["人Y"]=limitX(JY.Base["人Y"],10,CC.MHeight-10);

  73.     if CC.MMapBoat[lib.GetMMap(JY.Base["人X"],JY.Base["人Y"],0)]==1 then
  74.             JY.Base["乘船"]=1;
  75.         else
  76.             JY.Base["乘船"]=0;
  77.         end

  78.     lib.DrawMMap(JY.Base["人X"],JY.Base["人Y"],GetMyPic());             --显示主地图
  79.     if CC.ShowXY==1 then
  80.             DrawString(10,CC.Height-20,string.format("%d %d",JY.Base["人X"],JY.Base["人Y"]) ,C_GOLD,16);
  81.         end
  82.     ShowScreen();

  83.     if JY.SubScene >= 0 then          --进入子场景
  84.         CleanMemory();
  85.                 lib.UnloadMMap();
  86.         lib.PicInit();
  87.         lib.ShowSlow(50,1)

  88.                 JY.Status=GAME_SMAP;
  89.         JY.MMAPMusic=-1;

  90.             lib.PicLoadFile(CC.SMAPPicFile,0);
  91.             lib.PicLoadFile(CC.HeadPicFile,1);
  92.             lib.PicLoadFile(CC.ThingPicFile,2);


  93.         PlayMIDI(JY.Scene[JY.SubScene]["进门音乐"]);
  94.         JY.MyPic=GetMyPic();
  95.         JY.Base["人X1"]=JY.Scene[JY.SubScene]["入口X"]
  96.         JY.Base["人Y1"]=JY.Scene[JY.SubScene]["入口Y"]
  97.         JY.SubSceneX=0;
  98.         JY.SubSceneY=0;
  99.         JY.OldDPass=-1;
  100.         DrawSMap();
  101.         lib.ShowSlow(50,0)
  102.         lib.GetKey();
  103.                 DrawStrBoxWaitKey(JY.Scene[JY.SubScene]["名称"],C_WHITE,CC.DefaultFont);
  104.     end
  105. end


  106. function GetMyPic()      --计算主角当前贴图
  107.     local n;
  108.         if JY.Status==GAME_MMAP and JY.Base["乘船"]==1 then
  109.                 if JY.MyCurrentPic >=4 then
  110.                         JY.MyCurrentPic=0
  111.                 end
  112.         else
  113.                 if JY.MyCurrentPic >6 then
  114.                         JY.MyCurrentPic=1
  115.                 end
  116.         end

  117.         if JY.Base["乘船"]==0 then
  118.         n=CC.MyStartPic+JY.Base["人方向"]*7+JY.MyCurrentPic;
  119.         else
  120.             n=CC.BoatStartPic+JY.Base["人方向"]*4+JY.MyCurrentPic;
  121.         end
  122.         return n;
  123. end

  124. --增加当前主角走路动画帧, 主地图和场景地图都使用
  125. function AddMyCurrentPic()        ---增加当前主角走路动画帧,
  126.     JY.MyCurrentPic=JY.MyCurrentPic+1;
  127. end

  128. --场景是否可进
  129. --id 场景代号
  130. --x,y 当前主地图坐标
  131. --返回:场景id,-1表示没有场景可进
  132. function CanEnterScene(x,y)         --场景是否可进
  133.     for id = 0,JY.SceneNum-1 do
  134.                 local scene=JY.Scene[id];
  135.                 if (x==scene["外景入口X1"] and y==scene["外景入口Y1"]) or
  136.                    (x==scene["外景入口X2"] and y==scene["外景入口Y2"]) then
  137.                         local e=scene["进入条件"];
  138.                         if e==0 then        --可进
  139.                                 return id;
  140.                         elseif e==1 then    --不可进
  141.                                 return -1
  142.                         elseif e==2 then    --有轻功高者进
  143.                                 for i=1,CC.TeamNum do
  144.                                         local pid=JY.Base["队伍" .. i];
  145.                                         if pid>=0 then
  146.                                                 if JY.Person[pid]["轻功"]>=70 then
  147.                                                         return id;
  148.                                                 end
  149.                                         end
  150.                                 end
  151.                         end
  152.                 end
  153.         end
  154.     return -1;
  155. end
复制代码
还有一个出现在场景函数里,应该和本帖的代码无关吧
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-22 19:06

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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