本帖最后由 蓝烟清 于 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 具体的参数- --sceneid为子场景的编号
- JY.Scene[sceneid]["名称"] = “蓝烟清居”; --子场景的名称
- JY.Scene[sceneid]["出门音乐"] = 19; --离开子场景进入大地图后的音乐
- JY.Scene[sceneid]["进门音乐"] = 11; --进入子场景的音乐
- JY.Scene[sceneid]["进入条件"] = 0; --0可进入,1不可进入,如有特殊需要可以通过重写CanEnterScene函数实现进入条件的判断
- JY.Scene[sceneid]["外景入口X1"] = 86; --子场景在大地图入口的X坐标
- JY.Scene[sceneid]["外景入口Y1"] = 93; --子场景在大地图入口的Y坐标
- JY.Scene[sceneid]["外景入口X2"] = 85; --大地图上第二个入口X坐标
- JY.Scene[sceneid]["外景入口Y2"] = 93; --大地图上第二个入口Y坐标
- JY.Scene[sceneid]["入口X"] = 26; --进入子场景后所处的子场景X坐标
- JY.Scene[sceneid]["入口Y"] = 54; --进入子场景后所处的子场景Y坐标
- JY.Scene[sceneid]["出口X1"] = 26; --离开子场景的第一个X坐标
- JY.Scene[sceneid]["出口Y1"] = 55; --离开子场景的第一个Y坐标
- JY.Scene[sceneid]["出口X2"] = 27; --离开子场景的第二个X坐标
- JY.Scene[sceneid]["出口Y2"] = 55; --离开子场景的第二个Y坐标
- JY.Scene[sceneid]["出口X3"] = 28; --离开子场景的第三个X坐标
- JY.Scene[sceneid]["出口Y3"] = 55; --离开子场景的第三个Y坐标
- JY.Scene[sceneid]["跳转场景"] = 0; --从子场景跳转到其它子场景
- JY.Scene[sceneid]["跳转口X1"] = 16; --子场景跳转口的第一个X坐标
- JY.Scene[sceneid]["跳转口Y1"] = 30; --子场景跳转口的第一个Y坐标
- JY.Scene[sceneid]["跳转口X2"] = 16; --子场景跳转口的第二个X坐标
- JY.Scene[sceneid]["跳转口Y2"] = 31; --子场景跳转口的第二个Y坐标
复制代码 10.4 实例
10.4.1 马车传送加强版
马车传送功能相信大家不陌生,但是它有一个问题,必须要出到大地图才可以传送,在子场景不给使用,有时感觉有那么点不舒服。
自己做加强版的传送功能,不管在子场景或者大地图都可以使用,不仅如此还有更个性化的传送操作,呵呵。自己做的东西,自然要更符合自己的口味才行。
代码看起来很多,其实不复杂,都写有注释,这个功能目前只是一个雏形,希望通过这个雏形,你能够做自己属于自己的传送功能- ---------------------- 函数定义开始 --------------------------
- --自定义的进入子场景的函数
- --需要进入的子场景编号
- --x进入子场景后人物的X坐标,传入-1则默认为入口X
- --y进入子场景后人物的Y坐标,传入-1则默认为入口Y
- --direct人物面对的方向
- local function My_Enter_SubScene(sceneid,x,y,direct)
-
- JY.SubScene = sceneid;
- local flag = 1; --是否自定义的xy坐标, 0是,1否
- if x == -1 and y == -1 then
- JY.Base["人X1"]=JY.Scene[sceneid]["入口X"];
- JY.Base["人Y1"]=JY.Scene[sceneid]["入口Y"];
- else
- JY.Base["人X1"] = x;
- JY.Base["人Y1"] = y;
- flag = 0;
- end
-
- if direct > -1 then
- JY.Base["人方向"] = direct;
- end
-
- CleanMemory();
- lib.UnloadMMap();
- lib.PicInit();
- lib.ShowSlow(50,1)
- JY.Status=GAME_SMAP; --改变状态
- JY.MmapMusic=-1;
- JY.MyPic=GetMyPic();
-
- --外景入口是个难点,有些子场景是通过跳转的方式进入的,需要判断
- --由于目前最多只能有一个子场景跳转,所以不需要进行循环判断
- local sid = JY.Scene[sceneid]["跳转场景"];
-
- if sid < 0 or (JY.Scene[sid]["外景入口X1"] <= 0 and JY.Scene[sid]["外景入口Y1"] <= 0) then
- JY.Base["人X"] = JY.Scene[sceneid]["外景入口X1"]; --改变出子场景后的XY坐标
- JY.Base["人Y"] = JY.Scene[sceneid]["外景入口Y1"];
- else
- JY.Base["人X"] = JY.Scene[sid]["外景入口X1"]; --改变出子场景后的XY坐标
- JY.Base["人Y"] = JY.Scene[sid]["外景入口Y1"];
- end
- Init_SMap(flag); --重新初始化地图
-
- if flag == 0 then --如果是自定义位置,先传送到那个位置,再显示场景名称
- DrawStrBox(-1,10,JY.Scene[JY.SubScene]["名称"],C_WHITE,CC.DefaultFont);
- ShowScreen();
- WaitKey();
- end
-
- Cls();
-
- end
- --自定义离开当前子场景函数
- local function Leave_SubScene()
- if JY.SubScene > 0 then --如果当前是在子场景下
- if JY.Scene[JY.SubScene]["出口X1"] > 0 then --如果是大地图有入口
- JY.Base["人X1"] = JY.Scene[JY.SubScene]["出口X1"];
- JY.Base["人Y1"] = JY.Scene[JY.SubScene]["出口Y1"];
- else --如果是子场景跳转来
- JY.Base["人X1"] = JY.Scene[JY.SubScene]["跳转口X1"];
- JY.Base["人Y1"] = JY.Scene[JY.SubScene]["跳转口Y1"];
- end
- end
- return 1; --一定要返回1,不然菜单不会自动消失
- end
- --小村个性化传送菜单
- local function My_Home_Menu()
- local menu = {{"门口",nil,2},
- {"双儿面前",nil,1}
-
- };
-
- local r = ShowMenu(menu,2,0,450,20,0,0,1,1,CC.DefaultFont,C_ORANGE, C_WHITE);
-
- if r == 0 then
- return 0;
- end
- if r == 1 then --选择传送到门口
- My_Enter_SubScene(70, -1, -1, 2);
- elseif r == 2 then --选择传送到双儿面前
- My_Enter_SubScene(70, 8, 28, 0);
- end
-
- return 1;
- end
- --加强版传送地址菜单
- local function My_ChuangSong_Ex()
- local menu = {};
- for i=0, 105 do
- menu[i+1] = {i..JY.Scene[i]["名称"], nil, 1};
- end
-
- menu[70+1][2] = My_Home_Menu; --给小村传送做个性化处理
-
- local r = ShowMenu(menu,105,15,250,20,0,0,1,1,CC.DefaultFont,C_ORANGE, C_WHITE);
-
- if r == 0 then
- return 0;
- end
-
- if r > 0 then
-
- local sid = r-1;
-
- if JY.Scene[sid]["进入条件"] > 0 then
- Talk("您目前现在不能进入此场景", 0);
- return 1;
- end
-
- My_Enter_SubScene(sid,-1,-1,-1);
- end
-
- return 1;
- end
- ---------------------- 函数定义结束 --------------------------
- local menu = { {"马车传送加强版", My_ChuangSong_Ex, 2},
- {"移到出口",Leave_SubScene,1}
- };
- 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文件夹
|