读取xml生成lua测试代码


#include <iostream>
#include <string>
#include <fstream>
#include "tinyxml2.h"
using namespace std;
using namespace tinyxml2;

std::ofstream file("test.lua",std::ios::ate|std::ios::binary);

void read_ElementChild(XMLElement *surface)
{
    string punStr = ","; //标点符号
    file << "\t\t";
    bool isArray = true; //是否是循环
    while (surface) {
        const XMLAttribute *attr = surface->FirstAttribute();
        string strType;
        
        while (attr) {
            if ( strcmp(attr->Name(), "name") == 0 ){
                string name = attr->Value();
                string preStr = name + " = ";
                string preStr1 = name + " = { ";
                string temp;
                
                if ( strcmp(strType.c_str(), "String") == 0 ){
                    isArray = false;
                    temp = "\"呵呵00001\"" + punStr;
                }else if(strcmp(strType.c_str(), "long")==0){
                    isArray = false;
					temp = "100" + punStr;
				}else if(strcmp(strType.c_str(), "int")==0){
                    isArray = false;
					temp = "10" + punStr;
				}else if(strcmp(strType.c_str(), "short")==0){
                    isArray = false;
					temp = "10" + punStr;
				}else if(strcmp(strType.c_str(), "byte")==0){
                    isArray = false;
					temp = "2" + punStr;
				}else if(strcmp(strType.c_str(), "boolean")==0){
                    isArray = false;
					temp = "true" + punStr;
				}else if(strcmp(strType.c_str(), "float")==0){
                    isArray = false;
					temp = "2" + punStr;
				}else{
                    if (!isArray){ //如果上次不是循环 这次是循环 换一行 并添加两个tab键空格
                        file << endl;
                        file << "\t\t" ;
                    }
                    isArray	= true;
                    size_t len = strType.size();
                    string lastStr = strType.substr(len-2, 2);
                    if ( strcmp(lastStr.c_str(), "[]" ) == 0 ){
                        string preStr = strType.substr(0, len-2);
                        if ( strcmp(preStr.c_str(), "String") == 0 ){
                            temp = "\"呵呵00001\"" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "long")==0){
                            temp = "100" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "int")==0){
                            temp = "10" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "short")==0){
                            temp = "10" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "byte")==0){
                            temp = "2" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "boolean")==0){
                            temp = "true" + punStr + " }" + punStr;
                        }else if( strcmp(preStr.c_str(), "float")==0){
                            temp = "2" + punStr + " }" + punStr;
                        }else {
                            temp = "{ read_" + preStr + " }, }" + punStr;
                        }
                        
                        temp = "[1]=" + temp; //数组添加[1]
                    }else{ //处理不是数组 读取别的协议
                        
                        temp = " read_" + strType + " }" + punStr;
                    }
                }
                
                if (isArray) {
                    file << preStr1 + temp;
                }else {
                    file << preStr + temp;
                }
            }else if ( strcmp(attr->Name(), "type") == 0 ){
                strType = attr->Value();
            }
            
            attr = attr->Next(); //下一个属性
        }
        
        surface = surface->NextSiblingElement(); //下一个节点
        if (isArray && surface != NULL) //处理最后一行如果是数组 不空出一行
        {
            file << endl;
            file << "\t\t";
        }
    }
    file << endl;
    file << "\t}"  << endl;
    
}

void read_xml(XMLElement *surface)
{
    while (surface) {
        const XMLAttribute *attr = surface->FirstAttribute();
        string name;
        bool isRead = true; //如果是 C_ 协议就不继续读取了
        while (attr) {
            if ( strcmp(attr->Name(), "name") == 0 )
            {
                name = attr->Value();
                string fristStr = name.substr(0,1);
                string writeStr;
                if ( strcmp(fristStr.c_str(), "S") == 0 )
                {
                    writeStr = "function read_" + name + "()";
                }else{
                    isRead = false;
                    break;
                }
                file << writeStr;
            }else if ( strcmp(attr->Name(), "description") == 0 )
            {
                file << "  --" << attr->Value() << endl;
            }
            attr = attr->Next();
        }
        
        if (! isRead) {//如果是 C_ 协议就不继续读取了
            surface = surface->NextSiblingElement();
            continue;
        }
        
        XMLElement *surface1 = surface->FirstChildElement(); //读取子节点
        if (surface1){
            file << "\tlocal data = {" << endl;
            read_ElementChild(surface1);
        }
        
        file << "end"  << endl;
		file << endl;
		surface = surface->NextSiblingElement();
    }
}

int main(int argc, const char * argv[])
{
    tinyxml2::XMLDocument myDocument;
    myDocument.LoadFile("protocol.xml");
    XMLElement *rootElement = myDocument.RootElement();
    XMLElement *surface = rootElement->FirstChildElement("message");
    read_xml(surface);
    
    return 0;
}




xml测试数据

<project name="Protocol">
	<message id="0x42001003" name="S_CROSS_ARENA_UI" description="跨服争霸场角色信息">
		<field type="S_CROSS_ARENA_ROLE_INFO[]" name="roleList" description="角色列表"/>
		<field type="S_CROSS_ROLE_TOP_THREE_INFO[]" name="topThreeRoles" description="前三名"/>
		<field type="int" name="fightCap" description="战斗力"/>
		<field type="int" name="rankNo" description="排名"/>
		<field type="int" name="leftAttackCount" description="剩余战斗攻击次数"/>
		<field type="int" name="leftFreeResetCount" description="剩余免费重置次数"/>
		<field type="long" name="resetExpend" description="增加战斗次数消耗钻石数"/>
		<field type="long" name="addAttackExpend" description="增加战斗次数消耗钻石数"/>
		<field type="S_CROSS_ROLE_TOP_THREE" name="test" description="消耗"/>
		<field type="int" name="score" description="积分"/>
		<field type="boolean[]" name="gradeRewards" description="三个档次的奖励是否可领取"/>
	</message>
</project>


生成lua

function read_S_CROSS_ARENA_UI(self)  --跨服争霸场角色信息
	local data = {
		roleList = { [1]={ read_S_CROSS_ARENA_ROLE_INFO }, },
		topThreeRoles = { [1]={ read_S_CROSS_ROLE_TOP_THREE_INFO }, },
		fightCap = 10,rankNo = 10,leftAttackCount = 10,leftFreeResetCount = 10,resetExpend = 100,addAttackExpend = 100,
		test = {  read_S_CROSS_ROLE_TOP_THREE },
		score = 10,
		gradeRewards = { [1]=true, },
	}
end

用法,用里面的标示,找到其他的协议把里面的内容复制过来.


也可以用函数返回方式。生成代码这样:

function read_S_CROSS_ARENA_UI()  --跨服争霸场角色信息
	local data = {
		roleList = { [1]= read_S_CROSS_ARENA_ROLE_INFO(), },
		topThreeRoles = { [1]= read_S_CROSS_ROLE_TOP_THREE_INFO(), },
		fightCap = 10,rankNo = 10,leftAttackCount = 10,leftFreeResetCount = 10,resetExpend = 100,addAttackExpend = 100,
		test = read_S_CROSS_ROLE_TOP_THREE(),
		score = 10,
		gradeRewards = { [1]=true, },
	}
	return data
end






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
抱歉,我无法提供具体的柏林噪声生成地形的lua脚本代码,因为这通常涉及到复杂的数学算法和游戏开发中的纹理生成技术。然而,我可以为你概述柏林噪声生成的基本概念,并给出一个简单的伪代码示例。 **柏林噪声**是一种基于分形的伪随机噪声生成方法,常用于创建自然景观或纹理。在Lua中,实现柏林噪声可能会使用递归算法和一些数学运算。 **伪代码示例**(简化版): ```lua -- 定义两个随机数生成函数 (假设它们返回0到1之间的浮点数) local random = math.random local fade = function(t) return t * t * (3 - 2 * t) end -- 定义柏林噪声函数 function berkeleyNoise(x, y) local base = 64 local cellSize = 1 / base local octaves = 4 -- 多重振荡次数 local sum = 0 for i = 1, octaves do local frequency = base / pow(2, i) local amplitude = pow(0.5, i) local offsetX = x * frequency local offsetY = y * frequency sum += amplitude * noise(offsetX, offsetY) * fade(i / octaves) end return sum end -- 假设noise是一个内置函数,如Perlin Noise或Simplex Noise -- 这里只是简单展示,实际实现可能需要引入额外库或自定义函数 -- 使用噪声生成纹理或地形 local terrainHeight = berkeleyNoise(x, y) -- 可以根据生成的高度值调整地形表面 -- ... ``` 请注意,这个代码只是一个简化版本,实际实现会更复杂,并且可能需要利用现成的噪声库。如果你对如何在特定游戏引擎或工具中实现柏林噪声有兴趣,建议查阅相应文档或在线教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值