铁血丹心

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

第十讲 场景数据操作

[复制链接]
发表于 2011-10-10 11:02 | 显示全部楼层 |阅读模式
本帖最后由 蓝烟清 于 2011-10-10 13:27 编辑


第十讲 场景数据操作


10.1     介绍与遗留问题
        本来想说战斗基本要素的,但是从头看了一下,场景没有专门的讲解,对于做剧情,场景的数据还是需要一定的了解的。场景其实也就是地图,分为两种,大地图和子场景。大地图1个,子场景目前有105个。
        学习目标:掌握场景数据的用途,最后我们做一个马车传送加强版
        遗留问题:暂无

10.2     数据定义
        JY.Scene={};        --场景数据
        JY.SubScene=-1;   --当前子场景编号,处于大地图时此值为-1
        JY.SubSceneX=0;  --当前在子场景的X坐标
        JY.SubSceneY=0;        --当前在子场景的Y坐标

10.3     具体的参数
  1.         --sceneid为子场景的编号
  2.         JY.Scene[sceneid]["名称"] = “蓝烟清居”;  --子场景的名称
  3.         JY.Scene[sceneid]["出门音乐"] = 19;  --离开子场景进入大地图后的音乐
  4.         JY.Scene[sceneid]["进门音乐"] = 11;  --进入子场景的音乐
  5.         JY.Scene[sceneid]["进入条件"] = 0;  --0可进入,1不可进入,如有特殊需要可以通过重写CanEnterScene函数实现进入条件的判断
  6.         JY.Scene[sceneid]["外景入口X1"] = 86;  --子场景在大地图入口的X坐标
  7.         JY.Scene[sceneid]["外景入口Y1"] = 93;  --子场景在大地图入口的Y坐标
  8.         JY.Scene[sceneid]["外景入口X2"] = 85;  --大地图上第二个入口X坐标
  9.         JY.Scene[sceneid]["外景入口Y2"] = 93;  --大地图上第二个入口Y坐标
  10.         JY.Scene[sceneid]["入口X"] = 26;  --进入子场景后所处的子场景X坐标
  11.         JY.Scene[sceneid]["入口Y"] = 54;  --进入子场景后所处的子场景Y坐标
  12.         JY.Scene[sceneid]["出口X1"] = 26;  --离开子场景的第一个X坐标
  13.         JY.Scene[sceneid]["出口Y1"] = 55;  --离开子场景的第一个Y坐标
  14.         JY.Scene[sceneid]["出口X2"] = 27;  --离开子场景的第二个X坐标
  15.         JY.Scene[sceneid]["出口Y2"] = 55;  --离开子场景的第二个Y坐标
  16.         JY.Scene[sceneid]["出口X3"] = 28;  --离开子场景的第三个X坐标
  17.         JY.Scene[sceneid]["出口Y3"] = 55;  --离开子场景的第三个Y坐标
  18.         JY.Scene[sceneid]["跳转场景"] = 0;  --从子场景跳转到其它子场景
  19.         JY.Scene[sceneid]["跳转口X1"] = 16;  --子场景跳转口的第一个X坐标
  20.         JY.Scene[sceneid]["跳转口Y1"] = 30;  --子场景跳转口的第一个Y坐标
  21.         JY.Scene[sceneid]["跳转口X2"] = 16;  --子场景跳转口的第二个X坐标
  22.         JY.Scene[sceneid]["跳转口Y2"] = 31;  --子场景跳转口的第二个Y坐标
复制代码
10.4     实例
10.4.1   马车传送加强版
        马车传送功能相信大家不陌生,但是它有一个问题,必须要出到大地图才可以传送,在子场景不给使用,有时感觉有那么点不舒服。
        自己做加强版的传送功能,不管在子场景或者大地图都可以使用,不仅如此还有更个性化的传送操作,呵呵。自己做的东西,自然要更符合自己的口味才行。
        代码看起来很多,其实不复杂,都写有注释,这个功能目前只是一个雏形,希望通过这个雏形,你能够做自己属于自己的传送功能
  1. ---------------------- 函数定义开始 --------------------------

  2. --自定义的进入子场景的函数
  3. --需要进入的子场景编号
  4. --x进入子场景后人物的X坐标,传入-1则默认为入口X
  5. --y进入子场景后人物的Y坐标,传入-1则默认为入口Y
  6. --direct人物面对的方向
  7. local function My_Enter_SubScene(sceneid,x,y,direct)
  8.         
  9.         JY.SubScene = sceneid;
  10.         local flag = 1;   --是否自定义的xy坐标, 0是,1否
  11.         if x == -1 and y == -1 then
  12.                 JY.Base["人X1"]=JY.Scene[sceneid]["入口X"];
  13.           JY.Base["人Y1"]=JY.Scene[sceneid]["入口Y"];
  14.   else
  15.           JY.Base["人X1"] = x;
  16.           JY.Base["人Y1"] = y;
  17.           flag = 0;
  18.         end
  19.         
  20.         if direct > -1 then
  21.                 JY.Base["人方向"] = direct;
  22.         end

  23.                         
  24.         CleanMemory();
  25.         lib.UnloadMMap();
  26.   lib.PicInit();
  27.   lib.ShowSlow(50,1)

  28.         JY.Status=GAME_SMAP;  --改变状态
  29.   JY.MmapMusic=-1;

  30.   JY.MyPic=GetMyPic();
  31.   
  32.   --外景入口是个难点,有些子场景是通过跳转的方式进入的,需要判断
  33.   --由于目前最多只能有一个子场景跳转,所以不需要进行循环判断
  34.   local sid = JY.Scene[sceneid]["跳转场景"];
  35.   
  36.   if sid < 0 or (JY.Scene[sid]["外景入口X1"] <= 0 and JY.Scene[sid]["外景入口Y1"] <= 0) then
  37.           JY.Base["人X"] = JY.Scene[sceneid]["外景入口X1"];  --改变出子场景后的XY坐标
  38.                 JY.Base["人Y"] = JY.Scene[sceneid]["外景入口Y1"];
  39.         else
  40.                 JY.Base["人X"] = JY.Scene[sid]["外景入口X1"];  --改变出子场景后的XY坐标
  41.                 JY.Base["人Y"] = JY.Scene[sid]["外景入口Y1"];
  42.         end


  43.   Init_SMap(flag);  --重新初始化地图
  44.   
  45.   if flag == 0 then    --如果是自定义位置,先传送到那个位置,再显示场景名称
  46.           DrawStrBox(-1,10,JY.Scene[JY.SubScene]["名称"],C_WHITE,CC.DefaultFont);
  47.                 ShowScreen();
  48.                 WaitKey();
  49.   end
  50.   
  51.   Cls();
  52.         
  53. end

  54. --自定义离开当前子场景函数
  55. local function Leave_SubScene()  
  56.         if JY.SubScene > 0 then                --如果当前是在子场景下
  57.                 if JY.Scene[JY.SubScene]["出口X1"] > 0 then                --如果是大地图有入口
  58.                         JY.Base["人X1"] = JY.Scene[JY.SubScene]["出口X1"];
  59.                         JY.Base["人Y1"] = JY.Scene[JY.SubScene]["出口Y1"];
  60.                 else      --如果是子场景跳转来
  61.                         JY.Base["人X1"] = JY.Scene[JY.SubScene]["跳转口X1"];
  62.                         JY.Base["人Y1"] = JY.Scene[JY.SubScene]["跳转口Y1"];
  63.                 end
  64.         end
  65.         return 1;        --一定要返回1,不然菜单不会自动消失
  66. end

  67. --小村个性化传送菜单
  68. local function My_Home_Menu()         
  69.         local menu = {{"门口",nil,2},
  70.                                                 {"双儿面前",nil,1}
  71.                
  72.         };
  73.         
  74.         local r = ShowMenu(menu,2,0,450,20,0,0,1,1,CC.DefaultFont,C_ORANGE, C_WHITE);
  75.         
  76.         if r == 0 then
  77.                 return 0;
  78.         end

  79.         if r == 1 then    --选择传送到门口
  80.                 My_Enter_SubScene(70, -1, -1, 2);
  81.         elseif r == 2 then   --选择传送到双儿面前
  82.                 My_Enter_SubScene(70, 8, 28, 0);
  83.         end
  84.         
  85.         return 1;
  86. end

  87. --加强版传送地址菜单
  88. local function My_ChuangSong_Ex()     
  89.         local menu = {};
  90.         for i=0, 105 do
  91.                 menu[i+1] = {i..JY.Scene[i]["名称"], nil, 1};
  92.         end
  93.         
  94.         menu[70+1][2] = My_Home_Menu;     --给小村传送做个性化处理
  95.         
  96.         local r = ShowMenu(menu,105,15,250,20,0,0,1,1,CC.DefaultFont,C_ORANGE, C_WHITE);
  97.         
  98.         if r == 0 then
  99.                 return 0;
  100.         end
  101.         
  102.         if r > 0 then        
  103.                
  104.                 local sid = r-1;
  105.                
  106.                 if JY.Scene[sid]["进入条件"] > 0 then
  107.                         Talk("您目前现在不能进入此场景", 0);
  108.                         return 1;
  109.                 end
  110.                
  111.                 My_Enter_SubScene(sid,-1,-1,-1);

  112.         end
  113.         
  114.         return 1;
  115. end
  116. ---------------------- 函数定义结束 --------------------------



  117. local menu = { {"马车传送加强版", My_ChuangSong_Ex, 2},
  118.                                                         {"移到出口",Leave_SubScene,1}

  119. };

  120. ShowMenu(menu,2,0,20,20,0,0,1,1,CC.DefaultFont,C_ORANGE, C_WHITE);
复制代码
实例图:


10.5     结束语
        本来计划是写战斗方面的,现在临时改变了计划,很抱歉。
        场景的了解对编写剧情是很有帮助的,比如你可以设置这么一段剧情:追小偷,从第一场景追到第二个场景,甚至第三场景。这样你的剧情发展就不再局限于单个场景内,也更有武侠的味道。
        我一直认为战斗只是MOD的一小部分,剧情和人物刻画和形象才是重点。编剧和美工在哪都受欢迎。
        另外现在要利用苍炎DIY功能做战斗效果,局限性很大,只能通过重写drawname函数进行修改,某位大神发现的。这个函数相当的蛋疼,本身的意思是绘画集气条上的名字,每个时序都会调用一次,在有人满集气时会调用两次(其中一次是把集气值定在1000),人在移动之后会调用,并且在有人被杀集气时也会被一直的调用。  另外还有一个更重要的问题是不知道满集气时人物进行的是什么操作。 所以要重写drawname函数需要考虑很多种情况,并且如此高频率调用的函数,如果太复杂必然极大的影响战斗性能。 DIY的我们也很无奈啊。

        此讲到此结束,下一个讲解还是做一个剧情实例吧,希望能给大家一点启发。不过编剧实力真不怎么样,想当年语文基本不及格的说。剧情现在还没开始着手,下一讲可能会迟一些再发出来。大部分还是使用白话文。

       本讲源码附件下载:
        
       以后发布的源码,都会以苍炎目录为主目录,目录中一般都包含script文件夹,有可能还会包含data文件夹

本帖子中包含更多资源

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

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-10-10 11:41 | 显示全部楼层
那个马车补丁local function My_Enter_SubScene(sceneid,x,y,direct)好像有点问题
话说
lib.UnloadMMap();
lib.PicInit();         
lib.ShowSlow(50,1)
是用来做什么的

点评

还是有点小问题,现在是最新版的,都已经改好。可以直接下附件  发表于 2011-10-10 12:52
感谢指出,在函数中sid改成sceneid 就可以了  发表于 2011-10-10 12:11
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-10-10 11:49 | 显示全部楼层
回复 冰糖戀 的帖子

自己凭感觉写的,可能昨晚写得比较匆忙,等会有时间我再测试一下代码
lib.UnloadMMap();
    清除主地图的结构文件,我是从lib.LoadMMap函数引入过来的,好像苍半源码也有用到

lib.PicInit(str)
    初始化贴图Cache。str为调色板文件。
    在转换场景前调用,清空所有保存的贴图文件信息
    第一次调用时需要加载调色板,以后就不需要了,设置str为空字符串即可。


lib.ShowSlow(t,flag)
    把表面缓慢显示到屏幕
    t 为亮度没变化一次的间隔毫秒数。为了16/32位兼容,一共有32阶亮度变化。
    flag: 0 从暗到亮,1 从亮到暗


你有苍半的源码,看一下instruct_13和instruct_14函数就明白了

函数的说明,可以参数我的第六讲,你下载附件。里面有lib库函数的说明

点评

谢谢 支持楼主~  发表于 2011-10-10 18:03
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-19 23:16 | 显示全部楼层
回复 cxyelu 的帖子

这个要在Game_MMAP函数做是否有按键的处理。 详细可以下载最新发布的版本,里面有相关的代码
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-19 22:33 | 显示全部楼层
怎么给JY_SDL_Lua_0.66_release添加马车系统啊?我添加了一个,能够进子场景,比方说胡斐居,但是出来到大地图后自动又进入胡斐居了,不像苍龙逐日什么的其他版本,出来后尽管站在场景变换坐标,但是苍龙逐日或者其他版本就不会自动再次进入子场景。不知道是什么原因,或者说,是JY_SDL_Lua_0.66_release这个原版就添加不了?整了几天了,没搞定,求指教
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-23 20:55

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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