游戏地图编辑器之地图存储格式

《星空之翼》的地图编辑器模块最重要的是确定地图文件的存储格式,在探索地图文件存储格式中经历了4种方案,分别为:自定义二进制文件、XML文件、类的序列化和数据库。最后结合游戏要求和自身技术水平选择了嵌入式数据库(SQLite)。
(1) 自定义二进制文件:由于本身技术水平限制,不能很好的存储变化较大的二进制文件,最后放弃了这种地图文件组织方式。
(2) XML文件:由于XML对玩家过于透明,玩家很容易修改地图文件,导致地图文件极其不稳定,因此放弃了自定义二进制文件。
(3) 类的序列化:类的序列化可以很好的组织地图文件,但是考虑到以后的地图文件的存储格式会发生改变,扩展性不强,每次修改都要修改类的定义。
(4) 数据库:考虑到随着游戏开发的不断推进,延续的变更会使游戏的整体结构日渐紊乱,使程序难以理解和维护,游戏地图是游戏主程序与地图编辑器联系的纽带,要延续地图的稳定性,采用了数据库可以一定程度上,保持游戏地图的稳定性。最开始选择的数据库是access,可是考虑到许多玩家的电脑不一定安装了access的驱动,因此放弃access,很高兴找到SQLite数据库,SQLite太好了,只要一个System.Data.SQLite.dll就可以了使用该数据库。
目前地图文件主要存储的信息有两个,一个是静态的地图背景,另一个是动态的敌人。还包括一些配置信息。地图编辑器大体上分为两区域,一个是游戏地图的控件菜单区,另一个是游戏地图编辑区。在控件菜单区可以选择背景和精灵两种类别,通过背景玩家可以加载自己喜欢的背景Tile,然后添加到地图中。通过精灵可以添加自定义的敌人,可以设置敌人的运动方式、速度、攻击力,生命值,攻击模式。
采用SQLite数据库的优势是实现简单,便于组织和方便扩展。

地图文件包括3个表Level,Sprite,LevelSprite。
(1) Level:描述了当前游戏关卡的游戏界面的尺寸、背景图片、故事剧情信息、地图尺寸等信息。
(2) Sprite:存储了当前关卡里所有的精灵的详细信息。
(3) Levelsprite:存储了当前关卡敌人、陨石和动态背景的具体的详细信息,包括生命值、攻击力、运动速度、运动模式、攻击模式、出现地点等详细信息。
在地图编辑器生成地图时,会将Level、Sprite和LevelSprite表的信息加入到地图文件中,然后在游戏主程序读取地图信息。

采用SQLite来管理地图数据,就对地图的操作变为,对数据库的操作。其中最重要的莫过与对图片的存储,这里重点就讲解SQLite对图片的存储。

读取图片

SQLiteConnection sqliteConn1 = new SQLiteConnection("Data Source=" + ofd.FileName + ";New=False;Compress=True;Version=3;"); //连接数据库 sqliteConn1.Open(); //打开连接 SQLiteCommand sqlcmd1 = new SQLiteCommand(sqliteConn1); string cmd = "select * from level"; SQLiteDataAdapter sda = new SQLiteDataAdapter(cmd, sqliteConn1); DataSet ds = new DataSet(); sda.Fill(ds); byte[] data = null; int map_width = 1; int map_height = 1; int title_width = 1; int title_height = 1; MemoryStream myStream = new MemoryStream(); foreach (DataRow dr in ds.Tables[0].Rows) //因为表中中只有一行数据读取一次就行了 { data = (byte[])dr["level_background"]; map_width = Int32.Parse(dr["map_width"].ToString()); map_height = Int32.Parse(dr["map_height"].ToString()); title_width = Int32.Parse(dr["title_width"].ToString()); title_height = Int32.Parse(dr["title_width"].ToString()); } foreach (byte a in data) { myStream.WriteByte(a); } Bitmap bbg = new Bitmap(myStream); //bbg为成功读出的图片

存储图片

MemoryStream ms = new MemoryStream(); tempbm.Save(ms, ImageFormat.Bmp); byte[] bitmapData = ms.ToArray(); SQLiteConnection sqliteConn = new SQLiteConnection("Data Source=" + Mapconfig.MapSavePath + ";New=False;Compress=True;Version=3;"); sqliteConn.Open(); SQLiteCommand sqlcmd = new SQLiteCommand(sqliteConn); sqlcmd.CommandText = "insert into level(level_id,level_name,level_background,level_story,map_width,map_height,title_width,title_height) values(1,1,@image,@story,@map_width,@map_height,@title_width,@title_height)"; SQLiteParameter param_m= new SQLiteParameter("@image", DbType.Binary, bitmapData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bitmapData); sqlcmd.Parameters.Add(param_m); SQLiteParameter param_mS = new SQLiteParameter("@story", Mapconfig.MapStory.ToString()); sqlcmd.Parameters.Add(param_mS); SQLiteParameter param_mmw = new SQLiteParameter("@map_width", Mapconfig.MapWidth); sqlcmd.Parameters.Add(param_mmw); SQLiteParameter param_mmh = new SQLiteParameter("@map_height", Mapconfig.MapHeight); sqlcmd.Parameters.Add(param_mmh); SQLiteParameter param_mtw = new SQLiteParameter("@title_width", Mapconfig.TileWidth); sqlcmd.Parameters.Add(param_mtw); SQLiteParameter param_mth = new SQLiteParameter("@title_height", Mapconfig.TitleHeight); sqlcmd.Parameters.Add(param_mth); sqlcmd.ExecuteNonQuery(); sqlcmd.Dispose(); sqliteConn.Dispose(); ms.Dispose(); //图片插入成功

地图编辑器下载  作者其他源码下载

游戏地图编辑器之地图存储格式相关推荐

  1. 游戏中随机地图的实现

    游戏中随机地图的实现 很多游戏都用到了随机地图,比如矮人要塞,CDDA,MineCraft,RimWorld. 随机地图带给游戏更多的趣味性,每一次新建游戏都有不同的体验. 一般游戏中生成随机地形都是 ...

  2. 小学生python游戏开发pygame5--title地图调用

    小学生python游戏开发pygame5--title地图调用 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 import log ...

  3. 001-unity2D游戏随机生成地图

    unity2D游戏随机生成地图 教程与素材地址出处 地图控制脚本.cs(所有变量使用用中文便于理解,实际开发中请勿这样使用) using System.Collections; using Syste ...

  4. 20190324游戏场景百度地图150次联网耗电

    2D1Z 2D1N 2D1F 项目 第一轮 第二轮 第一轮 第二轮 第一轮 第二轮 1 30 Mins Game 378.38 294 277.65 272.25 2 30 Mins Music Pl ...

  5. java编写rgp游戏地图,unity RPG游戏地图编辑 RPG Map Editor v1.5.5

    描述 unity RPG游戏地图编辑 RPG Map Editor v1.5.5 所支持的Unity版本:5.3.1 及以上版本 Fully Supports Unity 5! Create an R ...

  6. html5游戏开发-零基础开发RPG游戏-开源讲座(四)-游戏脚本化地图跳转

    首先,本篇文章是零基础开发RPG游戏-开源讲座系列文章的第四篇,来实现游戏的脚本化,和利用游戏脚本实现地图场景的切换,离上次更新貌似很长时间了,你在看下面的文字之前,需要先了解前三篇在下啰嗦了些什么东 ...

  7. wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)

    地图编辑器的使用 首先先来介绍一下使用地图编辑器tIDE Tile Map Editor来生成TMX文件.tIDE Tile Map Editor的下载地址  http://tide.codeplex ...

  8. cocos2d-x游戏实例(10)-塔防游戏(修改地图图素,地图整体缩放)

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 塔防游戏在目前的智能机游戏中占据很重要的部分, ...

  9. cocos植物大战僵尸(三)游戏场景:地图滚动

    2.3游戏场景 2.3.1 地图滚动 根据json表读取出,当前关卡要载入哪张地图,并读取当前地图的相关.Json表为数组结构,配置如下: [{"Level":0,"Ma ...

最新文章

  1. arcgis for server 登陆manager失败解决办法
  2. 解压缩工具 WinRAR 5.71 + x64 Final 中文汉化版
  3. VTK:图片之ImageSlice
  4. 我是如何学习写一个操作系统(六):进程的调度
  5. TypeScript class 构造函数和成员的初始化顺序
  6. Java线程机制学习
  7. 作者:王绍卿, 男, 中国人民大学信息学院博士生, CCF学生会员。
  8. lnmp 1.4 mysql_lnmp1.4配置https教程
  9. php js代码,在php中运行js代码的方法
  10. weblogic部署springboot项目
  11. 小脚丫 LCMXO2 4000HC FPGA入门——点个灯
  12. 动画专题:属性动画:插值器AccelerateDecelerateInterpolator 加速插值器
  13. 经常流鼻血不是上火,可能是寄生水蛭钻进了你的鼻腔
  14. matlab制作太阳系模型,一种太阳系模型的制作方法
  15. 51Talk-Level 7 Unit 2 L4
  16. 利用Promise彻底解决微信小程序云函数因运行时间过长返回result,underfined为空的方法
  17. CentOS7 开启 BBR 加速
  18. STL 源码分析: RB_tree 红黑树(三) 插入和查找
  19. C语言函数讲义,C语言讲义——指针函数和函数指针
  20. C++课程设计报告--通讯录管理系统

热门文章

  1. 手机 服务器文件,手机查看云服务器文件
  2. PowerISO----百度百科
  3. Centos7下同步系统时间
  4. oracle processes修改,修改oracle processes参数过大导致oracle启动不了解决方法
  5. 你了解Lumen和Nanite吗?在ue5场景制作中如何使用呢?
  6. 图谱理论与复杂网络相关算法
  7. R语言 igraph——图挖掘助力社会网络分析
  8. wajueji.php,众志:日立ZX200-5G挖掘机性能参数价格
  9. new date()标准时间转yyyy-mm-dd hh:mm 24小时制
  10. 颠覆式改变的丰田全新威驰VIOS