MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)

地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的。那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是讲的理论与设计,理论和设计往往都很空洞,但是却很灵活,需要靠每个人怎么运用。

一些图片

  

区域和格子

  从上面的截图可以看出游戏场景其实是由格子来区分的,不管是矩形的格子还是其他形状的格子也好,一张地图不可能只有一个点(即多点组成一张地图)。在3D场景中似乎格子的位置总伴随着高度信息,所以让人感觉有些迷茫,其实我们可以将这些格子平铺成一张图。

  如上面的最后一张图,是地形的剖面图,不过是横切面,如果我们看一下纵切面的话,就可以将3D的地图进行2D的转换。其实地图还是由一张平面图组成,只是多了Y轴的数据,也就是我们常说的地表高度。

地图数据

  由指定格式的数据组成,在服务器和客户端的主要作用是用来寻路(点击地图走路,以及自动寻路)。

地图区域

  一个场景一般情况下会有区域的划分,因为这些区域会有自己特殊的事件,如一个玩家加入该区域会产生某个事件,就像我们玩游戏的时候忽然触发了剧情一样,这都是区域的事件。

数据结构

  有了指定的数据结构后,文件才能被正常的读取,而地图的数据一般是由编辑器生成,所以也必须规定文件的数据结构。

  1、地图

    1. 文件数据

      武侠世界/天龙八部的场景地图数据格式为:[文件头][单元数据][单元数据]…… 单元数据的数量为地图横长* 地图纵长。

       code.
复制代码
typedef struct map_header_struct {int16_t flag; //文件标记,用来区分是不是地图数据文件int32_t xsize; //X方向大小 横长int32_t zsize; //Y方向大小 纵长 
} map_header_t; //文件头信息

typedef struct map_unit_struct {int16_t flag; //标识信息//00000000|00000000//               ||_ WalkDisable  -是否禁止地面上行走的OBJ穿越  [0 可穿越  1不可穿越]//               |__ FlyDisable   -是否禁止空中飞行的OBJ穿越    [0 可穿越  1不可穿越]int8_t height; //高度int8_t reserved; //预留字段
} map_unit_t; //单元数据信息
复制代码

    2. 对象数据

     整个对象也就是整张地图的数据,在武侠世界/天龙八部中采用的是左手坐标系,而在服务器其实用不着空间的坐标也就是Y轴的数据,将地图切割后就是一张平面的图,这张平面的图一般都是矩形。

     X坐标 左为0、右为最大(也可以说是地图横长)

     Y坐标 上为0、下为最大(也可以说是地图纵长)

     code.
复制代码
/* 完整的地图示意图 */
//                (0, z)   (x, z)
//                ___________
//   y  z         |         |
//   | /          |         |
//   |/           |         |
//   +-------x    |_________|
//   
//               (0, 0)    (x, 0)
复制代码

  2、区域

    地图划分成一个个格子,而组成区域的也是格子,以下为一个区域的基本数据。

    1. RECT(矩形格子)

      left 左、top 高度、right 右、bottom 底部。

    2. 区域ID

    3. 脚本ID

算法(选择排序)

  1、简单选择排序

    简单选择排序基本思想是将最小的数据移动到第一个位置并交换数据,比如有N个元素,一次将最小的元素移动到第一个位置并交换数据,那么剩下的就只剩下N-1个数据,将剩下的N-1的序列的数据最小的数据移动到该剩下序列的第一个位置,这样移动N次之后,序列便成了有序的序列。

    code.

复制代码
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>/*** 简单选择排序基本思想是将最小的数据移动到第一个位置并交换数据,比如有N个元素,* 第一次将最小的元素移动到第一个位置并交换数据,那么剩下的就只剩下N-1个数据* 再将剩下的N-1的序列的数据最小的数据移动到该剩下序列的第一个位置,这样移动N次* 之后,序列便成了有序的序列。*///简单选择排序
void selectsort(int32_t array[], int32_t length);
//数组打印
void displayarray(int32_t array[], int32_t length);int32_t main(int32_t argc, char *argv[]) {int32_t array[] = {32, 1, 6, 9, 37, 88, 47, 35, 99};int32_t length = sizeof(array) / sizeof(array[0]);selectsort(array, length);printf("sort result: ");displayarray(array, length);return 0;
}void selectsort(int32_t array[], int32_t length) {int32_t i, j, k;int32_t temp;//将第i个元素与第i+1...length个元素比较,将最小的元素放在第i个位置for (i = 0; i < length - 1; ++i) {j = i;for (k = i + 1; k < length; ++k) { //最小元素的序号为jif (array[k] < array[j])j = k;}if (j != i) { //如果序号i不等于j,则需要加序号i和序号j的元素交换temp = array[i];array[i] = array[j];array[j] = temp;}printf("the %d times sort result: ", i + 1);displayarray(array, length);}
}void displayarray(int32_t array[], int32_t length) {int32_t i;for (i = 0; i < length; ++i)printf("%4d", array[i]);printf("\n");
}
复制代码

    result.

  2、堆排序

    堆排序算法实现比较复杂,它主要适用于大规模的数据排序,比如在10万个数据元素中找出前10个最小或是最大的元素,使用该算法效率最高。

    code.

复制代码
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>/*** 堆排序算法实现比较复杂,它主要适用于大规模的数据排序,比如在10万个数据元素* 中找出前10个最小或是最大的元素,使用该算法效率最高。*///数组打印
void displayarray(int32_t array[], int32_t length);
//调整array[pos1...pos2],使其成为一个大顶堆
void adjustheap(int32_t array[], int32_t pos1, int32_t pos2);
//创建大顶堆
void createheap(int32_t array[], int32_t length);
//利用堆排序算法对数组进行排序
void heapsort(int32_t array[], int32_t length);int32_t main(int32_t argc, char *argv[]) {int32_t array[] = {32, 1, 6, 9, 37, 88, 47, 35, 99};int32_t length = sizeof(array) / sizeof(array[0]);printf("before sort: ");displayarray(array, length);heapsort(array, length);printf("after sort: ");displayarray(array, length);return 0;
}void displayarray(int32_t array[], int32_t length) {int32_t i;for (i = 0; i < length; ++i)printf("%4d", array[i]);printf("\n");
}void adjustheap(int32_t array[], int32_t pos1, int32_t pos2) {int32_t i;int32_t temp;temp = array[pos1]; //临时存放根节点for (i = 2 * pos1 + 1; i <= pos2; i *= 2 + 1) {if (i < pos2 && array[i] < array[i + 1]) //从关键字较大的子节点向下筛选++i; //i为关键字较大的节点的下标if (temp > array[i]) break; //如果子节点的值小于根节点的值,则不进行交换array[pos1] = array[i];pos1 = i;}array[pos1] = temp; //将根节点插入到正确的位置
}void createheap(int32_t array[], int32_t length) {int32_t i;for (i = length / 2 - 1; i >= 0; --i) //从序号length / 2 - 1开始建立大顶堆adjustheap(array, i, length - 1);
}void heapsort(int32_t array[], int32_t length) {int32_t i;int32_t temp;createheap(array, length); //创建堆for (i = length - 1; i > 0; --i) { //将堆顶元素与最后一个元素交换,重新调整堆temp = array[0];array[0] = array[i];array[i] = temp;printf("the %d sort times: ", length - i);displayarray(array, length);adjustheap(array, 0, i - 1); //将array[0...i-1]调整为大顶堆
  }
}
复制代码

    result.

作者:viticm  出处: http://www.cnblogs.com/lianyue/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的 【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就 【关注】我吧。
标签

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380551.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

对话CMU计算机新院长:看好AI交叉创新出成果,建议新生先泛后专

2019-11-21 13:25:16 唐木 发自 天龙寺 量子位 报道 | 公众号 QbitAI 谁是全球最好的大学&#xff1f;谁有全球最好的计算机学院&#xff1f; 如果你问李开复、陆奇、沈向洋、洪小文等功成名就的计算机大牛&#xff0c;多半都会得到同一个答案&#xff1a; Carnegie Mellon …

[转]天龙八部服务器端-共享内存的设计

一、服务器构架 一个天龙八部游戏区&#xff0c;主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色数据库可以安装到Machine4&#xff0c;那么一个区有5台物理机器。LoginServer和WorldServer、CharacterDB、BillingServer有连接。WorldServer和各个GameServer有连接…

天龙八部服务器端---共享内存的设计

2019独角兽企业重金招聘Python工程师标准>>> 原文地址&#xff1a;http://zhktiger.blog.sohu.com/163971755.html&#xff0c;非常感谢作者的分享。 一、服务器构架 一个天龙八部游戏区&#xff0c;主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色…

天龙八部服务器端共享内存的设计

原文&#xff1a;http://zhktiger.blog.sohu.com/163971760.html 一、服务器构架 一个天龙八部游戏区&#xff0c;主要服务器部署情况如下图所示: 实际部署可能有所不同。区角色数据库可以安装到Machine4&#xff0c;那么一个区有5台物理机器。LoginServer和WorldServer、Chara…

初识鸿蒙跨平台开发框架ArkUI-X

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备&#xff0c;提供全场景&#…

虚拟DOM(Virtual DOM)和真实DOM(Real DOM)区别

虚拟DOM&#xff08;Virtual DOM&#xff09; 虚拟DOM是以Javascript的形式存在来描述DOM&#xff0c;创建虚拟DOM的目的就是将虚拟DOM更好的渲染到页面UI中&#xff0c;它与真实的DOM是一一对应的不可以直接更新HTML元素更新&#xff0c;更新JSX操作DOM方便&#xff0c;消耗少…

【技术科普】VR、AR、MR的区别

VR、AR、MR定义&#xff1a; 什么是虚拟现实&#xff1f; 虚拟现实(Virtual Reality&#xff0c;简称VR&#xff0c;又译作灵境、幻真)是近年来出现的高新技术&#xff0c;也称灵境技术或人工环境。虚拟现实是利用电脑模拟产生一个三维空间的虚拟世界&#xff0c;提供使用者关…

OSVR接入HMD设备

推荐一本书<<金字塔原理>>&#xff0c;本文按照书中说提的“是什么&#xff0c;为什么&#xff0c;怎么做”&#xff0c;来说明如何把HMD设备接入到OSVR上。 为什么要做OSVR插件 对于我们来说&#xff0c;后续要制作的产品是头盔&#xff0c;对于头盔设备通过插件…

迈德威视SDK

引入 代码 public class MVCamera : InterfaceCamera{#region 属性字段PictureBox pb_ShowImage;//图像框tSdkCameraDevInfo[] tCameraDevInfoList;CameraSdkStatus status;public static CameraHandle[] m_hCamera; // 句柄CAMERA_SNAP_PROC m_CaptureCallback;In…

MVVM 架构,ViewModel和LiveData(一)

MVVM 架构,ViewModel和LiveData(一) 标签&#xff08;空格分隔&#xff09;&#xff1a; 翻译计划 Android开发 原文链接 MVVM architecture, ViewModel and LiveData (Part 1) 正文 在Google I/O之间,Google推出了包含LiveData和ViewModel的组件架构,这有助于开发者们使用…

DRMM model

Paper 的引用&#xff1a; Guo J, Fan Y, Ai Q, et al. A deep relevance matching model for ad-hoc retrieval[C]//Proceedings of the 25th ACM International on Conference on Information and Knowledge Management. ACM, 2016: 55-64. Retrieval or Matching 论文中说到…

JVM(JAVA虚拟机)、DVM(Dalvik虚拟机)和ART虚拟机

一、什么是DVM&#xff0c;和JVM有什么不同&#xff1f; JVM是Java Virtual Machine&#xff0c;而DVM就是Dalvik Virtual Machine&#xff0c;是安卓中使用的虚拟机&#xff0c;所有安卓程序都运行在安卓系统进程里&#xff0c;每个进程对应着一个Dalvik虚拟机实例。他们都提…

关于Hdmi2.1,FRL,DSC,VRR,ALLM你需要知道这些

文章目录 TMDSFRLDSCVRRALLM相关设备Nvidia显卡电视游戏机显示器 注意的坑 最近在研究Hdmi相关内容&#xff08;看游戏设备hhh&#xff09;&#xff0c;网上很多信息都是零零碎碎的&#xff0c;结合自己的一些研究简单记录一下。 Hdmi&#xff0c;High Definition Multimedia I…

HDMI 2.1 VRR功能详解

7.6可变刷新率和快速更新 可变刷新率&#xff08;VRR&#xff09;允许图片在源完成准备后立即通过链路发送。在链路支持的最大字符速率大于给定视频定时所需的速率的情况下&#xff0c;Fast VActive&#xff08;FVA&#xff09;减少了传输图片所需的时间。这些特性提供了性能、…

VVC帧间预测(八)DMVR

解码端运动向量修正(Decoder side motion vector refinement ,DMVR)是为了提高merge模式下双向预测MV的准确性而提出的技术。双向预测是在list0和list1中分别找一个运动向量MV0和MV1&#xff0c;然后将MV0和MV1所指向的预测块进行加权得到最终的预测块。而DMVR不是直接使用MV0和…

ARVR技术 | AR, VR, MR和XR?想搞清楚不?

AR, VR, MR&#xff0c;现在还有XR ?这些缩写是什么?它们代表什么? 让我们快速梳理一下技术术语。 首先&#xff0c;虽然你可能熟悉其中的一些术语&#xff0c;如AR和VR, 但MR和XR对许多人来说仍然是新鲜的术语。 目前的共识是&#xff0c;所有这些互补形式的现实都落在一…

MDD(模型驱动开发)

前言导读 当下企业软件应用开发面临着需求复杂多变、新的需求和系统不断增长&#xff0c;软件系统变得越来越复杂&#xff0c;普通的软件开发方式难以快速满足用户需求。为了解决这些问题&#xff0c;就出现了很多新的方法&#xff0c;其中最突出的一个就是模型驱动开发 MDD &a…

RSCMVR

也是之前发了 ~~ 又带来马教授的~~ 神器稀疏卷积性能和稳健性超越ResNet 标题就是简写可好? 尽管深度神经网络在图像分类方面具有很强的经验性能&#xff08;empirical performance&#xff09;&#xff0c;但这类模型往往被视为「黑盒」&#xff0c;最为人诟病的就是「难以解…

EMD和VMD

作者&#xff1a;桂。 时间&#xff1a;2017-03-06 20:57:22 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/6511916.html 前言 本文为Hilbert变换一篇的内容补充&#xff0c;主要内容为&#xff1a; 1&#xff09;EMD原理介绍 2&#xff09;代码分析 3&#xff09…

什么是MDM

MDM或移动设备管理是一种软件应用程序&#xff0c;用于管理企业中的终端&#xff0c;如笔记本电脑、智能手机、平板电脑等。随着越来越多的员工使用这些设备&#xff0c;各种形式和规模的企业现在都转向移动设备管理&#xff0c;以增强数据安全性并提高生产力。 MDM是什么意思…