41.第二阶段x86游戏实战2-C++实现lua寻路
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:40.第二阶段x86游戏实战2-初始lua
上一个内容里写了lua语言的基本语法,本次来用C++调用lua语言
当前靶场游戏采用LuaPlus库实现的lua脚本,所以我们也要用LuaPlus
如下图红框,lib里是通过LuaPlus编译出来的lib文件,这俩东西放到了百度网盘
首先要配置一下环境,如下图
然后在设置一下附加库目录
然后把刚开始的图里的lib目录写上
然后在设置一下附加依赖项,LuaPlus_b.lib是在lib目录里的
代码逻辑,首先在窗口构造函数里初始化lua,目前Init函数没用,LUA_ScriptSystemInitial是有用的
LUA_ScriptSystemInitial函数里,通过Register函数把C++代码注册成一个lua函数,lua函数名是 LUA_Xulu,这样注册完之后
注册完之后可以调用LuaStateOwner类型里的DoFile函数,来执行lua脚本文件
lua脚本文件内容是,首先新加了一个按钮,如下图Lua寻路按钮
Lua寻路按钮的点击事件处理函数里面就是写一个lua脚本文件的绝对路径,然后传给DoFile函数,从而执行Lua代码
1.lua文件里的内容,如下图,就是调用之前使用Register函数注册的函数名
然后LUA_Xulu注册的函数是&CMeLua::LUA_Xulu,下图CMeLua::LUA_Xulu函数的实现,也就是调用之前写的寻路函数
新加ScriptSystem.cpp文件:
#include "pch.h"
#include "ScriptSystem.h"
void CScriptSystem::LUA_ScriptSystemInitial()
{MeLua = new CMeLua;pState = new LuaStateOwner(true);LuaObject objGlobal = (*pState)->GetGlobals();objGlobal.Register("LUA_Xulu", *MeLua, &CMeLua::LUA_Xulu);}
新加ScriptSystem.h文件:
#pragma once
#include "CMeLua.h"
class CScriptSystem
{
public:CScriptSystem() {};~CScriptSystem(){delete pState;delete MeLua;};
public:void LUA_ScriptSystemInitial();void LUA_DoFile(const char* fileName){int s = (*pState)->DoFile(fileName);if (s != 0){string b = (*pState)->ToString(-1);}}
private:CMeLua* MeLua;//声明对象LuaStateOwner* pState;//初始化lua的基本库,才能调用lua函数
};
新加Message.cpp文件:
#include "pch.h"
#include "Message.h"int CMessage::getlua_state()
{return 0;
}int CMessage::InitLuaFun()
{HMODULE LuaPlus = GetModuleHandleA("LuaPlus.dll");if (LuaPlus){g_lplua_dostring = (lplua_dostring)GetProcAddress(GetModuleHandleA("LuaPlus.dll"), "lua_dostring");GLua_Dostring = (Glua_dostring)GetProcAddress(LuaPlus, "lua_dostring");GLua_Gettable = (Glua_gettable)GetProcAddress(LuaPlus, "lua_gettable");GLua_Pushstring = (Glua_pushstring)GetProcAddress(LuaPlus, "lua_pushstring");GLua_Tonumber = (Glua_tonumber)GetProcAddress(LuaPlus, "lua_tonumber");GLua_Tostring = (Glua_tostring)GetProcAddress(LuaPlus, "lua_tostring");GLua_Settop = (Glua_settop)GetProcAddress(LuaPlus, "lua_settop");GpLua_Call = (Gplua_call)GetProcAddress(LuaPlus, "lua_pcall");GLua_Settable = (Glua_settable)GetProcAddress(LuaPlus, "lua_settable");GLua_Pushcclosure = (Glua_pushcclosure)GetProcAddress(LuaPlus, "lua_pushcclosure");GLua_Loadfile = (Glua_loadfile)GetProcAddress(LuaPlus, "luaL_loadfile");Gplua_type = (Glua_type)GetProcAddress(LuaPlus, "lua_type");Gplua_dofile = (Glua_dofile)GetProcAddress(LuaPlus, "lua_dofile");if (GLua_Dostring && GLua_Gettable && GLua_Pushstring&& GLua_Tonumber && GLua_Tostring &&GLua_Settop){return 1;//获取lua函数地址成功}else{return 0;//获取地址失败,模块句柄获取成功}}return -1;//无效模块句柄
}BOOL CMessage::LUAInitialize()
{return 0;
}
新加Message.h文件:
#pragma once
#include "pch.h"typedef int(*Glua_dostring)(int, const char *);//do_string
typedef int(*Glua_pushstring)(int, const char *);//pushstring
typedef void(*Glua_gettable)(int, int);//gettable
typedef double(*Glua_tonumber)(int, double);//tonumber
typedef int(*Glua_settop)(int, int);//settop
typedef const char*(*Glua_tostring)(int, int);//tostring
typedef int(*Glua_pushcclosure)(int, int, int);//
typedef void(*Glua_settable)(int, int);
typedef int(*Glua_loadfile)(int, const char*);
typedef int(*Gplua_call)(int, int, int, int);
typedef int(*Glua_type)(int, int);
typedef int(*Glua_dofile)(int, const char*);class CMessage
{
public:CMessage() {};~CMessage() {};void Init() {//初始化游戏lua函数,lua状态机InitLuaFun();//初始化游戏lua库函数lua_state = getlua_state();//获取游戏lua状态机指针LUAInitialize();};
public:void msg_dostring(const char* _Format, ...);const char* telua_tostring(int n);
private:int getlua_state();BOOL LUAInitialize();int InitLuaFun();//获取lua库函数CCriticalSection m_State;
public:/************************************************************************//* 游戏的lua函数接口定义 *//************************************************************************/int telua_loadfile(const char*file);bool telua_register(const char *FuncName, int pFun);bool telua_dostring(const char * args);bool telua_getglobal(const char*name);double telua_tonumber(int n);bool CMessage::call_dostring(const char * buf);void telua_pop(int n);int msg_getnumber(char* _Format, ...);/************************************************************************//* 游戏的lua函数指针定义 *//************************************************************************/Glua_dostring GLua_Dostring = nullptr;Glua_pushstring GLua_Pushstring = nullptr;Glua_gettable GLua_Gettable = nullptr;Glua_tonumber GLua_Tonumber = nullptr;Glua_settop GLua_Settop = nullptr;Glua_tostring GLua_Tostring = nullptr;Glua_pushcclosure GLua_Pushcclosure = nullptr;Glua_settable GLua_Settable = nullptr;Glua_loadfile GLua_Loadfile = nullptr;Gplua_call GpLua_Call = nullptr;Glua_type Gplua_type = nullptr;Glua_dofile Gplua_dofile = nullptr;int lua_state = 0;//lua状态机指针/************************************************************************//* lua取值的函数 *//************************************************************************/bool telua_getnumber(const char* buf, PVOID out);bool telua_getstring(const char* buf, const char* want_get_string);string msg_getstring(const char * str_arg, char * _Format, ...);typedef int(*lplua_dostring)(int, const char *);lplua_dostring g_lplua_dostring;
};
新加CMeLua.h文件:
#pragma once
#include "pch.h"
#include <LuaPlus.h>
class CMeLua
{
public:CMeLua() {};~CMeLua() {};
public:int LUA_Xulu(LuaState* pState);} ;
新加CMeLua.cpp文件:
#include "pch.h"
#include "CMeLua.h"int CMeLua::LUA_Xulu(LuaState * pState)
{LuaStack args(pState);DWORD x = args[1].GetInteger();DWORD y = args[2].GetInteger();Msg_xl(x, y);return 0;
}
上方的代码不全,只有手写的代码
完整代码:以 它的代码为基础进行修改
链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5
提取码:q9n5
复制这段内容后打开百度网盘手机App,操作更方便哦