地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的。那么保存的文件数据结构是怎样的?一张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/

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

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

  1. 游戏设计与开发_Unity游戏开发——设计模式概述

    0.前言 这一系列的文章其实应该算作几本书和一些资料总结的笔记,是有关设计模式与游戏开发之间的应用.笔者将阅读学习过程中的思考和总结记录下来,也希望能提供给同样在这方面有疑问的朋友一些帮助. 1.设计 ...

  2. 《基于Unity的2D多人乱斗闯关游戏设计与开发》--小组博客综述

    文章目录 项目名称 项目背景 项目简介 项目架构 项目特色 大致功能需求 游戏模式/内容 项目技术选型 项目分工 项目具体计划 此次项目实训不完全按照项目计划书进行,因为游戏范围太广,可能随时调整游戏 ...

  3. 基于android的2048游戏设计,基于Android平台的2048游戏设计与开发.docx

    基于Android平台的2048游戏设计与开发 高级操作系统论文(设计) 题 目 基于Android个人2048 小游戏的设计与开发姓 名 学 号 院. 系 信息学院 专 业 指导教师 职称(学历)目 ...

  4. 基于Java多线程的打怪升级类游戏设计与开发

    摘要:本文论述了通过JAVA多线程.基于JAVA Swing的GUI图形用户界面设计.IO输入输出流.JDBC技术,实现了游戏系统的UI设计.游戏数据的存储.关卡的设置.用户头像的上传与更改.游戏数据 ...

  5. java俄罗斯方块ppt_基于Java俄罗斯方块游戏设计与开发PPT.ppt

    基于Java俄罗斯方块游戏设计与开发PPT 基于Java的俄罗斯方块游戏的设计与实现 答 辩 人:xxx 学 号:201012120201 指导老师:xxx副教授 专 业:网络工程 学 院:信息科学与 ...

  6. 美国计算机游戏设计专业排名,美国游戏设计专业大学排名TOP5推荐!

    首先明确的是游戏产业的就业前景还是非常好的,尤其是美国,游戏领域方向是游戏设计留学大多数人都会选择的国家,因为美国的游戏专业是比较强的.今天,美行思远小编就来和大家简单推荐一下美国游戏设计专业大学排名 ...

  7. c/c++游戏逆向驱动开发,游戏辅助保护盾

    功能介绍: 1.降低游戏权限,提升游戏权限,禁止游戏后台截图. 2.保护进程,隐藏进程,进程内存不被读取. 如图: 部分功能展示: //程序降权 NTSTATUS ChangeHandleAccess ...

  8. 扫雷程序设计Android答辩,基于QT的扫雷游戏设计与实现扫雷游戏答辩.ppt

    基于QT的扫雷游戏设计与实现扫雷游戏答辩.ppt 程序设计 基于QT语言的扫雷游戏,答辩学生,一.分析扫雷游戏的基本功能,1.从外观上分析 方块 笑脸 计时器 有雷标识 无雷标识 胜利画面 失败画面, ...

  9. MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...

最新文章

  1. 中国民航大学计算机学院宿舍,中国民航大学计算机科学与技术学院研究生导师简介-谢丽霞_清华大学宿舍...
  2. android电源驱动程序,[转]Android虚拟电源管理驱动
  3. 新站SEO优化五点注意事项!
  4. 从零开始学 Java - Spring 使用 Quartz 任务调度定时器
  5. 网络相关之TCP(有趣的对话)
  6. java.nio.Buffer flip()方法
  7. Thread源码阅读
  8. android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
  9. 回A更进一步?阿特斯太阳能获17.8亿元融资 股价一周累涨21%
  10. ASP.NET网站SESSION丢失的问题
  11. 中兴助力软银开启首次5G测试
  12. SzNOI语法百题之总目录
  13. J2me实现的wap浏览器
  14. python中的主函数调用_调用主函数中的函数
  15. 数学分析(一)数列与数列极限
  16. 未能连接到imap服务器,roundcube无法连接imap服务器登录
  17. 计算机科学基础 浙大学分,Zju生存指南-学(上)
  18. QT在界面背景图设置后运行显示黑屏
  19. PHP八字强弱计算,八字强弱计算法
  20. 快应用入门:第一个快应用程序

热门文章

  1. 监听pda扫描_东大集成PDA扫描开发
  2. 计算机信息世界PPT,奇妙的信息世界课件.ppt
  3. 《Python程序设计基础(第3版)》章节习题参考答案
  4. PMP模考(二)——错题集
  5. MATLAB二值图连通域快速标记算法
  6. Java基础 - 坦克大战(第三章,线程基础与线程使用)
  7. 这世上最悲哀的事莫过于:你的好,他不懂!
  8. Cocos2dx如何在visualStudio开发环境搭建及项目搭建,新手小白,请多多关照!!!
  9. 计算机专业普通话考试成绩查询时间,2021普通话考完多久能查分 几天出成绩
  10. 荐读 | 如何有效的进行公司名称匹配