




免费预览已结束,剩余8页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-ZBM一、 TLBB添加新地图,步驟如下:1. 在资源文件里的Server ConfigCofigInfo.ini 把变量SystemMode1 设为1 因为该变量在服务器有个判断,当SystemMode1 为0,只加载10张地图;当SystemMode1为1,就根据当前文件夹里的SceneInfo.ini里的 scenenumber 加载多少张地图。(这个步骤可以省略,当你在SceneInfo.ini,替换前十张地图的变量file)2. 记住新地图的格式在SceneInfo.ini 格式要求如下:scene0threadindex=0;驱动线程的索引name=洛阳;场景名字active=1;场景是否激活file=newScene.scn;场景文件名serverId=0;此场景是由哪个服务器端程序调用的type=0; 场景类型, 如果是0,表示普通游戏场景,如果是1表示副本3. 在资源文件里的ClientConfig SceneDefine.txt根据格式 替换或者增加 (你们懂的,就像下面这样的格式)IDServerIDCityLevelNameXsizeZsizeFairyRegionBuildMiniMapBackSoundSceneMapPosXPosYNamePosXNamePosYSceneLevelNameNomalImageSetNameNomalImageNameHoverImageSetNameHoverImage000洛阳320320newScene.ScenenewScene.regionnewScene.wCollisionnewScene.jpg18daliscene590394590414Sign5MiniMap_Icon2LuoYang_NormalMiniMap_Icon2LuoYang_Hover下面是需要更换的格子:CityLevelNameXsizeZsizeFairyRegionBuildMiniMapBackSoundSceneMap PosX PosYNamePosX NamePosYSceneLevelNameNomalImageSetNameNomalImage其中,SceneMap格式-是需要一系列像这样的-图1.0建议: 你复制其他地图的。比如daliscene4. 打开Scene里的地图文件,发现一个SCN格式的文件,里面是navmapname=newScene.navmonsterfile=newScene_monster.inipatrolpoint=newScene_patrolpoint.inigrowpointdata=newScene_growpoint.txtgrowpointsetup=newScene_growpointsetup.txteventfile=newScene_area.inipetfile=newScene_pet.iniplatformfile=newScene_platform.inistallinfodata=newScene_StallInfo.stall但是 有的不能从地图编辑器生成这些文件,所以,你还得添加这些文件,怎么添加呢?从其他的地图文件(原来的),复制改下名,当然了,你也需要一个scn的文件,就像上面一样。(下面会有需要增加的文件数量) 下面是从地图编辑器生成一个新场景后,生成的文件xinchangjing.Dijkstra?xinchangjing.GridInfo地表信息 (每个点的位置,UV,法线,材质)xinchangjing.Heightmap高度图xinchangjing.nav乱码xinchangjing.Region寻路方式(已经放弃,改用.path)xinchangjing.Scene 有对应的.Terrain的文件路径,环境光,静态模型,树、建筑物等xinchangjing.Terrain封装了地图的内容,里面是对一个地图所需要的内容.GridInfo、Heightmap、texture、material文件的路径xinchangjing.Wcollision碰撞, 调整人物高度(y值)xinchangjing_area.ini区域(长方形),作用?xinchangjing_growpoint.txt?INT INT FLOAT FLOAT 什么意思xinchangjing_monster.ini地图上Object对象定义(看下面相关1)xinchangjing_patrolpoint.ini可操作台,传送门、打造台、缝纫台、工艺台xinchangjing_StallInfo.stall乱码相关1:scene里的dali_monster.iniinfomonstercount=134共有几个例子monster0第几个NPCguid=1986678全局IDtype=193类型(还有疑问)name=崔逢九名字title=驿站老板标题,就是称谓pos_x=241.3763X坐标pos_z=136.5375Y方向dir=27坐标script_id=2026关联的脚本IDrespawn_time=1000自杀换人?重新执行?多少帧渲染?group_id=-1团队IDteam_id=-1队伍IDbase_ai=3AI程度ai_file=0AI文件patrol_id=-1巡逻ID?shop0=-1关联商店0?shop1=-1关联商店1?shop2=-1关联商店2?shop3=-1关联商店3?ReputationID=-1名声?名誉?level=-1等级npc=1?camp=8阵营补充:你如果看其他的_monster.ini,会发现写的变量挺多不一样的,有的可忽略。下面是一个完整地图所需要的文件,图1.1记得把你的(1.地图编译器的生成文件 + 2.对照着原本地图添加的文件)这些文件放入 资源_天龙版PublicScene里面需要增加的文件是:多了.scn文件、.jpg(?)、lightmap(光照)、pet(宠物)、_monster.preload(NPC所需要的obj文件)、.scnscnee.jpg(小地图)5. 还得在在资源文件里的Server Config DefaultChar.ini 该文件是你新生成的角色的初始内容,下面是其实场景 camp_0scene=0;起始场景pos_x=130.0;起始位置Xpos_z=130.0;起始位置Zcamp_1scene=0;起始场景pos_x=130.0;起始位置Xpos_z=130.0;起始位置Z修改 2个起始场景 对应 你在第1步骤里填写的ID,例如 洛阳是0scene0threadindex=0;驱动线程的索引name=洛阳;场景名字做完这几步骤,当你进入游戏,就是一个由你自己设定的那个地图的样子了。二、 客户端代码地图加载器解析:分析:浮出水面的这样几个文件,A :ClientConfigSceneDefine.txt-突破口一B :publicscene 里相关地图的那些内容,(看上面的图1.1,完整的地图所需要文件)-突破口二C :ServerConfigSceneInfo.ini-服务器的,张师傅的活,直接咔嚓顺便啰嗦几句:A SceneDefine.txt里面主要的是这些内容INTnLocalID;INTnServerID;/ - ServerID is here!INTnCityLevel;LPCSTRszName;INTnXSize;INTnZSize;LPCSTRszWXObjectName;LPCSTRszRegionFile;LPCSTR szCollisionfile;/ 建筑物行走面文件。碰撞LPCSTRszMiniMap;INTnBackSound;LPCSTR szSceneMap;INTnWroldMapPosX;INTnWroldMapPosY;/ 场景图标所在得位置INTnNameWroldMapPosX;INTnNameWroldMapPosY;/ 场景名字所在得位置LPCSTRszSceneType;/ 场景得图标等级LPCSTRszCityNameNormalImageSet;/ 场景正常名字所用得图片资源LPCSTRszCityNameNormalImage;/ 场景正常名字所用得图片资源LPCSTRszCityNameHoverImageSet;/ 场景高亮名字所用得图片资源LPCSTRszCityNameHoverImage;/ 场景高亮名字所用得图片资源-图2.0题外:这些是在Client里的WXEngineDataBaseTDDBC_Struct.h里一个结构类型_DBC_SCENE_DEFINE-场景定义怎么找到的呢?在Client 搜索SceneDefine.txt重要结果就是下面的这行 DBC_SCENE_DEFINE,SceneDefine.txt,这是一个另一个结构体_DATABASE_DEFINE数组里的元素。透过该行,其实程序就是用这个结构体,去解析文件。就是拿这个瓢去装水。因为该txt文件 都是一个固定格式的,刚好这个结构体对应。这样结构体就存着文件里的信息。当然了,肯定还有一个函数,封装了无论怎么样的结构体都能对对应的文件解析。重点:上面的红色LPCSTRszWXObjectName;指的地图的.Scene文件。而.Scene文件里,重要的是就是一个.Terrain的路径,封装了.Terrain。而.Terrain文件里,重要的是 明白了吧。有.Heightmap与.GridInfo的路径,名字、大小、纹理等信息。.Heightmap,高度图,.GridInfo 则是一个记录地表信息的文件。因为是二进制的,所以看不到,不过,百度说是-每个点的位置,UV,法线,材质。就相信它吧。.Terrain文件大小等数据.GridInfo文件.Heightmap文件.region文件.WCollision文件.scene文件SceneDefine.txt结论:现在应该有一个这样的概念,.lightmap文件、小地图文件等地表纹理文件-图2.1所以我们在标题一.TLBB添加新地图里,需要那些步骤,都是有凭有据的。细心的同学,会发现手动添加的.scn文件,没有在这出现。.scn唯一出现在ServerConfigSceneInfo.ini里面,这是在服务器的配置文件。先放放,相信张师傅肯定能解疑的。这些文件作用,具体参考上面和标题一.TLBB添加新地图里的 第4步骤。了解了图2.0,不难 发现,那么操作SceneDefine,就操作了整个地图所需要的内容。而且在上面也提到过,在Client里的WXEngineDataBaseTDDBC_Struct.h里与之相关的是一个结构类型_DBC_SCENE_DEFINE-场景定义等于说,程序对结构体对象赋值,然后再调用结构体对象,就能调出所对应地图的所有信息了。有了一张完整地图所需要的信息,程序里又能索引到这些信息文件,那么程序又是怎么样,从这些文件获取更重要的信息,来组建程序里的地形类呢?线索入手:在代码里搜索_DBC_SCENE_DEFINE (因为这是地图文件的程序入口)在WXClientworldScene.cpp 类SceneScene类的作用:是围绕着成员变量const _DBC_SCENE_DEFINE* m_pTheDefine;通过这个场景定义结构,解析地图所需要的文件,加载重要的信息(看下面的重要函数),然后构成一个场景。注意:不明白这个场景定义结构,见上面的图2.0TLBB里面,一个场景有这些内容的:A网格CZONE(用来把场景分割分成一个屏幕大小,便于管理)BRegion 用来在CZONE注册,来表示不可行走区域。(.Region文件,用来寻路)C可行走面。(.Wcollision文件,建筑的行走面,例如桥?等)D环境音效 -有音效,那肯定也有相应的管理,比如声大声小E如果是玩家城市,还得加载玩家建筑数据F地形 (.Terrain文件)GNPC资源重要函数:1. 初始化场景 - 函数VOID CScene:Initial(VOID)a) 构建网格 CZONE。注意:这里的网格,不是mesh的顶点网格,更不是地形的网格。而是将整个游戏场景分割成固定大小的网格,每个网格单位为一个Zone,一个Zone的大小跟一个屏幕的大小类似。当然场景定义结构里(图2.0),INTnXSize;INTnZSize;这2个参数决定CZONE的大小。-图2.2 CLientConfig SceneDefine.txt320? 当然不会这么大。看这个函数里。m_nZoneXSize = pSceneDefine-nXSize / SIZE_OF_ZONE;而且在头文件定义,enum SIZE_OF_ZONE = 10 ;/Zone的大小故洛阳、苏州、大理的场景就是32*32的ZONE (也是挺大的。) b) 加载RegionRegion,不可行走区域。1) 先放入到Region链表std:vectorm_theRegion; 2) 再全部都注册到CZONE上的。(RegisteAllRegion();)3) 加载.Dijkstra文件(LoadDijk();)-Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。c) 加载可行走面 m_WalkCollisionMng.LoadCollisionTriInfoFromFile(m_pTheDefine-szCollisionfile);类成员变量CBuildingCollisionMngm_WalkCollisionMng; 在WXCLientBuilding_CollisionMng CbuildingCollisionMng.h有定义CbuildingCollisionMng,这是一个类,1.用来加载. .Wcollision文件,2.传入平面x、z坐标,得到高度。3.判断该建筑物是否有行走面4.清空数据d) 加载环境音效-这个就先放放,0e) 如果是玩家城市,还得加载玩家建筑数据- 这个好像荒废很久,我看玩家城市都没2. 进入场景 - 函数VOIDEnterScene(VOID);a) 在渲染层创建地形,加载场景文件(.scene文件)CGameProcedure:s_pGfxSystem-Scene_Load(m_pTheDefine-nLocalID, m_pTheDefine-szWXObjectName);用的是对象CGameProcedure:s_pGfxSystem(图形输出系统CrenderSystem的指针)传入2个参数,分别是本地ID,和.scene文件名,到CrenderSystem的函数Scene_Load1. 卸载所有资源 2. 加载场景文件(.scene文件)m_pRenderSystem-loadSceneFromResource(&parserExpat,theSceneDefine.c_str(), General);这个函数还不是最底层的函数,我一层一层往下查找定义,到最后面。WXCoreSource FilesWXSceneInfo.cppvoid SceneInfo:load(XMLParser* parser, const String& filename, const String& groupName, bool completely) -该函数的2个主要操作如下:一 加载静态模型SceneSerializer serializer;serializer.load(this, parser, filename, groupName)WxCoreSource filesWXSceneSerializer.cppVoid SceneSerializer:load(Scene* scene, XMLParser* parser, const String& filename, const String& groupName)二 加载TerraingetTerrainData()-load(parser, mTerrainFilename, groupName, completely);WXCoreSource FilesTerrainData.cpp TerrainData:load(XMLParser* parser, const String& filename, const String& groupName, bool loadLightmap)该函数的操作如下:a Clear old data-清空旧资源b Parse the terrain file-解析terrain文件c Setup derived fields-安装衍生字段?d Validate the terrain file -验证terrain文件e Load heightmap-加载高度图f Load gridinfo-加载地表信息gridinfo (各个顶点的位置 纹理坐标等)g Load lightmap-加载高光图说明:加载静态模型与地形的时候,都用到了String& groupName程序参数写的是“General”,如果了解Ogre,知道Ogre有个资源组管理器ResourceGroupManager,它是通过分组管理资源(看下面的补充)。在一些Ogre例子里,你能看到resources.cfg 的文件-图2.3在TLBB的WXResources.cfg里 -图2.4General 里有.obj的文件路径 也有scene地图文件的路径即在资源管理器的General组里面找到模型、地形文件,然后加载。其中类TerrainData 储存地形数据类SceneSerializer储存模型数据3. 释放未使用资源这里用到了Ogre的资源组管理器ResourceGroupManager,用于释放未使用的资源。补充:资源组管理器(ResourceGroupManager)实际上是提供加载纹理(Textures)、网格(Meshes)等可重用资源的“集线器(Hub)”。使用它,你可以将你用到的资源进行分组,并且,这些资源可以根据你的需要加载或删除。资源组管理器(ResourceGroupManager)中包括了大量的资源管理器(ResourceManagers),每个资源管理器(ResourceManagers)分管某类资源,比如纹理管理器(TextureManager)、网格管理器(MeshManager)。这儿所谓的资源是指OGRE运行时需要加载的数据。 4. 设置LightMap5. 取得环境特效b) 预加载所有NPC资源加载的是_monster.preload(看来NPC资源在该文件。打开是一些.obj,看来这就是NPC的模型。)/*_monster.preloadstrncat(szPreLoadFile, _monster.preload, MAX_PATH);CGameProcedure:s_pGfxSystem-Scene_PreLoad(szPreLoadFile);用的是对象CGameProcedure:s_pGfxSystem(图形输出系统CrenderSystem的指针),传入参数是_monster.preload文件名到该函数Scene_PreLoad。该函数是最底层的,用于在资源管理组的“General”加载_monster.preload文件。补充说下:_monster.reload文件里面的内容是:例如- dali_monster.preload:-图2.5很简单的排列方式,只要按着一行一行读,就好了。c) 播放背景音乐补充:EnterScene函数 只是预加载NPC的obj模型文件,真正摆设这些NPC位置,或者给NPC赋值(名字,阵营,等级,lua脚本关联ID等),都是在地图文件dali_monster.ini里面.结论:通过initial函数,EnterScene函数,程序就加载了一个ZONE分割的有地形、静态模型(包括NPC模型)、环境音效的完整场景。这只是加载!然后,通过加载,类TerrainData 有地形数据类SceneSerializer 有模型数据-(被类SceneInfo封装)。猜测:至今为止,我们看到了 解析地图文件-加载地图文件获得地形、模型数据那创建呢?既然TLBB用到了Ogre,应该用到Ogre的场景管理器.加载的地形直接用Ogre的创建地形.加载的静态模型也直接用Ogre的scenenode挂接管理.可是封装Ogre的场景管理器究竟是哪个类呢?下面是结论与猜测为基础的 分析图。-图 2.6Scene类Initial 函数a) 构建网格 CZONE。b)加载Regionc)加载可行走面 d)加载环境音效e)如果是玩家城市,还得加载玩家建筑数据EnterScene 函数在渲染层加载地形与预加载NPC资源.调用图形渲染系统CrenderSystemScene_LoadScene_PreLoad这2个函数Ogre渲染场景Ogre:Root:getSingleton().renderOneFrame();图形渲染系统CRenderSystem-图2.7Scene_Load 加载场景Ogre资源组管理ResourceGroupManager在组“General”加载资源现在有模型数据SceneSerializer地形数据TerrainData详看上面的加载。Word第7页场景定义_DBC_SCENE_DEFINE见图2.0Ogre 场景管理器SceneManager(在这创建地形与模型,暂时没发现如何创建)Scene_PreLoad 预加载场景在这里是加载NPC的OBJ文件,是利用XML来读取的,也是用Ogre资源组 在组“General” 加载资源。现状:加载场景有了,场景数据(模型数据,地形数据)也有了,那创建呢?-Ogre渲染对象是在场景管理器完成的。那现在我们的目标就是找出场景的创建,和 Ogre场景管理器。后来,我发现我忽略了一个地方。在图形渲染系统CrenderSystem 里的Scene_Load(加载场景)-该函数在Scene里的EnterScene函数调用第二步骤:加载场景文件详见上面的EnterScene(word第7页)m_pRenderSystem-loadSceneFromResource(&parserExpat, theSceneDefine.c_str(), General);WX:System* m_pRenderSystem,是一个system的指针。loadSceneFromResource定义如下:Void System:loadSceneFromResource(XMLParser* parser, const String& name, const String& groupName) _preprocessScene();/释放资源 mSceneInfo-load(parser, name, groupName, isEditable();-加载.scene文件 -该行作用是加载了模型与地形。 _postprocessScene(); /就是在这里创建场景。_postprocessScene(); 定义如下:voidSystem:_postprocessScene(void) mBaseScale = Ogre:Math:Sqrt(getTerrainData()-mScale.x * getTerrainData()-mScale.z); / Adjust the camera to fit to current scene _adjustCamera();clearExceptionInfo(); /bakeStaticGeometries(0); / 生成terrain type info mTerrainTypeInfos-setTerrainData(mTerrainData); mTerrainTypeInfos-upda
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2025年标准)股权激励方案协议书
- (2025年标准)股权保管协议书
- (2025年标准)股份追加协议书
- 2026届上海市华东师范大学二附中高一化学第一学期期末调研试题含解析
- (2025年标准)孤儿寄养委托协议书
- (2025年标准)购买商标转让协议书
- (2025年标准)购买股权借款协议书
- 线上交易监管创新-洞察及研究
- 2026届安徽定远启明中学高二化学第一学期期中调研试题含解析
- (2025年标准)舞蹈教练上课协议书
- 小儿上呼吸道感染
- 2025年CCAA国家注册审核员考试(产品认证基础)历年参考题库含答案详解(5卷)
- 2025-2030中国骨科手术导航机器人医生培训体系与手术量增长关联报告
- 苏州工业园区外国语学校语文新初一均衡分班试卷
- 《智能建造概论》高职完整全套教学课件
- 妇科常规手术器械处理流程
- 生猪屠宰加工项目可行性研究报告
- 劳动力、机械设备、材料投入计划
- GB/T 8627-2007建筑材料燃烧或分解的烟密度试验方法
- GB/T 3280-2015不锈钢冷轧钢板和钢带
- GA 576-2018防尾随联动互锁安全门通用技术条件
评论
0/150
提交评论