一个简单的游戏框架:配置表方案

代码:https://github.com/HushengStudent/myGameFramework

1、配置表格式

csv,逗号分隔,可以使用wps和Excel打开编辑,方便策划使用;

默认第一行为注释;

默认第二行为字段名+类型;二者以冒号隔开;

默认第一列为主键;

2、配置表导出方案

在编辑器下,读取配置表的内容,并把内容按规则转换成对应类型,然后把内容转换为对应的字节数组,写入到二进制文件,并生成对应的读表代码,在使用配置表的时候,根据生成的读表代码,自动加载对应的二进制文件,从而实现配置表解决方案;

(1)数据类型转换为byte[]

如:

        #region intprivate static int _intLength = 4;public static int INT_LENGTH { get { return _intLength; } }/// <summary>/// 以字节数组的形式返回指定的32位有符号整数值;/// </summary>/// <param name="value">要转换的数字;</param>/// <returns>长度为4的字节数组;</returns>public static byte[] GetBytes(int value){return BitConverter.GetBytes(value);}/// <summary>/// 返回由字节数组中前四个字节转换来的32位有符号整数;/// </summary>/// <param name="value">字节数组;</param>/// <returns>由四个字节构成的32位有符号整数;</returns>public static int GetInt32(byte[] value){return BitConverter.ToInt32(value, 0);}/// <summary>/// 返回由字节数组中指定位置的四个字节转换来的32位有符号整数;/// </summary>/// <param name="value">字节数组;</param>/// <param name="startIndex">value内的起始位置;</param>/// <returns>由四个字节构成的32位有符号整数;</returns>public static int GetInt32(byte[] value, int startIndex){return BitConverter.ToInt32(value, startIndex);}

这样就能完成类型转换;

字符串在使用的时候,约定第一位为字符串的长度:

#region string/// <summary>/// 以UTF-8字节数组的形式返回指定的字符串;/// </summary>/// <param name="value">要转换的字符串;</param>/// <returns>UTF-8字节数组;</returns>public static byte[] GetBytes(string value){return Encoding.UTF8.GetBytes(value);}/// <summary>/// 返回由UTF-8字节数组转换来的字符串;/// </summary>/// <param name="value">UTF-8字节数组;</param>/// <returns>字符串;</returns>public static string GetString(byte[] value){if (value == null){throw new Exception("Value is invalid.");}return Encoding.UTF8.GetString(value, 0, value.Length);}#endregion
protected static void ReadString(ref byte[] byteArr, ref int byteOffset, out string str){int len;//第一位为长度;ReadInt32(ref byteArr, ref byteOffset, out len);str = Encoding.UTF8.GetString(byteArr, byteOffset, len);byteOffset += len;}

每读一次,就计算对应位置偏移;

(2)二进制文件的读取与生成

#region Txt/// <summary>/// 保存Txt;/// </summary>/// <param name="path"></param>/// <param name="contents"></param>public static void Write2Txt(string path, string[] contents){File.WriteAllLines(path, contents);}/// <summary>/// 读取Txt;/// </summary>/// <param name="path"></param>/// <returns></returns>public static string[] ReadFromTxt(string path){return File.ReadAllLines(path);}#endregion#region Bytes/// <summary>/// 保存Bytes;/// </summary>/// <param name="path"></param>/// <param name="bytes"></param>public static void Write2Bytes(string path, byte[] bytes){File.WriteAllBytes(path, bytes);}/// <summary>/// 读取Bytes;/// </summary>/// <param name="path"></param>/// <returns></returns>public static byte[] ReadFromBytes(string path){return File.ReadAllBytes(path);}#endregion

主要使用以上方法读取txt,修改txt,将txt转换为byte[],将byte[]写入文件;

之前有写过用MemoryStream写入字节流,然后调用GetBuff()获得byte[]数组,但是出错了;

备注
请注意,在缓冲区中包含分配的字节数,这可能是未使用。 例如,如果"test"的字符串写入到 MemoryStream 对象,从返回的缓冲区的长度 GetBuffer 为 256,而非 4,与未使用为 252 字节。 若要获取缓冲区中的数据,请使用 ToArray 方法; 但是, ToArray 在内存中创建数据的副本。

也可以是缓冲区 null。

(3)示例

道具Id,道具名字,道具描述
ItemId:INT,ItemName:STRING,ItemDes:STRING
1,屠龙刀,屠龙宝刀,武林至尊
2,倚天剑,倚天不出,谁与争锋
3,打狗棒,丐帮帮主信物

生成读表代码:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------using Framework;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class ItemTableDB : BaseTableDB<ItemTable>
{public static readonly ItemTableDB instance=new ItemTableDB();
}// Generated from: ItemTable.csv
public class ItemTable : TableData
{public int ItemId;public string ItemName;public string ItemDes;public override int Key{get{return ItemId; }}public override void Decode(byte[] byteArr, ref int bytePos){ReadInt32(ref byteArr,ref bytePos,out ItemId);ReadString(ref byteArr,ref bytePos,out ItemName);ReadString(ref byteArr,ref bytePos,out ItemDes);}}

BaseTable主要是读表代码,为了方便管理,提供Table基类,统一调用Load方法;

测试加载:

TableMgr.Instance.LoadTable("ItemTable",ItemTableDB.instance);

调用该方法,就会自动加载ItemTable,并读取对应的二进制文件,并且把文件数据加载到ItemTableDB.instance对象;

一个简单的游戏框架:配置表方案相关推荐

  1. 快速搭建一个简单的SSM框架

    1.准备工作 mysql数据库 idea工具 说明:本次是搭建一个SSM框架,首先要确保电脑配置好1.8以上的JDK(因为1.8以下的jdk某些东西不支持),mysql数据库直接使用不方便可以安装一个 ...

  2. 如何搭建python框架_从零开始:写一个简单的Python框架

    原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...

  3. 在Java中搭建一个简单的MVC框架

    搭建一个简单的Java MVC框架 一 . 前言 二. 代码实现 1. 思路分析 2. 代码实现 2.1 Controller注解 2.2 RequestMapping注解 2.3 UserContr ...

  4. 搭建一个简单springboot后端框架

    前言 框架知识是每个程序员都应该或多或少都要有所了解,作为后端开发更是以后进阶架构师必备的知识储备:以此为出发点,我们可以从搭建一个简单的后端框架开始,了解相关的技术点和搭建思路. 我们可以从创建项目 ...

  5. rust如何在木板上上传图片_通过编写一个简单的游戏来学习 Rust | Linux 中国

    导读:你可以尝试以多种语言编程一个简单的游戏来开始编程之路. 本文字数:4068,阅读时长大约: 5分钟 https://linux.cn/article-12979-1.html 作者:Moshe ...

  6. python编程制作接金币游戏_pygame学习笔记(6):完成一个简单的游戏

    学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读.后来,要想写一 ...

  7. 本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏

    本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏 第1步: 安装软件 第2步: 创建新项目 第3步: 查看代码 第4步: 加入一个精灵 第5步: 使精灵可以移 ...

  8. 如何制作一个简单的游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  9. 如何制作一个简单的游戏 Cocos2d-x 2.0.4

    本文实践自 Ray Wenderlich 的文章< How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial>,文中使用Coco ...

最新文章

  1. Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)
  2. PHP命令注入 Command injection
  3. Django - 网页加载报错:A server error occurred. Please contact the administrator(亲测)
  4. mysql windows ad_您可以使用PHP获得Windows(AD)用户名吗?
  5. Mysql 索引-1
  6. SAP Spartacus home页面根据product code请求产品数据的几种边界情况
  7. SQLite—homework
  8. 岁月在变迁,彼此在成长。而我在流浪
  9. 官宣!多所高校,整体搬迁!
  10. 面试与工作差距大,程序员从准备到拿Offer全攻略
  11. 百度竞价初学者怎样才能建立一个好的思路
  12. 深度学习论文: An Improved One millisecond Mobile Backbone及其PyTorch实现
  13. postgresql: the application server could not be contacted --2020-11-17
  14. 开发微信小程序的必备技能图谱
  15. 全国计算机模拟PPT考试,全国计算机等级考试模拟试题2课件.ppt
  16. 嗨格式数据恢复的 10 种最佳替代方法
  17. 如何判断Android系统的版本
  18. WIN11+CUAD11.2+vs2019+tensorTR8.6+Yolov3/4/5模型加速
  19. 路由套接口 unp17
  20. 毕业季礼物——小小海龟实现(Python)

热门文章

  1. CSS中有关定位的知识总结
  2. Win10用注册表修改Edge浏览器下载路径的方法
  3. my ambition
  4. 游戏设计小议 番外篇一 电脑游戏的通用层次结构
  5. 百度文库免积分下载原格式文档的方法(利用百度文库漏洞)
  6. 卷积核的参数量和计算量
  7. 总会用到的系列3:成功的路上你可能需要一个微信公众号
  8. “智慧监狱” 来了,你准备好了吗?
  9. Java 线程池原理和队列详解
  10. 修复Unity空白报错问题