// 定义个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--