C++调用Lua读取配置文件的一个简单例子

本文介绍了如何使用Lua处理游戏配置文件,包括加载文件、获取全局字符串和数值型变量等操作,并通过具体示例展示了如何从Lua配置文件中读取各种参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 定义个Lua处理类
#ifndef _LUA_HANDLER_H_
#define _LUA_HANDLER_H_

extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};
/*
** Lua处理类
*/
class LuaHandler
{
public:

	// 构造函数
	LuaHandler()
	{
		// 打开lua虚拟机
		m_pLuaState = lua_open();

		// 打开lua基础的库
		luaopen_base(m_pLuaState);

		// 打开lua字数学库
		luaopen_math(m_pLuaState);

		// 打开lua字符串库
		luaopen_string(m_pLuaState);
	}

	// 析构函数
	~LuaHandler()
	{
		// 关闭lua虚拟机
		lua_close(m_pLuaState);
	}

	// 加载lua文件
	void				LoadFile(const char* filename)
	{
		int nRet = luaL_dofile(m_pLuaState,filename);
		if (nRet != 0)
		{
			throw exception("can not open lua file!");
		}
	}

	// 获取全局字符串
	string			GetGlobalString(const char* varName)
	{
		lua_getglobal(m_pLuaState,varName);
		
		int nRet = lua_isstring(m_pLuaState,-1);
		if (nRet == 0)
		{
			throw exception("there is not a string!");
			return "";
		}

		return lua_tostring(m_pLuaState,-1);
	}

	// 设置lua堆栈顶部
	void				SetTop(int v)
	{
		lua_settop(m_pLuaState,v);
	}

	// 获取全局数值型变量
	double			GetGlobalNum(const char* varName)
	{
		lua_getglobal(m_pLuaState,varName);

		int nRet = lua_isnumber(m_pLuaState,-1);
		if (nRet == 0)
		{
			throw exception("there is not a number!");
			return 0;
		}

		return lua_tonumber(m_pLuaState,-1);
	}

	lua_State*		GetLuaState()
	{
		return m_pLuaState;
	}

private:
	lua_State*			m_pLuaState;
};
#endif
//具体的调用如下
void Config::LoadConfig()
{
	// Lua处理器
	LuaHandler lua_hadndler;

	// 加载lua文件
	lua_hadndler.LoadFile("E:\\Work\\cocos2d-x-3.4\\MyGame\\testAll\\proj.win32\\Debug.win32\\config\\config.lua");//

	// 设置堆栈
	lua_hadndler.SetTop(0);

	// 读取lua配置文件
	m_strPlayerActionConfigFile		= lua_hadndler.GetGlobalString("player_action_configfile"); 
	m_strMonsterActionConfigFile		=  lua_hadndler.GetGlobalString("monster_action_configfile");
	m_strSkillActionConfigFile		= lua_hadndler.GetGlobalString("skill_action_configfile"); 

	m_strPlayerName				= lua_hadndler.GetGlobalString("PlayerName"); 

	m_fProcessInterval			= lua_hadndler.GetGlobalNum("ProcessInterval");
	m_fPlayerSpeed				= lua_hadndler.GetGlobalNum("PlayerSpeed");
	m_fPlayerSpeedIncrement			= lua_hadndler.GetGlobalNum("PlayerSpeedIncrement");
	m_fPlayerDamageValue			= lua_hadndler.GetGlobalNum("PlayerDamageValue");
	m_fPlayerDamageValueIncrement		= lua_hadndler.GetGlobalNum("PlayerDamageValueIncrement");
	m_fMonsterSpeed				= lua_hadndler.GetGlobalNum("MonsterSpeed");
	m_fMonsterSpeedIncrement		= lua_hadndler.GetGlobalNum("MonsterSpeedIncrement");
	m_fMonsterDamageValue			= lua_hadndler.GetGlobalNum("MonsterDamageValue");
	m_fMonsterDamageValueIncrement		= lua_hadndler.GetGlobalNum("MonsterDamageValueIncrement");
	m_fMonsterEmpiricalValue		= lua_hadndler.GetGlobalNum("MonsterEmpiricalValue");
	m_fMonsterEmpiricalValueIncrement	= lua_hadndler.GetGlobalNum("MonsterEmpiricalValueIncrement");
	m_fPlayerBloodReturnValue		= lua_hadndler.GetGlobalNum("PlayerBloodReturn");
	m_fPlayerMagicReturnValue	<span style="white-space:pre">	</span>= lua_hadndler.GetGlobalNum("PlayerMagicReturn");
	m_fMonsterBloodReturnValue		= lua_hadndler.GetGlobalNum("MonsterBloodReturn");
	m_nMonsterMaxCount			= (int)lua_hadndler.GetGlobalNum("MonsterMaxCount");
	m_nEquipmentBloodMaxCount		= (int)lua_hadndler.GetGlobalNum("EquipmentBloodMaxCount");
	m_nEquipmentMagicMaxCount		= (int)lua_hadndler.GetGlobalNum("EquipmentMagicMaxCount");

	m_fEquipmentBloodReturnValue		= lua_hadndler.GetGlobalNum("EquipmentBloodReturnValue");
	m_fEquipmentMagicReturnValue		= lua_hadndler.GetGlobalNum("EquipmentMagicReturnValue");

	m_strEquipmentBloodPicName		= lua_hadndler.GetGlobalString("EquipmentBloodPicName");
	m_strEquipmentMagicPicName	<span style="white-space:pre">	</span>=lua_hadndler.GetGlobalString("EquipmentMagicPicName");

	m_fPlayerPosition_X			= lua_hadndler.GetGlobalNum("PlayerPosition_X");
	m_fPlayerPosition_Y			= lua_hadndler.GetGlobalNum("PlayerPosition_Y");
	m_fBossPosition_X			= lua_hadndler.GetGlobalNum("BossPosition_X");
	m_fBossPosition_Y		<span style="white-space:pre">	</span>= lua_hadndler.GetGlobalNum("BossPosition_Y");

	m_strSelfIndicatorFileName		= lua_hadndler.GetGlobalString("self_indicator");
	m_strUIFileName				= lua_hadndler.GetGlobalString("UI_FileName");
	m_strMap1FileName			= lua_hadndler.GetGlobalString("Map1_FileName");
	m_strMap2FileName			= lua_hadndler.GetGlobalString("Map2_FileName");
	m_strMap3FileName			= lua_hadndler.GetGlobalString("Map3_FileName");
	m_strMap4FileName			= lua_hadndler.GetGlobalString("Map4_FileName");
	m_fPortalPosition_X			= lua_hadndler.GetGlobalNum("PortalPosition_X");
	m_fPortalPosition_Y			= lua_hadndler.GetGlobalNum("PortalPosition_Y");

	return;
}


附Lua的配置文件如下:

-- RPG_01的配置文件

--myTable = {id = '001',name = "mo bin sheng"};

-- 下面是各个配置文件的文件名 begin---

player_configfile 			= "config/player.xml";
player_action_configfile 	= "config/player-action.xml"
monster_action_configfile 	= "config/monster-action.xml"
skill_action_configfile 	= "config/skill.xml"
-- 下面是各个配置文件的文件名 end---

ProcessInterval = 10.0

-- 玩家的配置 begin---
PlayerName	= "role3"					-- 玩家的名字
PlayerSpeed = 3.0						-- 其实时候玩家的速度
PlayerSpeedIncrement = 0.1				-- 升级的时候玩家速度的增加量
PlayerDamageValue = 0.5					-- 初始时候玩家的伤害值
PlayerDamageValueIncrement = 0.1		-- 升级的时候玩家的伤害值的增加量
PlayerBloodReturn = 0.05				-- 单位时间内玩家回复血量的速度
PlayerMagicReturn = 0.05				-- 单位时间内玩家回复魔量的速度
PlayerPosition_X = 100;					-- 玩家的起始坐标
PlayerPosition_Y = 100;					-- 玩家的起始坐标
-- 玩家的配置 end---


-- 怪物的配置 begin---
MonsterSpeed = 3.0						-- 怪物的起始速度
MonsterSpeedIncrement = 0.05			-- 怪物升级时候速度的增加量
MonsterDamageValue = 0.1				-- 怪物的起始伤害值
MonsterDamageValueIncrement = 0.1		-- 怪物升降时伤害值的增加量
MonsterEmpiricalValue = 20				-- 怪物一级的时候拥有的经验值
MonsterEmpiricalValueIncrement = 10		-- 怪物升级时候经验值的增加量
MonsterBloodReturn = 0.02				-- 怪物单位时间内回血量
MonsterMaxCount = 8						-- 在屏幕上显示的最大的怪物的数量
BossPosition_X = 500;					-- Boss在屏幕上的起始位置
BossPosition_Y = 400;					-- Boss在屏幕上的起始位置
-- 怪物的配置 end---

-- 装备的配置 begin---
EquipmentBloodMaxCount = 4				-- 在屏幕上掉下的血瓶的最大数量
EquipmentBloodReturnValue = 10			-- 吃了一个血瓶回复的血量
EquipmentBloodPicName = "RPG_Resource/prop_icon/propIcon_50000010.png"	-- 血瓶的文件名
EquipmentMagicMaxCount = 4				-- 掉在地上的魔瓶的最大数量
EquipmentMagicReturnValue = 10			-- 吃了一个魔瓶回复的魔法量
EquipmentMagicPicName = "RPG_Resource/prop_icon/propIcon_50000011.png"	-- 魔瓶的文件名
-- 装备的配置 end---

-- UI以及界面配置 begin--
self_indicator = "RPG_Resource/ui/self_indicator.png"		-- 显示人物/怪物被选中的光圈的文件名
UI_FileName = "RPG_Resource/xUi/xUi_1.ExportJson"			-- UI配置的文件名
Map1_FileName = "RPG_Resource/xMap/map1_1.ExportJson";		-- 章节1地图的文件名
Map2_FileName = "RPG_Resource/xMap/map2_1.ExportJson";		-- 章节2地图的文件名
Map3_FileName = "RPG_Resource/xMap/map3_1.ExportJson";		-- 章节3地图的文件名
Map4_FileName = "RPG_Resource/xMap/map4_1.ExportJson";		-- 章节4地图的文件名
PortalPosition_X = 800;
PortalPosition_Y = 500;
-- UI以及界面配置 end--






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值